Smarty

RECU-0272 (Recurso Ficha Técnica)

Descripción

Smarty es un motor de plantillas para PHP. Smarty separa el código PHP, de la lógica de negocios, del código HTML, así como la lógica de presentación, y genera contenidos web mediante la colocación de etiquetas Smarty en un documento. Se encuentra bajo la licencia LGPL por lo que puede ser usado libremente.

Es común que en grandes proyectos el rol de diseñador gráfico y el de programador sean cubiertos por personas distintas, sin embargo la programación en PHP tiene la tendencia a combinar estas dos labores en una persona y dentro del mismo código, lo que trae consigo grandes dificultades a la hora de cambiar alguna parte del diseño de la página, pues se tiene que modificar entre los scripts para modificar la presentación del contenido. Smarty tiene como objetivo solucionar este problema.

Ejemplo de uso

A continuación presentamos un ejemplo:

<?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

<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>

y ahora el detail.tpl.

<html>
<head>
      <title>{$fruta.name}</title>
</head>
<body>
      <h1>{$fruta.name}</h1>
      <a href="/servicios/madeja/%7B%24fruta.url%7D"><img src="/servicios/madeja/%7B%24fruta.image%7D" /></a>
      <br />
      <a href=?action=list>Volver</a>
</body>

Ventajas e inconvenientes

Estas son las funcionalidades que ofrece Smarty:

  • Utilización de plantillas sencillas para el uso por parte de los diseñadores.
  • Mejora la escalabilidad de las aplicaciones .
  • Facilita el mantenimiento del código. Éste es más legible y eficiente.
  • 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 la generación de código HTML.
Ejemplos: {html_image file=”banner.jpg”} generaría \<img src="/servicios/madeja/banner.jpg" alt="" width="700" height="55" />\
  • Expandir Smarty con más funcionalidades mediante plugins.

También el uso de Smarty provoca inconvenientes:

  • Tiene un problema importante de rendimiento. Con el uso de plantillas de tags (TPL) se esta añadiendo un lenguaje más a procesar e interpretar desde PHP. Smarty es un sistema escrito en PHP con miles de lineas de código pues, a parte de tener que incluirlas en la aplicación, desde PHP se va a interpretar este pseudo-lenguaje de las TPL. Para paliar esto, Smarty compila las plantillas para no tener que parsearlas cada vez. Gracias a esto es uno de los interpretes más rápidos, pero cada vez que se cambien las TPL se tendrán que parsear y se ha de tener en cuenta que el código que genera siempre será peor que el que se haría directamente en PHP.

Requisitos e incompatibilidades

  • Smarty Requiere un servidor web con PHP 4.0.6 o posterior.
  • Es necesario instalar los archivos de la librería de Smarty que están en el directorio de distribución /libs/. Estos son los archivos PHP que NO EDITARÁ. Estos archivos son toda las aplicaciones comunes y son actualizados cuando se actualiza a una nueva versión de Smarty.
Smarty.class.php
Smarty_Compiler.class.php
Config_File.class.php
debug.tpl
/internals/*.php (todos ellos)
/plugins/*.php (todos ellos)

Contenidos relacionados

Pautas
Área: Desarrollo » Librerías y Módulos » PHP
Código Título Tipo Carácter
LIBP-0350 Librerías para aplicaciones PHP Libro de pautas Directriz Recomendada