Smarty es un motor de plantillas Open Source para PHP que lleva muchos años en el mercado. Con él podremos realizar aplicaciones web de calidad separando el código (PHP) de la presentación (HTML/CSS).

smarty.jpgCuando empezamos a desarrollar con PHP solemos hacerlo usando málas prácticas, como mezclar PHP y HTML/CSS en el mismo fichero. Pero quizás lo hacíamos porque desconocíamos un motor de plantillas tan potente y completo como Smarty.

El lenguaje PHP es completamente abierto, en el sentido de que no requiere desarrollar en alguna arquitectura concreta, sino que un fichero puede contener un millón de líneas con código PHP y código HTML intercalados, lo cual tiene severas desventajas y problemas:

  • Un diseñador tendrá muy difícil manejar el código HTML/CSS de esa página.
  • La escalabilidad es prácticamente nula.
  • Mantener una aplicación así se complica progresivamente.
  • La depuración de ese tipo de aplicaciones se hace muy complicada.

Pero podemos escribir aplicaciones PHP usando motores de plantillas que separan la presentación (HTML/CSS) del código (PHP), solventando de este modo todos esos problemas, y ofreciéndonos además multitud de ventajas adicionales. Este es el caso de Smarty, un motor de plantillas ya veterano en el mercado.

Estas son las funcionalidades que podremos disfrutar con Smarty:

  • Plantillas limpias fáciles de usar por los diseñadores.
  • Escalabilidad.
  • Mantenimiento más sencillo (al igual que la escalabilidad, únicamente con la separación de código y presentación no se consigue un mantenimiento más sencillo, también se requerirá de una buena codificación).
  • Depuración óptima del código, al tener ficheros pequeños únicamente con código PHP.
  • Posibilidad de introducir comentarios dentro de las plantillas que no se enviarán al servidor. Ejemplo: {* comentario smarty *} en lugar de <!-- comentario HTML -->
  • Funciones integradas que facilitan el tratamiento de variables. Ejemplos: {foreach}{/foreach}, {if}{else}{/if}.
  • Funciones asistentes para generación de código HTML. Ejemplos: {html_image file=”banner.jpg”} generaría <img src="banner.jpg" alt="" width="700" height="55" />
  • Expandir Smarty con más funcionalidades mediante plugins.

Veamos un sencillo ejemplo de una aplicación hecha con Smarty:

index.php

<?php
include('libs/Smarty.class.php'); 
$frutas = array(
      array(
            'name'  => 'malus rosaceae',
            'url'  => 'http://es.wikipedia.org/wiki/Manzana',
            'image'  => 'http://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Fuji_apple.jpg/200px-Fuji_apple.jpg'
      ),
      array(
            'name'  => 'fragaria',
            'url'  => 'http://es.wikipedia.org/wiki/Fresa',
            'image'  => 'http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Chandler_strawberries.jpg/225px-Chandler_strawberries.jpg'
      ),
      array(
            'name'  => 'citrus sinensis',
            'url'  => 'http://es.wikipedia.org/wiki/Naranja_%28fruta%29',
            'image'  => 'http://upload.wikimedia.org/wikipedia/commons/thumb/4/42/Citrus_sinensis.jpg/300px-Citrus_sinensis.jpg'
      ),
);
$frutas_list = array('manzana','fresa','naranja'); 
$tpl = new Smarty();
$tpl->template_dir = './';
$tpl->compile_dir = './';
$tpl->config_dir = './';
$tpl->cache_dir = './'; 
$action = isset($_GET['action']) ? $_GET['action'] : 'list';
switch ($action) {
      case 'list':
            $tpl->assign('frutas',$frutas_list);
            $tpl->display('list.tpl');
            break;
      case 'detail':
            $id = isset($_GET['id']) ? intval($_GET['id']) : 0;
            $tpl->assign('fruta', $frutas[$id]);
            $tpl->display('detail.tpl');
            break;
} 

Con esta aplicación necesitaremos dos plantillas: list.tpl y detail.tpl

list.tpl

<html>
<head>
      <title>Listado de frutas</title>
</head>
<body>
<form>
      {* Con esta sentencia crearemos el HTML de un SELECT/OPTION *}
      {html_options options=$frutas name=id}
      <input type='hidden' name='action' value='detail' />
      <input type='submit' value='Ver' />
</form>
</body>
</html> 

detail.php

<html>
<head>
      <title>{$fruta.name}</title>
</head>
<body>
      <h1>{$fruta.name}</h1>
      <a href="{$fruta.url}"><img src="{$fruta.image}" /></a>
      <br />
      <a href=?action=list>Volver</a>
</body> 

Alternativa a Smarty

Otra opción totalmente válida es usar nuestro propio motor de plantillas, útil por ejemplo para proyectos pequeños que no requieran de todas las funcionalidades que ofrece Smarty.

TemplateEngine.class.php

?php
define('TEMPLATES_DIR', './templates/');
class TemplateEngine extends stdClass {
      public function fetch($__tpl) {
            foreach (get_object_vars($this) as $__name=>$__value) {
                  $$__name = $__value;
            }
            require(TEMPLATES_DIR . $__tpl);
      }
} 

index.php

<?php
include('TemplateEngine.class.php');
$tpl = new TemplateEngine();
$tpl->frutas = array('manzana','pera','fresa','platano','mandarina');
$tpl->fetch('ficha.tpl'); 

Lo que en Smarty sería algo como:

<?php
include('Smarty.class.php');
$smarty = new Smarty(); 
$smarty->assign('frutas', array('manzana','pera','fresa','platano','mandarina')); 
$smarty->display('ficha.tpl'); 

./templates/ficha.tpl

<html>
<head>
      <title>Sistema de plantillas sin Smarty</title>
</head>
<body>
      <ul>
      <?php foreach ($frutas as $fruta) : ?>
            <li><?=$fruta?></li>
      <?php endforeach; ?>
      </ul>
</body>
</html> 

Equivalente a la plantilla Smarty:

<html>
<head>
      <title>Sistema de plantillas sin Smarty</title>
</head>
<body>
      <ul>
      {foreach from=$frutas item=fruta}
            <li><{$fruta}</li>
      {/foreach}
      </ul>
</body>
</html>

Ya no hay excusa para hacer una aplicación web en PHP de calidad. Con un motor de plantillas como Smarty podremos crear una aplicación profesional invirtiendo muy poco tiempo.

Referencia: