Una de las cosas que menos me gustan de los lenguajes de programación web (en este caso PHP pero aplicable a todos) es la ilegible mezcla que puedes acabar teniendo entre HTML y el lenguaje en cuestión si no eres un poco metódico (que deberías). Cada vez que abro un .php ajeno y veo multitud de echo con código HTML perdidos por mitad del código PHP me dan los siete males.
Este coñazo en el que se puede convertir el PHP se viene solventando en gran medida con la implantación por un lado de template engines y también de frameworks que aplican el patrón MVC. De hecho, el uso de frameworks ya te determina que se van a seguir una serie de buenas prácticas de diseño, al integrar muchos principios y patrones con ese propósito.
Pero puede darse perfectamente el caso en el que usar un framework esté sobredimensionado para el proyecto en cuestión. O incluso usar un sistema de plantillas como Smarty sea demasiado, a saber: quizás porque no tengas tiempo para aprender una nueva sintaxis únicamente para las plantillas, quizás porque no puedas permitirte la pérdida de rendimiento que supone procesar las plantillas o simplemente porque no te dé la gana. Vale, te acabo de dar excusas para seguir guarreando a machete, pero calla y sigue leyendo.
Sea como sea, lo que buscamos de una forma simple y directa es separar la lógica de negocio (business logic) de la presentación. Ojo con esto, no se trata de separar (x)HTML de PHP, sino de separar la parte de PHP que controla como se van a presentar los datos (usando (x)HTML para la presentación), de la parte de PHP que controla todo lo demás (la lógica de negocio que comentábamos).
Y aquí vienen las buenas noticias: para esto puedes simplemente usar PHP. Como lo oyes. PHP puro y duro. Mala suerte, te acabo de dejar sin excusas, pero es así. A partir de ahora tendrás que dejar de picar codigo guarrindongo, para pasarte al lado pulcro y ordenado!
Ejemplos
Un ejemplo de plantilla usando PHP nativo (tpl/errors.tpl):
<h2><?=$title;?></h2>
// ejemplo de estructura de control
<?php if ($errors): ?>
<div id="errors">
<h3>Errors found:</h3>
<em>(Tip: you can click on the error message to go
to the affected input)</em>
<ul id="errorList">
// ejemplo de bucle foreach
<?php foreach ($errors as $error): ?>
<li><label for="<?=$error['label'];?>">
// acceso a estructuras
<?=$error['message'];?></label></li>
<?php endforeach; ?>
</ul>
</div> <!– errors –>
<?php endif; ?>
La página en sí (errors.php):
<?php
require_once(dirname(__FILE__) . "/src/classTemplate.php");
// Cargamos la plantilla con el layout general
$mainTpl =& new Template(’./tpl/main.tpl’);
// con set(nombreVar, contenido) fijamos las variables del template
$mainTpl->set(’title’,"Home");
$mainTpl->set(’cssFile’,"home.css");
//Cargamos una nueva plantilla para el contenido
$subTpl =& new Template(’./tpl/errors.tpl’);
// aquí iría la business logic ya mencionada
…
$subTpl->set(’errors’,getErrors($form));
$mainTpl->set(’subContent’,$subTpl);
// fetch() saca la plantilla con las variables sustituidas
echo $mainTpl->fetch();
?>
¿Fácil eh? Como se ve, es PHP tal cual, sin más misterio. ¿Y dónde están las llaves? se preguntará algún avispado listillo. Pues es otra notación alternativa que tiene el lenguaje para las estructuras de control y que personalmente para el uso de templates me parece más clara que las llaves. En el manual oficial de PHP puedes leer más.
Conclusión: Templatizarse o morir
Pues ya sólo te falta bajarte la clase Template que encontrarás en el artículo Template Engines, de Brian Lozzer, en el que además encontrarás ejemplos más extensos que los que yo he puesto aquí. Como ya has visto no es nada misterioso, ni tienes que aprender una nueva sintaxis ni nada.
Asi que… ¿a qué esperas? Templatízate. ¡Templatízate ahora mismo! Es fácil, indoloro y ganarás en calidad de vida. Por no hablar de la cantidad de odios ajenos que te ahorrarás cuando a alguien en el futuro le toque mantener tu código.
Compártelo
May 30th, 2007 | PHP, Programación, Web |
[...] pero que cumplía muy bien su finalidad: que la gente se descargase el juego. Gestionada mediante PHP y plantillas nativas para mantener bien separaditos contenido y lógica, no necesitaba hacer uso de base de datos y fue [...]
Pingback by Fregocles y la desinfección del Olimpo » Entrada » La importancia de una buena web — 11-10-2007 @ 13:29