Templates nativos en PHP con Plates. Descripción, características y primeros pasos con Plates, el sistema de plantillas para PHP.
Las plantillas o en inglés templates es uno de los componentes típicos de una aplicación web. En PHP hay diversas librerías de plantillas y muchas muy populares como Smarty. En esta ocasión vemos un sistema de plantillas no tan popular pero que es bastante potente, sencillo y rápido.
Cuando trabajamos con sistemas de plantillas a veces tenemos que aprendernos nuevas sintaxis para realizar las operaciones típicas con las plantillas, inyección de datos en ellas, iteración sobre estructuras como arrays, etc. La sintaxis del sistema de plantillas suele ser diferente de la del propio lenguaje donde estamos trabajando y aunque eso generalmente tampoco es un problema muy serio (pues siempre esa sintaxis es sencilla y fácil de memorizar) obliga a que las plantillas se deban compilar antes de ser usadas.
En el caso de "Plates" tenemos un sistema de plantillas PHP nativo. Esto es, un sistema que no implementa nueva sintaxis, sino que usa la propia sintaxis y estructuras de control de PHP para poder expresar las operaciones típicas. Por tanto, tampoco requiere compilación de las plantillas como Twig o Smarty.
Su nombre viene de temPLATES y podemos encontrarlo en esta dirección: http://platesphp.com/
Es una solución ideal para todos los que prefieran expresar las plantillas con PHP, pero sin renunciar a funcionalidades de sistemas de plantillas avanzados. Está inspirado en Twig, el motor de plantillas de Symfony. Es rápido y te ayuda a solucionar diversas necesidades sin demasiadas complicaciones, léase:
- Herencia en plantillas
- Creación de múltiples layouts
- Organización de las plantillas en directorios con espacios de nombres
- Envío de datos a las plantillas y posibilidad de compartirlos entre varias
- Extensibilidad por funciones o grupos de funciones (extensions)
- Funciones de escape para los datos volcados en las plantillas
- Independiente del framework o aplicación, adaptable a cualquier proyecto.
Instalación de PlatesPHP
La manera recomendada de instalar esta librería de plantillas es a través de Composer, donde será tan sencillo como indicar la dependencia. Lo encuentras en Packagist en esta URL: https://packagist.org/packages/league/plates
Solo tienes que agregar el require en tu composer.json. ("league/plates": "3.*")
Lo importante que debes haber aprendido en ese manual es cómo activar el sistema de autoload de composer en el código PHP, simplemente haciendo un require del archivo situado en vendor/autoload.php.
require "../vendor/autoload.php";
Una vez activado el sistema de autoload de Composer, podremos acceder a las dependencias instaladas desde cualquier parte del código, siempre que usemos correctamente su espacio de nombres (namespace).
Usar el sistema de plantillas Plates
Ya instalada la dependencia (e invocado el autoload de Composer), para comenzar a usar tus templates debes instanciar la clase Engine, de la que depende todo el motor de plantillas.
$templates = new League\Plates\Engine( 'ruta/a/las/plantillas');
Como ves, al instanciar el Engine le debes indicar la ruta donde están tus plantillas.
Si todas las plantillas las tienes en el mismo directorio, o subdirectorios de éste, ya lo tienes listo. Pero si acaso las prefieres organizar por diferentes directorios en rutas dispersas, no tienes más que agregarlos en el Engine.
$templates->addFolder('espacio_nombres_plantillas', 'otra/ruta/diferente');
Para ejecutar un template tenemos que indicar qué plantilla queremos renderizar. Hay diversas maneras, pero la más rápida es simplemente usar el método render() del Engine, indicando el nombre de la plantilla y los datos que le queramos enviar.
$templates->render("plantilla_a_renderizar", ["dato" => "Valor del dato"]);
La plantilla que se espera "plantilla_a_renderizar" tiene extensión ".php", pero podríamos modificarla si se desea, pero como ves, no hace falta indicar el ".php" en el nombre de la plantilla a invocar. Si la plantilla está en un subdirectorio puedes indicarlo con una barra.
$templates->render("subcarpeta/plantilla_a_renderizar");
Como ves, los datos que se envían a la plantilla se indican solo de manera opcional. Es decir, si no tenemos que enviarle datos, no necesitamos decirle nada. Los datos que llegan al script de la plantilla los encontrarás en el scope global, es decir, como si fueran variables globales.
Si la plantilla está en otra carpeta de las que guardaste con addFolder(), indicas el espacio de nombres de esa ruta con "::" separando al nombre de la plantilla que buscas.
$templates->render('espacio_nombres_plantillas::plantilla_a_renderizar');
Uso de Layouts
Generalmente todo sitio web tiene una cabecera y un pie. Con los layouts puedes conseguir que toda la estructura de la página (tanto la cabecera como el pie) estén en el mismo archivo.
Aquí puedes ver un layout: (archivo milayout.php)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>titulo de la empresa</title>
</head>
<body>
<header>
Logo de la empresa
</header>
<?=$this->section('content')?>
<footer>
Enlaces del pie
</footer>
</body>
</html>
Como ves, el bloque $this->section('content') es lo que se colocará como cuerpo de la página para este layout.
Ahora puedes ver una plantilla que usa este layout.
<?php $this->layout('milayout') ?>
<p>Este es el cuerpo para esta página.</p>
<p>Me gusta PlatesPHP</p>
Con la primera línea $this->layout('milayout') estamos indicando que el HTML del layout que se va a usar está en milayout.php. El resto del documento es el cuerpo que se colocará en el template, una vez aplicado el layout.
Conclusión
Antes de acabar queremos facilitarte un enlace a un repositorio de GitHub donde hemos colocado código de ejemplo que trabaja con el sistema de templates PHP Plates y usa un layout. Es un proyecto muy simple, pero que puede darte una idea más global sobre cómo organizar tus plantillas. Lo encuentras en https://github.com/deswebcom/plates-example
Con este artículo te hemos contado muy muy por encima lo que se puede hacer con Plates y te hemos dado una de las muchas alternativas que existen para producir HTML a base de plantillas. Pero este artículo no te debe confundir, si quieres profundizar en Plates verás que el template system se puede hacer mucho más complejo. Es sencillo para quienes están comenzando con sistemas de plantillas en PHP, pero suficientemente avanzado para los que quieren aprovechar características avanzadas típicas de los motores de templates modernos.
El sitio de plates está bien documentado y es sencillo de leer y aprender sobre la marcha aquello que necesitamos. Solo falta un poco más de comunidad y tutoriales de terceras personas para aclarar posibles dudas.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...