Documente Academic
Documente Profesional
Documente Cultură
Introduccin
Introduccin
Gracias a las plantillas se puede crear rpidamente gran cantidad de documentos parecidos
entre s, simultneamente, separando el lado lgico (scripts, funciones y toda la
programacin) del lado visual. Una plantilla individual puede ser utilizada un nmero
interminable de veces, incluso para la construccin de la siguiente plantilla. Sin embargo,
ahorrar tiempo no lo es todo: por lo general, es sencillo manejar una plantilla y no requiere
mucha pericia de programacin.
En Internet podemos encontrar diferentes sistemas, los cuales se pueden implementar en
PHP, por ejemplo: PHPLib, TemplatePower, o el mencionado por nosotros, Smarty una
plantilla comn es, simplemente, una clase creada en PHP. Slo que puesto que las plantillas
son parecidas entre s, entonces Porqu tendramos que elegir precisamente Smarty? La
respuesta es muy sencilla: este sistema es, en definitiva, el ms rpido. Los datos que aqu
presento provienen de la pgina "benchmark of templates". Su autor decidi comparar las
plantillas ms populares por medio de dos pruebas bsicas: sustitucin de variables y uso de
bucles. Ocupmonos ms de cerca de la primera prueba y de sus resultados. El autor cre
dos documentos. Uno de ellos contena texto y 21 nombres de variables. El segundo: tena
variables con valores definidos, que deban asignarse al primer documento. La cantidad de
variables en el segundo documento era diferente, y adems, la investigacin de cada
muestra se realiz una cantidad de veces variante. Se trataba de verificar cmo se
desenvolvan las plantillas, al proporcionarles una gran cantidad de datos a la vez y cmo lo
hacan con series de datos pequeas y mltiples.
La Figura 1 contiene los resultados para los 40 valores registrados y 5 iteraciones. Como se
puede apreciar, Smarty necesit 2 ms para realizar la investigacin completa, mientras al
ms lento competidor le tom hasta 49 ms (en promedio, una iteracin se realizaba 12 veces
ms rpido). La rapidez en funcionamiento tampoco es las nica propiedad de Smarty. El
sistema posee otras opciones tiles: ocupmonos de ellas.
o
o
o
o
o
o
Modificadores
Funciones
Filtros
Archivos de configuracin
Los archivos de configuracin permiten definir ciertas variables globales, a las que se
acceder desde todas las plantillas. Creando una plantilla, tenemos la posibilidad de cargar
los archivos de configuracin y las variables que en ellos se encuentran, las cuales pueden
ser utilizadas y modificadas de la misma manera que una variable comn.
Plugins
Smarty es un sistema abierto, fcil de extender o modificar. Los plugins permiten crear
nuestros propios modificadores, funciones y filtros. Tambin podemos utilizar plugins
construidos y proporcionados por otros. Ya que todo est en PHP, nicamente debemos
cumplir con las especificaciones que indican los requerimientos que se refieren a la
construccin de plugins en Smarty.
Las plantillas de Smarty son inteligentes. Si una vez realizamos trabajo y abrimos un
documento concreto, ste queda almacenado y es utilizado en el futuro. Por supuesto, si la
plantilla es modificada, el sistema lo descubre por s solo y vuelve a generar el documento. El
trabajo de Smarty puede acelerarse utilizando la cach (ing. Caching). Esta operacin
consiste en almacenar el documento en formato HTML, que ser enviado durante la siguiente
llamada al navegador del cliente, sin la necesidad de procesar nuevamente los scripts, o
realizar las consultas a la base de datos, por ejemplo.
Instalacin
Para ejecutar Smarty es suficiente
descomprimirlo. Por si acaso, conviene asegurarse de que nuestro servidor utiliza la versin
4.0.6 de PHP u otra ms reciente.
En el mismo archivo encontraremos algunos archivos informativos adems de 3
directorios:/libs, /demo y /misc. Nos interesa principalmente el primero, ya que incluye
todo lo que vamos a necesitar para usar Smarty debemos copiarlo al servidor.
Para usar plantillas, necesitaremos ubicar el contenido de los scripts en el
archivoSmarty.class.php con ayuda de la funcin require(). Si somos administradores
del servidor que estamos utilizando, debemos encontrar el lugar donde est intalado PHP, y
en l, crear una nueva carpeta (digamos /smarty), en el cual colocaremos el contenido del
directorio /libs. Para que no sea necesario invocar al archivo Smarty.class.php,
utilizando
la
ruta
de
acceso
completa
(por
ejemplo: /usr/local/lib/php/smarty/Smarty.class.php,
la
agregamos
al
campo include_path en el archivo php.ini. En caso de que utilicemos el hosting con el
soporte de PHP, es suficiente copiar el contenido del directorio /libs (ubicado en el
directorio principal de la cuenta). Esta vez, para facilitarnos el trabajo, podemos definir una
ruta
de
acceso
en
la
variable SMARTY_DIR,
que
se
encuentra
en
el
archivo Smarty.class.php.
Cuando los archivos ya estn en su lugar, fijmonos en la estructura de directorios donde
almacenamos nuestras aplicaciones. El empleo correcto de Smarty requiere la creacin de
cuatro
carpetas.
Sus
nombres
por
defecto
son /templates, /templates_c, /configs y /cache (a los directorios les coresponden 4
variables
dentro
del
archivo Smarty.class.php: $template_dir,
$compile_dir, $config_dir y $cache_dir). Sobre la aplicacin apropiada de estas
carpetas hablaremos despus. Ahora aadamos solamente que en caso de poseer los valores
de configuracin adecuados, se recomienda ubicar estos directorios fuera de la estructura de
documentos web (podemos encontrar ms indicaciones en el segundo captulo de la
documentacin). Tambin debemos tener la posibilidad de guardar en los
directorios/templates_c y /cache a nivel de scripts.
Si ya hemos instalado Smarty, podemos empezar con la creacin de nuestras primeras
plantillas.
Bases
Para las necesidades de nuestro artculo, supongamos que tenemos una pgina sobre un
conjunto musical. Para que el trabajo nos resulte agradable, supongamos que es el grupo The
Beatles. La parte en la que mejor se pueden aplicar las plantillas es la discografa del
conjunto. Cada disco debera tener su propia pgina con el nombre del lbum, la descripcin
de las canciones, la fotografa de la portada adems de una breve descripcin. Todos van a
utilizar las plantillas preparadas por nosotros, lo que facilita aadir rpido los siguientes
discos, y al mismo tiempo, las modificaciones posteriores de cada una de las pginas.
Para eso creamos una plantilla de ejemplo, cuyo contenido se presenta en el Listado 1. Como
se puede ver ya a primera vista, es un documento comn y corriente escrito en XHTML. Sin
embargo, es fcil encontrar el lugar donde aparecen las variables. En las plantillas de
Smarty, el nombre de las variables va precedido por el smbolo del dlar ( $) y encerrado
entre claves. Adems, en ellas no se tienen puntos y comas, que son tan comunes en los
scripts de PHP. El archivo de la plantilla es un archivo de texto comn, al cual le asignamos la
extensin .tpl (del ingls: template, es decir, plantilla). Por supuesto, nada nos impide darle
la extensin que queramos.
Listado 1: Contenido de la plantilla album.tpl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-2" />
<meta name="description" content="Discografa del conjunto The Beatles" />
<title>{$albumName}</title>
</head>
<body>
<h3>{$albumName}</h3>
<table>
<tr>
<td><img src="{$albumCover}" alt="" /></td>
<td><b>ndice de canciones:</b><br />{$albumSongs}</td>
</tr>
</table>
<h4>Descripcin del lbum:</h4>
<p>{$albumSynopsis}</p>
<p><a href="">Pgina principal</a></p>
</body>
</html>
El archivo debemos almacenarlo en el directorio /templates.
Cuando ya tengamos lista la plantilla, debemos utilizarla en nuestro script. Para eso creamos
un documento cuyo contenido lo muestra el Listado 2. Esta vez se trata de un archivo PHP
comn. Donde se definen los valores concretos de nuestras variables y la plantilla utilizada.
Este archivo se coloca junto con otros documentos web.
Listado 2: Archivo sgtpep.php, el cual va a utilizar la plantilla album.tpl
<?
require ("Smarty.class.php");
$smarty = new Smarty;
$smarty->assign("albumName", "Sgt. Pepper's lonely hearts club Band");
$smarty->assign("albumCover", "grafika/sgtpep.jpg");
$smarty->assign("albumSongs", "Sgt. Pepper's Lonely Hearts Club Band;
With A Little Help From My Friends;Lucy In The Sky Of Diamonds;
Getting Better;Fixing A Hole;She's Leaving Home;
Being For The Benefit Of Mr. Kite!;Within You, Without You;
When I'm Sixty-Four;Lovely Rita ;Good Morning, Good Morning;
Sgt. Pepper's Lonely Hearts Club Band (Reprise);A Day In The Life");
$smarty->assign("albumSynopsis", "El lbum ms famoso del conjunto y uno
de los mejores lbumes en la historia de la msica. Novedoso, genial - una verdadera obra de arte. El disco fue introducido al mercado en 1967 y
se convirti en uno
de los smbolos de esa poca.");
$smarty->display("album.tpl");
?>
En este lugar debemos decir algunas palabras sobre el mecanismo de Smarty. En la primera
etapa, tiene lugar la compilacin de la plantilla. Pero esto no tiene nada que ver con la
compilacin conocida de tales lenguajes como, por ejemplo, Java, o la compilacin de scripts
PHP a opcode. Su propsito es la conversin de la plantilla a un documento normal de PHP.
Esto significa que, por ejemplo, la notacin {$var} ser cambiada a:
<?php
echo $this->_tpl_vars['var'];
?>
El
documento,
de
esta
forma,
es
salvado
automticamente
dentro
del
directorio /templates_c. En la siguiente llamada al archivo sgtpep.php, el servidor
enviar al navegador los archivos ya convertidos, lo que permite el ahorro de tiempo y de
trabajo del parser.
Para empezar, tuvimos que cargar la librera y crear un nuevo objeto tipo smarty. Luego
utilizamos el mtodo assign para crear las variables y asignarles valores concretos. Smarty
maneja los mismos tipos de variables que PHP, as que podemos utilizar nmeros, cadenas,
arrays, etc. Al final, hicimos uso del mtodo display, que carga la plantilla dada y despliega
todo el documento. Desde luego, el archivo sgtpep.php podra contener una secuencia de
funciones complicadas que permitiran la carga de datos desde una base de datos, archivos
de texto, etc. Pero supongamos que aqu ya las conocemos y que podemos asignarlas a
variables de una vez. En este momento, debemos prestar atencin a un punto importante.
Todo lo que se colocar en la plantilla entre llaves, ser tratado como una posible variable o
funcin. As que, si deseamos introducir una llave en el texto, debemos
utilizar {ldelim} para la llave izquierda y{rdelim} para la llave derecha. Lo mismo se
refiere a colocar en el documento estilos o scripts, por ejemplo:
<style>
p {ldelim}color: #000000;
font-size: 12px{rdelim}
</style>
Es fcil convencerse de que este mtodo resulta fastidioso en el caso de una gran cantidad
de llaves. Entonces, podemos utilizar el tag {literal} disponible en Smarty. Todo lo que se
encuentra entre {literal} y {/literal} no ser interpretado por el mecanismo Smarty.E
l ejemplo anterior del cdigo lo podemos cambiar por:
{literal}
<style>
p {color: #000000;
font-size: 12px}
</style>
{/literal}
De paso mencionar que Smarty tiene su propio mecanismo de comentarios, que son
eliminados durante la compilacin. Los comentarios en la plantilla se inician con {* y
terminan con *}.
Volviendo a nuestra plantilla de ejemplo, vemos que se pueden mejorar en ella muchas
cosas. Comencemos con algo sencillo: aadamos algunos modificadores.
Variables modificadas
Smarty ofrece alrededor de 20 modificadores, con ayuda de los cuales podemos cambiar la
apariencia de las variables, pero no slo eso. Para aplicar un modificador en una variable
debemos utilizar el esquema
{$variable_name|modifier_name}
Algunos de los modificadores pueden tener parmetros que deben ser proporcionados al
llamarlos. Si existiera la necesidad de aadir un parmetro a un modificador, entonces
utilizaramos el siguiente esquema:
{$variable_name|modifier_name:
parameter1:parameter2}
El parmetro puede ser una cadena o un valor numrico. En el primer caso, debemos
colocarlos entre comillas. Qu modificadores seran de utilidad en nuestro ejemplo?
Notemos que no todos los fragmentos del ttulo del lbum empiezan con maysculas. Podra
ser un dato errneo en la base de datos, pero esto no nos interesa. Este valor de la variable
fue transferido a la plantilla y debemos arreglrnoslas con eso. Para eliminar este problema,
aadamos el modificadorcapitalize a la variable $albumTitle. Este har que cada
palabra en la variable dada empiece con mayscula.
Otro punto que merece la pena subrayar, es el ndice de canciones. Supuse que es
porporcionado en forma de una variable escalar, donde los ttulos son separados por punto y
coma. Desde luego, sera ms cmodo almacenarlos en un array, pero de esto nos
ocuparemos luego. Ahora intentemos formatear la lista que nos llega en esta forma. Para
empezar, nos valdremos del modificador replace, el cual busca en la variable una cadena
que nos interesa y la cambia por otra. En este caso, estamos trabajando con un modificador
que requiere dos parmetros. El primero de ellos es la cadena a buscar y el segundo la
cadena
a
introducir.
Entonces
cambiemos
los
puntos
y
comas
en
la
variable $albumSongs por tags <br/>. De este modo obtendremos una lista de canciones,
cuyos ttulos sern colocados uno debajo del otro.
El ltimo punto ser ajustar el prrafo con la descripcin del disco. Para este propsito
debemos utilizar el modificador wordwrap, el cual ajusta la cadena a un ancho determinado.
El modificador posee tres parmetros. El primero de los parmetros indica el ancho al cual el
texto se debe ajustar (por defecto son 80 caracteres), el segundo, define el smbolo que
servir para ajustar el texto (por defecto es \n), el tercer parmetro indica si el texto debe
ser ajustado al final de la palabra o si la palabra puede ser dividida en dos partes (la primera
opcin es la que est por defecto).
La plantilla con cambios se presenta en el Listado 3, y su funcionamiento se muestra en la
Figura 4.
Listado 3: Plantilla album.tpl despus de agregar los modificadores
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-2" />
<meta name="description" content="Discografa del conjunto The Beatles" />
<title>{$albumName|capitalize}</title>
</head>
<body>
<h3>{$albumName|capitalize}</h3>
<table>
<tr>
<td style="vertical-align: top"><img src="{$albumCover}" alt="" /></td>
<td><b>ndice de canciones:</b><br />{$albumSongs|replace:";":"<br
/>"}</td>
</tr>
</table>
<h4>Descripcin del lbum:</h4>
<p>{$albumSynopsis|wordwrap:100:"<br />"}</p>
<p><a href="">Pgina principal</a></p>
</body>
</html>
Aplicacin de funciones
Smarty tiene muchas funciones tiles, las cuales se pueden utilizar directamente en la
plantillas. Tienen una estructura y construccin diferente a sus correspondientes de PHP.
Primero, los nombres de las funciones son colocados (as como las variables) entre claves.
Segundo: los parmetros no se colocan entre parntesis, sino se escriben en forma idntica
como se hace con los atributos en HTML colocando el nombre y el valor despus del signo
de igualdad.
La funcin include() aplicada en PHP que en el script tomara la forma:
include ("file.txt");
en la plantilla de Smarty se vera as:
{include file="file.txt"}
Adems,
ciertas
funciones
tienen
tags
de
apertura
y
cierre,
por
ejemplo, {literal} presentada anteriormente. Como ya conocemos la informacin bsica
sobre las funciones, podemos aplicarlas en nuestra plantilla.
Intentemos transferir la lista de canciones en forma de tabla, y no de cadena. El ndice de
canciones lo colocamos en un array asociativo, donde las claves indican el ttulo de la
cancin, y el valor el tiempo de duracin (esto requiere cambios dentro del
archivo sgtpep.php) Para leer los datos de un array de este tipo, utilizaremos la
funcin {foreach}, la cual crea un bucle, que estar regresando, consecutivamente, todos
los elementos del array.
Listado 4: Fragmento modificado de la plantila album.tpl
...
<table>
<tr>
<td style="vertical-align: top"><img src="{$albumCover}" alt="" /></td>
<td><b>ndice de canciones: </b><br />
{foreach key="songTitle" item="songTime" from=$albumSongs name="songs"}
Nos falta una cosa para que la combo box pueda funcionar correctamente: el array con las
calificaciones (para definir los valores y nombres de las posiciones de la lista utilizaremos los
mismos datos). Debemos definirla en el archivo sgtpep.php con la ayuda del
mtodo assign.
Variables de entorno
La variable {$smarty} es una variable reservada. Gracias a ella tenemos acceso a mucha
informacin sobre los temas de Smarty, por ejemplo, el nombre de la plantilla procesada
actualmente, y no slo eso. Con su ayuda podemos recibir diferentes variables de entorno. Si
deseamos desplegar el valor de la variable $id, que fue transferida por el navegador por
medio del mtodo POST, es suficiente escribir {$smarty.post.id}. Aplicamos este
esquema de manera analga, si deseamos tener acceso a la informacin sobre el servidor
(por
ejemplo,{$smarty.server.SERVER_NAME}),
sesin
(por
ejemplo, {$smarty.session.id}), etc.
Es interesante la variable {$smarty.now}, en la que se almacena la fecha y el tiempo
actual del sistema Unix.
Archivos de configuracin
Los archivos de configuracin son ideales para definir variables que sern usadas en varias
plantillas. Por ejemplo, supongamos que queremos que en el ttulo del navegador siempre
aparezca el texto Super pgina sobre The Beatles. Para este propsito creamos un archivo
de configuracin llamado title.conf y lo almacenamos en el directorio /configs (por
defecto, Smarty carga de ah los archivos de configuracin). Definimos una variable en l de
la siguiente manera:
pageTitle = "Super pgina sobre The Beatles"
El nombre de la variable no inicia con el signo de dlar, y al final no hay un punto y coma.
Todo debe estar escrito en una sola lnea. La forma de llamar una variable del archivo de
configuracin, dentro de una plantilla, no es muy comn. Para este propsito debemos
colocar su nombre entre el smbolo hash (#), por ejemplo
<title>{#pageTitle#}</title>
Pero antes de insertar la variable dentro de la plantilla, debemos cargar en ella el archivo de
configuracin, con la ayuda de la funcin {config_load}. La funcin tiene el atributo file,
cuyo valor es el nombre del archivo. Recordad que es suficiente dar slo su nombre, para que
Smarty lo busque automticamente dentro del directorio /configs.
Conviene mencionar que en los archivos de configuracin podemos aplicar, los comentarios
disponibles en PHP. El otro punto importante es la forma de almacenar las variables, las que
sobrepasen la longitud de una lnea. En este caso, debemos encerrarlas entre un triplete de
comillas, por ejemplo:
foo = """Ejemplo de una variable larga"""
Uso de filtros
En Smarty, los filtros quedaron divididos en 3 grupos: Prefilters (cambian el contenido de la
plantilla antes de que haya sido compilada), Postfilters (modifican la plantilla despus de la
compilacin) y Output Filters (son ejecutados en el momento de la invocacin de la llamada
de la plantilla existente, con la ayuda del metodo display). Los filtros se pueden colocar
dentro de las plantillas de dos formas: cargar un filtro ya creado o registrar uno nuevo en un
archivo PHP. Primero describiremos este segundo mtodo.
Un filtro no es otra cosa que una funcin creada por nosotros. Debe tener dos parmetros:
$tpl_source (en el caso de los filtros del tercer grupo es $tpl_output) y &$smarty.
Como se pueden imaginar fcilmente, el primero de ellos es el contenido de la plantilla, y el
segundo nuestro objeto smarty. Exploremos el caso de postfilters, el cual qued
presentado en el Listado 5.
Listado 5: Archivo sgtpep.php despus de la modificaciones
<?
require ("Smarty.class.php");
$smarty = new Smarty;
$smarty->assign("albumName", "Sgt. Pepper's lonely hearts club Band");
$smarty->assign("albumCover", "grafika/sgtpep.jpg");
$smarty->assign("albumSongs",array(
"Sgt. Pepper's Lonely Hearts Club Band" => "(2:02)",
"With A Little Help From My Friends" => "(2:44)",
"Lucy In The Sky Of Diamonds" => "(3:28)", "Getting Better" => "(2:47)",
"Fixing A Hole" => "(2:36)", "She's Leaving Home" => "(3:35)",
"Being For The Benefit Of Mr. Kite!" => "(2:37)",
"Within You, Without You" => "(5:05)", "When I'm Sixty-Four" => "(2:37)",
"Lovely Rita" => "(2:42)", "Good Morning, Good Morning" => "(2:41)",
"Sgt. Pepper's Lonely Hearts Club Band (Reprise)" => "(1:18)",
"A Day In The Life" => "(5:33)"));
$smarty->assign("albumSynopsis", "El lbum ms famoso del conjunto y uno
de los mejores en la historia de la msica. Novedoso, genial una verdadera
obra de arte. El disco fue introducido al mercado en 1967 y se convirti
en
uno de los smbolos de esa poca.");
$smarty->assign("points", array("1", "2", "3", "4", "5", "6"));
function footer($tpl_source, &$smarty) {
return $tpl_source."\n\n<p><a href=\"\">Pgina principal</a></p>
\n\n</body>\n</html>";
}
$smarty->register_postfilter("footer");
$smarty->display("album.tpl");
?>
Al inicio definimos la funcin footer(), la cual responde de colocar el pie de pgina. En
nuestro caso es solamente un enlace a la pgina principal y los tags de
cierre </body> y </html>. Desde luego, el pie de pgina es colocado despus del contenido
de la plantilla. Luego de definir la funcin, debemos registrarla como filtro. Lo lo hacemos con
la ayuda del mtodoregister_postfilter.
Por supuesto, sera ms efectivo almacenar el filtro en un archivo separado, y despus,
cargarlo directamente en la plantilla. Mostremos pues cmo realizarlo.
Es una consola, que tiene como fin ayudarnos eliminar errores los que podramos encontrar
en el momento de la creacin de plantillas con ayuda de Smarty. Despus de su ejecucin,
durante la visualizacin del documento que utiliza Smarty, debe abrirse una nueva ventana
del explorador, en la que sern enumeradas todas la plantillas, adems de las variables que
se hayan utilizado en el documento junto con sus valores. Veamos la Figura 7, donde se
presenta el contenido de la consola para el archivo sgtpep.php.
Modo seguro
Cache
Como mencionamos al principio del artculo, Smarty compila las plantillas y las almacena en
directorios separados con el fin de mejorar su funcionamiento. La segunda cosa que acelera
el despliegue de las plantillas es el uso de la cach. Abramos el archivo sgtpep.php y
aadamos en l la siguiente lnea
$smarty->caching=true;
Eplogo
Y as hemos llegado al final del artculo. En l present un aspecto y mtodos bsicos para
utilizar Smarty. Tengo la esperanza de que lo utilizaris en el trabajo y que mi artculo les
haya ayudado a conocerlo mejor.
Smarty tiene varios modificadores, funciones y mtodos, que no han sido mencionados por
mi, y los cuales pueden resultar tiles en la construccin de plantillas complicadas.
Agradezco a todos la atencin. A los Beatles les agradezco su msica y hasta la prxima!