Siguiendo con nuestra serie de artículos: Smarty: razones para utilizar plantillas en mis proyectos, Smarty: requerimientos, instalación y aprende a programar, ahora nos corresponde hablar sobre Smarty pero a nivel avanzado. Smarty cuenta con estructuras de control propias, cuando compilamos nuestra plantilla, verificará que no haya sido procesada antes, haciendo que la carga sea más rápida.

En la carpeta definida para los archivos compilados de las plantillas encontraremos el código PHP. Lo que demuestra que aunque la plantilla original tenga una sintaxis distinta, el archivo generado y ejecutado es un archivo PHP.

Calificadores Smarty

En todo lenguaje existen los calificadores, que permiten hacer comparaciones entre variables. Smarty tiene los propios un tanto distintos a los que estamos acostumbrados:

Tabla: para los operadores lo recomendable es utilizar las alternativas, pero también es permitido utilizar los calificadores originales. Para los operadores AND / OR puede utilizarse el operador lógico (and / or) o && (and) / | | (or).

Estructuras de control en Smarty

Sentencia IF: 
{if $name eq "Fred"}
      Welcome Sir.
{elseif $name eq "Wilma" or $name eq "Vilma"}
      Welcome Ma'am.
{else}
      Welcome, whatever you are.
{/if} 

Sentencia SECTION:

Las section del template son usadas para realizar un ciclo (loop) de un arreglo de datos. Todas las etiquetas {section} deben tener su par {/section}. Los parámetros requeridos son name y loop. El nombre de la section puede ser el que usted quiera, formado por letras, números y subrayados.

Las sections pueden ser anidadas pero diferenciando unas de otras. Las variables del loop (normalmente una matriz de valores) determina el número de veces del loop de la section.

Cuando estuviera mostrando una variable dentro de una section, el nombre de la section debe estar al lado de la variable dentro de corchetes []. sectionelse es ejecutado cuando no hubiera valores para la variable del loop(ciclo).

<?php
      $data = array(1000,1001,1002);
      $smarty->assign('custid',$data);
?> 
{* este ejemplo imprime todos los valores del arreglo *} 
{section name = customer loop = $custid}
      id: {$custid[customer]} <br />
{/section} 
<hr />
{* imprime todos los valores del arreglo en orden descendente *} 
{section name=foo loop=$custid step=-1}
      {$custid[foo]} <br />
{sectionelse}
      no hay valores en la variable
{/section} 

También, puede hacerse un ciclo sin un arreglo para tratar. Este ejemplo iniciará el contador en 10 e irá de 2 en 2 hasta el número 20:

{section name = foo start = 10 loop = 20 step = 2}
      {$smarty.section.foo.index}
{/section} 

Sentencia FOREACH:

Los ciclos foreach son una alternativa para loop {section}. Foreach es usado para pegar cada elemento de una matriz asociativa simple. La sintaxis para foreach es mucho más simple que section, pero tiene la desventaja de que solo puede ser usada en una única matriz, la etiqueta {foreach} debe tener su par {/foreach}.

Los parámetros requeridos son from e item, el nombre del ciclo foreach puede ser cualquier cosa que usted quiera, hecho de letras, números y subrayados. Los ciclos foreach pueden ser anidados, y el nombre de los ciclos anidados, debe ser diferente uno de otro. La variable from (normalmente una matriz de valores) determina el número de veces del ciclo foreach, el cual será ejecutando cuando no hubiran más valores en la variable from.

<?php
      $arr = array( 1001,1002,1003);
      $smarty->assign('custid', $arr);
?> 
{* este ejemplo muestra todos los valores de la matriz $custid *} 
{foreach from = $custid item = curr_id}
      id: {$curr_id}<br />
{/foreach} 

Recordemos que para arreglos asociativos, el signo de separación es el punto ( . ). Además, existe un conjunto de propiedades disponibles dentro del ciclo, como el número de interacción, la llave asociativa, etc.

Otras funciones dentro de la plantilla Smarty:

Smarty tiene un conjunto de funciones integradas bastante grandes, enumerar cada una de ellas con sus características y mostrar un ejemplo, haría que este artículo fuese demasiado extenso. A continuación, muestro un listado de algunas funciones interesantes y una pequeña descripción:

  • include_php: Incluye un archivo PHP dentro de la plantilla. Util para obtener información de otros recursos.
  • capture: es usado para recolectar toda la salida del template en una variable en lugar de mostrarla.
  • ldelim, rdelim: son usados para escapar delimitadores en el template, en nuestro caso “{” or “}”.
  • literal: permite que un bloque de texto sea tomado literalmente, no siendo interpretado por Smarty.
  • php: incrusta código PHP dentro de la plantilla. No recomendado.
  • assign: Es usado para definir valores a las variables de template durante la ejecución del template.
  • cycle: es usado para hacer un ciclo a través de un conjunto de valores. Esto hace mas fácil alternar entre dos o mas colores en una tabla, o ciclos a travéz de una matriz de valores.
  • html_*: funciones especiales para tratamiendo de cuadros de selección, imágenes, listas de selección, cuadros de fecha, etc.
  • math: soporte para definición de funciones matemáticas.
  • mailto: soporte automátizado para creación de vínculos de correo electrónico con posibilidad de codificación.

Extendiendo Smarty con Plugins:

Smarty puede ser personalizado, agregando nuevos plugins con lo cual automatizamos funciones para ser utilizadas dentro del template.

Podemos agregar nuestros propios scripts para extender: funciones, modificadores, funciones de bloque, funciones de compilación, prefiltros, postfiltros, filtros de salida, recursos e inserts. Generalmente escribiremos funciones y modificadores.

Nombres convencionales

Los archivos y funciones de Plugin deben seguir una convención de apariencia muy especifica a fin de que pueda ser localizada por el Smarty. Los archivos de plugin deben ser nombrados de la siguiente forma: type.name.php. Donde type es uno de los siguientes tipo de plugin:

  • function
  • modifier
  • block
  • compiler
  • prefilter
  • postfilter
  • outputfilter
  • resource
  • insert

Algunos ejemplos: function.html_select_date.php, resource.db.php, modifier.spacify.php. Las funciones de plugin dentro de los archivos de plugin deben ser nombradas de la siguiente forma: smarty_type _name() .

<?php
      /*
       * Smarty plugin
       * -------------------------------------------------------------
       * File: function.eightball.php
       * Type: function
       * Name: eightball
       * Purpose: outputs a random magic answer
       * -------------------------------------------------------------
       */
      function smarty_function_eightball($params, &$smarty)
      {
            $answers = array('Yes',
                             'No',
                             'No way',
                             'Outlook not so good',
                             'Ask again soon',
                             'Maybe in your reality'); 
            $result = array_rand($answers);
            return $answers[$result];
      }
?>  
Question: Will we ever have time travel?
Answer:   {eightball}. 

Ahora bien, debemos reconocer que no existe solamente Smarty como motor de plantillas, sino que existen muchas más alternativas de proyectos con características similares y otras funcionabilidades.

En el próximo artículo y final de la serie sobre Smarty, enumeraremos cuales son esas alternativas junto con sus principales características. En fin, Smarty demuestra ser una herramienta valiosa, open-source y con una gran capacidad de expansión.