Curso de PHP VI. De Plantillas y demases, parte 1: el enfoque KISS

Un viejo tema en todo foro de discusión que se precie de PHP es el uso de plantillas. En la Tercera parte del curso me di la lata de explicar el porque del uso de plantillas, las ventajas de separar la presentación del contenido y hasta di un ejemplo completo.

Como el tiempo pasa, cada vez me doy cuenta de la importancia de saber ocupar el nivel de complejidad estrictamente necesario para cada proyecto. Me gusta mucho el principio KISS de los gringos, que sería algo así como "Manténlo simple, estúpido!". Por algo mi odio inveterado a Smarty, el mayor monstruo en lo relacionado a plantillas que he podido ver. Pero ya habrá tiempo de explicar porque es tan malo :P

¿A que iba todo esto? A que si hacemos memoria, PHP ES UN LENGUAJE DE PLANTILLAS. Nació, precisamente, para ser usado como un lenguaje embebido dentro de páginas HTML. No reniego del uso de plantillas decentes (a mi me gusta particularmente Xipe), pero hay que saber cuando ocupar que tipo de plantillas en que momento. A grandes rasgos, existen dos tipos de sistemas, aparte del propio PHP. El primer tipo es el basado en la compilación de php, en el cual se genera código en forma dinámica a partir de la plantilla básica; tiene la ventaja de que es muy rápido, ya que al fin y al cabo, utiliza todos los recursos de php como sistema de plantillas, pero es susceptible a exploits si se logra manipular la generación de código para producir algún tipo de ataque. El segundo tipo está basado en el procesamiento de la plantilla por expresiones regulares; si bien es lento, ya que implica un procesamiento intento de cadenas, tiene la gran ventaja de ser casi invulnerable a cualquier tipo de ataque.

Ahora, en un proyecto simple, ¿para que calentarse la cabeza? Ocupemos el viejo include, dentro de una clase que nos permita mayor comodidad.

Observen el siguiente código:

Plantilla.class.php

  1.  <?php
  2.   class Plantilla {
  3.   var $sRoot;
  4.   function Plantilla($sRoot)
  5.   {
  6.   if (substr($sRoot, -1) == '/') {
  7.   $sRoot = substr($sRoot, 0, -1);
  8.   }
  9.   echo $sRoot;
  10.   $this->sRoot = $sRoot;
  11.   }
  12.   function obtener($sFile, $aVars)
  13.   {
  14.   extract($aVars);
  15.   ob_start();
  16.   $sPath=$this->sRoot.'/'.$sFile;
  17.   if(!file_exists($sPath)) {
  18.   trigger_error("No existe la plantilla $sFile",E_USER_ERROR);
  19.   } else {
  20.   include ($sPath);
  21.   $sOut = ob_get_contents();
  22.   ob_end_clean();
  23.   return $sOut;
  24.   }
  25.   }
  26.   }
  27.  ?>

¿Ven? Nada más simple. El objeto plantilla tiene como única propiedad el directorio base de las carpetas y con el método obtener, obtenemos el texto de la plantilla, el cual puede tener todo el php que queramos.

Ahora, las 2 plantillas de ejemplo

Cabecera.tpl

  1.  <html>
  2.  <title><?php foreach($a as $i=>$x) { echo '['.$i.'-'.$x.']'; } ?></title>

cuerpo.tpl

  1.  <body>
  2.  <table>
  3.  <?php foreach($b as $i) { ?>
  4.   <tr><td><?=$i?><td></tr>
  5.  <? } ?>
  6.  </table>
  7.  </body>
  8.  </html>

Como pueden apreciar, pido dos arreglos, uno llamado $a y el otro $b. Démosle valores:

test.php

  1.  <?php
  2.  include_once("Plantilla.class.php");
  3.  $p=new Plantilla('./');
  4.  $a=array('a'=>'la letra a','b'=>'la letra b','c'=>'la letra c');
  5.  $b=array("primer item","segundo item","tercer item");
  6.  $texto2=$p->obtener('cuerpo.tpl',compact('a','b'));
  7.  $texto1=$p->obtener('cabecera.tpl',compact('a','b'));
  8.  echo $texto1;
  9.  echo $texto2;
  10.  ?>

Ven? El mínimo código necesario, y tenemos completamente separados el código de las plantillas. Ok, sé que si pasan una variable errónea les van a aparecer Notices o incluso Warnings hasta por las orejas, pero si están armando un pequeño foro, ¿para que quieren algo más complejo?

KISS, baby, KISS

En las siguientes sesiones, veremos otros sistemas de plantillas para las cosas que sean más grandes que un FAQ

AdjuntoTamaño
plantilla_simple.tgz804 bytes
icono de usuario

quisiera saber mas sobre las plantillas php.
¿como se crean?
¿para que nos sirven?
¿como se modifican?
etc...

Enviado por NEFTALI BIÑUELO (no verificado) el Lun, 03/03/2008 - 13:06.
icono de usuario

Me parece mu buena y un codigo bastante limpio.
encontre un pequeño error, por algun motivo no me funciona la cabecera, no imprime.

Enviado por Perijilillo Desconocido (no verificado) el Sáb, 02/04/2005 - 15:17.
icono de usuario

cuando iniciaste estos cursos que no me dí cuenta?? :'(

Enviado por Jesus Sanchez (no verificado) el Sáb, 02/04/2005 - 19:21.
Imagen de clbustos

Perijilillo: Gracias. Sobre la cabecera, no debería aparecer en el cuerpo, porque es precisamente la cabecera. Ve si el título de la página dice '[a-la letra a][b-la letra b][c-la letra c]'
Jesús: A principios del año pasado hice un pequeño curso en la UBB. De los apuntes de clases hice el curso. Ahora lo estoy continuando....

Enviado por clbustos el Dom, 03/04/2005 - 01:48.
icono de usuario

Empece a quedarme ciego tienes toda la razon.
Voy a usar este tipo de plantilla para un sistema de mailing que hare.
Ah ojala mas adelante puedas publicar algo sobre Xipe quizas un pequeño manual como este.

Saludos

Enviado por Perijilillo Desconocido (no verificado) el Dom, 03/04/2005 - 12:38.
Imagen de clbustos

Je, que bueno que te sirva. Si tu sistema es simple y quieres algo rápido, ocupa esta forma.
Me leíste la mente. Después de tratar IT y Sigma, me iré con Xipe y Savant. Smarty lo dejo para el final, no por lo bueno, sino por que quiero alejar ese momento de mi mente....

Enviado por clbustos el Lun, 04/04/2005 - 02:27.
icono de usuario

El enfoque que propones lo he visto varias veces, empezando con el Savant y otros.

Sin embargo lo único que veo de ventaja en una maquinaria de templates más "robusta", es la posibilidad de abstraer varios elementos, principalmente de formularios HTML a componentes que se pueden configurar, más o menos como lo que tiene ASP.NET.

El sistema WACT funciona así y me parece que mientras se pueda mantener clara la separación entre lógica de negocio y de presentación, está bien.

Enviado por Manolo Gómez (no verificado) el Jue, 07/04/2005 - 00:37.
Imagen de clbustos

Estoy en general de acuerdo contigo, pero hay dos casos particulares en que un sistema como este no sería adecuado:
1) Diseñadores que trabajan exclusivamente con WYSWYG
2) Plantillas editables por usuarios.
En ambos casos, es necesario evitar a toda costa ocupar código PHP directo, en el primero por la congénita inhabilidad de los diseñadores para entender algo que huela a código y, en la segunda, por los posibles escapes de seguridad. En este tipo de situaciones, recomendaría un sistema basado en expresiones regulares, tipo Template_IT.

Enviado por clbustos el Jue, 07/04/2005 - 18:08.
Imagen de clbustos

Je. Me gusta ver que cuando gente más lista que yo llega a las mismas conclusiones.
http://www.massassi.com/php/articles/template_engines/
Fijense que el código de la clase Template es casi el mismo, sólo que yo prefiero, por flojera, utilizar un extract para evitar el uso masivo de set(). Eso sí, el uso de esta función permite reconocer más fácilmente las variables involucradas. Ahora, no cuesta nada tener la plantilla y el código php abierto para ver cual variable hace que cosa y, mejor aún, crear un comentario al inicio que diga cual es la función de cada variable.

Enviado por clbustos el Vie, 08/04/2005 - 01:14.

Enviar un comentario nuevo

El contenido de este campo se mantiene como privado y no se muestra públicamente.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato