Introducción
Esto no se puede considerar exactamente un tutorial acerca de como utilizar el módulo HTML::Template, es más bien una introducción rápida a las cosas que puedes hacer con este módulo y porque debes de preferir usar templates a código HTML metido en tu script de perl.
HTML::Template y CGI.pm
El módulo HTML::Template nos da una gran posibilidad de unirlo junto al módulo CGI.pm, pasando el objeto CGI.pm buscando variables para llenar el template. Veamos un ejemplo rápido, lo primero que vamos a hacer es crear dos templates:
comida1.tmpl
<form action="comida.pl" method="post">
<p>Tu nombre: <input type="text" name="nombre"
value="<TMPL_VAR NAME=NOMBRE>"></p>
<p>Tu comida favorita: <input type="text" name="comida"
value="<TMPL_VAR NAME=COMIDA>"></p>
<p><input type="submit"></p>
</form>
Este primer template tiene una simple forma.
comida2.tmpl
<p>Hola <b><TMPL_VAR NAME=NOMBRE></b>. Sabemos que tu comida favorita es <b><TMPL_VAR NAME=COMIDA></b>.
Este segundo template es el que vamos a utilizar para desplegar la información que nos hayan mandado desde la forma.
Y ahora tenemos que hacer el script.
comida.pl
use CGI;
use HTML::Template;
my $cgi = CGI->new;
my $template;
print $cgi->header;
if ($cgi->param('nombre') && $cgi->param('comida')) {
$template = 'comida2';
} else {
$template = 'comida1';
}
my $t = HTML::Template->new(filename => "$template.tmpl", associate =>
+ $cgi);
print $t->output;
Lo que hacemos es sencillo. Primero creamos un nuevo objeto de CGI. Checamos si tenemos las variables "nombre" y "comida". Si están entonces desplegamos el template comida2, de lo contrario el de comida1.
Luego hacemos un objeto de HTML::Template, al que mandamos la variable "filename" con el nombre del template, y la variable "associate" al que mandamos nuestro objeto CGI.
Ahora nuestro módulo HTML::Template hace todo el trabajo y su magia, y listo, tenemos nuestro template con las variables sustituidas correctamente.
HTML::Template y DBI
Ya sabemos como podemos fusionar el módulo Template con CGI.pm, ahora veamos como podemos hacerlo con nuestro DBI.
Digamos que queremos sacar unos datos de nuestro database y queremos desplegarlo, es sumamente sencillo con HTML::Template.
Veamos el código de nuestro script:
use DBI;
use CGI;
use HTML::Template;
my $cgi = CGI->new;
my $dbh = DBI->connect('dbi:mysql:xxxx:localhost', 'xxxx', 'xxxx');
my $t = HTML::Template->new(filename => 'db.tmpl');
$t->param(ROWS => $dbh->selectall_hashref('SELECT id, nombre, precio FROM productos'));
$dbh->disconnect;
print $cgi->header;
print $t->output;
Veamos lo que estamos haciendo. Iniciamos objetos para CGI, DBI y HTML::Template.
Luego llamamos la función "param" de Template, a la cual mandamos una referencia de un hash creado por el módulo DBI en la variable "ROWS" al ejecutar el query que queremos.
Muy bien, ahora veamos como debe de estar nuestro template "db.tmpl" para desplegar bien los campos que recibimos del database.
db.tmpl
<table border="1">
<tr><th>ID</th><th>NOMBRE</th><th>PRECIO</th></tr>
<TMPL_LOOP ROWS>
<tr>
<td><TMPL_VAR NAME=ID></td>
<td><TMPL_VAR NAME=NOMBRE></td>
<td><TMPL_VAR NAME=PRECIO></td>
</tr>
</TMPL_LOOP>
</table>
Vemos como hacemos un loop con el contenido de ROWS, la cual iria desplegando cada variable recibida del database. Fácil ¿no?
Conclusiones
Como vimos, esto sólo fue un vistazo rápido a lo que podemos hacer con HTML::Template, vemos como es realmente sencillo usarlo.
La ventaja que nos da es que podemos separar como vimos el código del diseño, pues podemos editar cualquer template sin tener que editar el script.
Mayores informes
Documentación de HTML::Template
Este artículo fue basado en using CGI, DBI and HTML::Template (a mini tutorial with example code) de Perl Monks.