martes, 8 de enero de 2013

Herramientas de programación web: Smarty

En este primer artículo del año y dentro de la serie de herramientas de programación web hoy quería hablar de una herramienta que he conocido hace poco: Se trata de Smarty, una librería de plantillas para PHP. Smarty permite separar totalmente el código PHP de la presentación (HTML/CSS) dentro de un proyecto. Normalmente cuando usamos un framework MVC como CodeIgniter el propio entorno ya nos separa la vista (HTML/CSS) del modelo y los controladores (PHP). Aun así una herramienta como Smarty podría ser muy útil en proyectos más pequeños o en aquellos donde el uso de un framework esté desaconsejado.

Smarty es Open Source y lleva varios años en el mercado. Su uso ayuda a evitar malas prácticas comunes, como mezclar PHP y HTML/CSS en el mismo fichero y permite separar los roles de programador y diseñador dentro de un proyecto, aumentando así la escalabilidad del mismo.

Como opinión personal, prefiero un MVC más tradicional, pero según he podido investigar parece ser que Smarty funciona muy bien. Lo único que suelen comentar sus detractores es que la librería es un poco demasiado pesada y si no se va con cuidado tiende a ralentizar la ejecución del código. Además requiere el aprendizaje de un nuevo pseudolenguaje a añadir a los PHP, HTML, CSS, Javascript, jQuery,...

Usando Smarty dividiremos el código fuente en dos archivos: Un archivo .php conteniendo la lógica de negocio y un archivo .tpl conteniendo la plantilla. En el modelo MVC el primero equivaldría al controlador y el segundo a la vista. La plantilla no debería incluir absolutamente nada de código PHP. Veamos un ejemplo de un controlador con dos vistas.


Ejemplo

Supongamos que tenemos una clase llamada Productos que tiene las funciones listarProductos() y datosProducto($id). Ambas funciones devuelven un array conteniendo los campos id, nombre, descri y precio. No voy a poner el código fuente de esa clase. Nuestro controlador tendrá dos modos de funcionamiento:

  1. Si no recibe parámetros $_GET, listará todos los productos.
  2. Si recibe el ID del producto, mostrará los datos de ese producto.

Código fuente de productos.php:

<?php
include('libs/Smarty.class.php');
include('Productos.class.php');

$smarty = new Smarty();
$productos = new Productos();

$id = isset($_GET['id']) ? $_GET['id'] : null;
if($id == null) {

  $lista = $productos->listarProductos();
  $smarty->assign('productos', $lista);
  $smarty->display('lista_productos.tpl');
}
else {

  $datos = $productos->datosProducto($id);
  $smarty->assign('producto', $datos);
  $smarty->display('datos_producto.tpl');
}

Código fuente de lista_productos.tpl:

<html>
<head>
  <title>Listado de productos</title>
</head>
<body>
  <h1>Listado de productos</h1>
  <ul>
  {foreach from=$productos item=producto}
    <li>
      <a href="?id={$producto.id}">
        {$producto.nombre}
      </a>
    </li>
  {/foreach}
  </ul>
</body>
</html>

Código fuente de datos_producto.tpl:

<html>
<head>
  <title>{$producto.nombre}</title>
</head>
<body>
  <h1>{$producto.nombre}</h1>
  <p>
    {$producto.descri}
  </p>
  <p>
    Precio: {$producto.precio}
  </p>
</body>
</html>

Este es un ejemplo muy sencillo en el que hemos omitido totalmente el control de errores, pero sirve para explicar como funciona Smarty. Como vemos cada una de las plantillas (archivos .tpl) contiene instrucciones especiales en un pseudolenguaje que permite representar variables y ciertas sentencias de control (if, while, foreach, etc) y en cambio no contiene nada de código PHP. Todas las instrucciones especiales se escriben directamente dentro del código HTML encerradas entre llaves.


Enlaces de interés y referencias

No hay comentarios:

Publicar un comentario