jueves, 13 de diciembre de 2007

Plantillas en PHP (II)

Hemos visto en el anterior post que no es necesario aprender la sintaxis de ningún lenguaje de plantillas para poder trabajar con ellas. Una sintaxis reducida del PHP será más que suficiente para disfrutar de sus ventajas.


En este post vamos a definir la clase Template; a través de un objeto de esta clase se carga la plantilla y se le da valores a las variables:

<?php
class Template{
private $VARS=array();
private $archivo;

function __construct($archivo){
$this->archivo=$archivo;
}
//establecemos las variables simples de la plantilla
public function set($nombre,$valor){
if($valor===NULL) unset($this->VARS[$nombre]);
else $this->VARS[$nombre]=$valor;
}
public function setArray($nombre,$valor){
if(empty($this->VARS[$nombre])) $this->VARS[$nombre]=array();
$this->VARS[$nombre][]=$tmp;
}
public function get($nombre){
return $this->VARS[$nombre];
}

public function dump($buffer=false){
if($buffer) ob_start();
if(!empty($this->VARS)) foreach($this->VARS as $variable=>&$valor)
$$variable=$valor;
include($this->archivo);
if($buffer) return ob_get_clean();
}

function __clone() {
foreach($this->VARS as $k=>$v)
if(is_object($v)) $this->VARS[$k]=clone $this->VARS[$k];
}
}
?>

Veamos como utilizarla. Supongamos que hemos guardado la plantilla del anterior post en el archivo "miPlantilla.phpt" si queremos ponerle el título solo tendremos que hacer:

<?php
$miPlantilla=new Template("plantillas/miPlantilla.phpt");
$miPlantilla->set("TITULO","KROWORK: Anotaciones de PHP");
?>

Ahora veamos como crear el array $DATOS de la plantilla a partir de una consulta a la base de datos:

$result=mysql_query("SELECT micampo1 as CAMPO1, micampo2 as CAMPO2 FROM mitabla");
while($obj=mysql_fetch_object($result)) $miPlantilla->setArray("DATOS",$obj);
?>

Y por último mostramos los datos:

<?php
@$miPlantilla->dump();
?>

Utilizamos @ para ocultar los posibles errores/warnings de la plantilla, ya que va a ser habitual que para simplificar comprobemos la existencia de las varibles con una expresión del tipo: <? if($VAR): ?> ... <? endif ?>. Si no hemos definido $VAR se producirá un warning que de esta forma no se mostrará aunque tengamos el reporte de errores al máximo. Evidentemente mientras probamos la plantilla no pondremos la @ para poder detectar los errores.

Como dije en el post anterior, no es raro crear plantillas con archivos xml's. La construcción de un xml nodo a nodo a través de la extensión DOM de PHP es enormemente tediosa. Una forma mucho más fácil de hacerlo es creando una plantilla (ojo: si utilizas short tags deberás hacer uso del truco del post anterior), rellenarla y al final:

<?php
file_put_contents("mi_nuevo_archivo.xml",$miPlantilla->dump(true));
?>

Al pasar true al método dump() hacemos que en lugar de mostrarse el resultado se devuelva en forma de string.

Como vemos las plantillas son muy versátiles, muy fácil de usarlas, de crearlas y al estar escritas en PHP su procesamiento es de lo más rápido que os podais encontrar. Hasta la próxima.

No hay comentarios: