<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//ES"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="es" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Nimutt -> PHP -> Template</title>
<style><!--
body {
background-color: #999999;
color: #000000;
font: 8pt Verdana;
}
p, td, li {
color: #000000;
font-family: Verdana;
font-size: 9pt;
}
h1, h2, h3, h4, h5, h6 {
color: #6666cc;
font-family: Verdana;
}
a { color: #009900; }
a:active { color: #ffcc00; }
a:hover { color: #00cc00; }
a:visited { color: #990000; }
small { font-size: 80%; }
big { font-size: 120%; }
input, textarea, select {
font-family: Verdana;
font-size: 9pt;
}
code, tt, xmp {
color: #000099;
font-family: Courier New, Courier, monospace;
font-size: 9pt;
}
pre {
background-color: #eeeeee;
color: #000099;
font-family: Courier New, Courier, monospace;
font-size: 9pt;
margin: 10pt;
}
blockquote {
background-color: #eeeeee;
color: #000099;
margin: 10pt;
}
hr {
width: 75%;
}
//--></style>
</head>
<body bgcolor="#999999">
<table bgcolor="#000000" border="0" cellpadding="2" cellspacing="4">
<tr valing="middle">
<td bgcolor="#000000" style="color: #ffffff; font: bold 20pt">Nimutt -> PHP -> Template</td>
</tr>
<tr valign="top">
<td bgcolor="#ffffff">
<h2>Introducción</h2>
<p>Las plantillas son ficheros utilizados para separar la lógica de un sitio web
de su presentación. ¿Por qué es importante ésto? Independizar la presentación
del sitio permite cambiar el diseño facilmente sin tener que tocar el código
php. Tambien es útil cuando se trabaja en un grupo de desarrolladores. De ésta
forma podemos tener a alguien encargado de diseñar el sitio y otra persona del
código sin que uno interfiera en el trabajo del otro.</p>
<p>Mi clase es diferente a la de <a href="http://phplib.netuse.de/">PHPLib</a>,
<a href="http://phpclasses.upperdesign.com/">FastTemplates</a> o XTemplate,
pero está basada en todas ellas. La interfaz es exactamente igual a la de
PHPLib(por lo que puede ser utilizada para reemplazarla), pero funciona un
poco diferente. Primero que todo, los bloques son extraidos
automáticamente(así que no tiene que llamar a set_block()); y segundo, los
nombres de los bloques son diferentes a las variables(Si no entiende mucho
ésto, siga leyendo).</p>
<h2>Modo de uso.</h2>
<p>Veamos unos cuantos ejemplos para entender todo esto más facilmente. Aquí
vemos la forma de crear una tabla de productos extraida desde la base de
datos, usando plantillas. Primero definimos la plantilla:</p>
<pre>
<!-- page.ihtml -->
<html>
<body bgcolor="#ffffff">
<p>Listado de productos:</p>
<table border=1 width="80%">
<tr>
<th>Producto</th>
<th>Precio</th>
<th>Cantidad</th>
</tr>
<!-- BEGIN product -->
<tr>
<td>{name}</td>
<td>{price}</td>
<td>{quantity}</td>
</tr>
<!-- END product -->
</table>
</body>
</html>
</pre>
<p>Y luego escribimos el código.</p>
<pre>
<?php
include("class.template.php");
$t = new Template;
$db = new DB_Sql;
$t->set_file("page", "page.ihtml");
$db->query("SELECT name, price, quantity FROM products");
while($db->next_record()) {
$t->set_var("name", $db->Record[name]);
$t->set_var("price", $db->Record[price]);
$t->set_var("quantity", $db->Record[quantity]);
$t->parse("product", "product", true);
}
$t->pparse("page");
?>
</pre>
<p>¿Vió que facil? Veámoslo paso a paso:</p>
<ol>
<li>Creamos un objeto tipo Template y lo almacenamos en <code>$t</code></li>
<li>Luego le decimos que lea(<code>set_file</code>) el fichero
<code>"page.ihtml"</code> y lo almacene en el bloque <code>"page"</code>,
éste es el nombre que vamos a utilizar de aquí en adelante. Siempre
definimos los nombres de los ficheros en ésta sección.</li>
<li>Hacemos una petición a la base de datos y comenzamos un ciclo. En realidad
ésto no tiene que ver con Template por lo que podríamos leer los datos desde
un fichero XML o DBM, lo que mejor le parezca.</li>
<li>Luego, cada vez que se ejecute el ciclo, le damos
valor(<code>set_var</code>) a tres variables: <code>"name"</code>,
<code>"price"</code> y <code>"quantity"</code> y
procesamos(<code>parse</code>) el bloque <code>product</code> añadiéndo(el
parámetro <code>true</code> significa añadir, si no estaríamos
sobreescribiendo el bloque "product" y siempre obtendríamos un solo
producto), cada vez, una fila más.</li>
<li>Luego procesamos e imprimimos
(<code>$t->pparse("page");</code> es lo mismo que
<code>print($t->parse("page"));</code>) la plantilla
completa.</li>
</ol>
<p>Todo ésto generaría una página como la siguiente:</p>
<pre>
<html>
<body bgcolor="#ffffff">
<p>Listado de productos:</p>
<table border=1 width="80%">
<tr>
<th>Producto</th>
<th>Precio</th>
<th>Cantidad</th>
</tr>
<tr>
<td>Template</td>
<td>Libre</td>
<td>Ilimitada</td>
</tr>
<tr>
<td>Timer</td>
<td>Libre</td>
<td>Ilimitada</td>
</tr>
<tr>
<td>XMLParser</td>
<td>Libre</td>
<td>Ilimitada</td>
</tr>
</table>
</body>
</html>
</pre>
<p>Usted puede especificar el directorio donde Template debe buscar las
plantillas, de ésta forma puede cambiar el idioma o el diseño del sitio
simplemente manteniendo dos o másversiones de las plantillas:</p>
<pre>
// $lang es un cookie que cambia según el idioma del usuario
$t = new Template("templates-$lang");
</pre>
<p>Así, si el usuario especificó <code>"es"</code> entonces va a ver el sitio en
español, mientras que si especifica <code>"en"</code> verá el sitio en
inglés.</p>
<h2>Características.</h2>
<p>Template es más rápida y sencilla que la mayoría de las plantillas(Son solo
algo más de 160 líneas de código sin contar los comentarios) y utiliza menos
funciones para obtener el mismo resultado que otras clases. Pero éstas no son
sus únicas características:</p>
<h3>Variables Globales.</h3>
<p>Ahora, las variables globales se incluyen automáticamente. Para incluir el
valor de una variable global, debe usar la sintaxis para la sustitución de
variables(<code>{VARNAME}</code>) y al nombre de la variable anteponerle
<code>G_</code>. Por ejemplo.</p>
<pre>
<form action="{G_PHP_SELF}">
<input name="username" type="text">
<input name="password" type="password">
<input type="submit" value="login">
</form>
</pre>
<p>Aquí tenemos un formulario para que el usuario se identifique y que enviará
los datos al mismo script. Otras variables que puede utilizar son:
<code>G_SERVER_NAME</code>, <code>G_SCRIPT_NAME</code>,
<code>G_PATH_INFO</code>, <code>G_REQUEST_METHOD</code>, etc... En realidad,
los contenidos se toman de la variable <code>$GLOBALS</code> al crearse el
objeto, pero puede actualizarlos usando la función
<code>scan_globals()</code>.</p>
<h3>Bloques Opcionales.</h3>
<p>En Template los bloques se extraen(pero no se procesan) automáticamente, por
lo que se pueden mostrar bloques de forma opcional. Por ejemplo: Si tenemos un
formulario para que el usuario inserte su nombre de usuario y contraseña
podríamos hacer:</p>
<pre>
if(!is_logged_in())
$t->parse("login_form");
</pre>
<p>De ésta forma, el formulario de entrada solo se mostraría si el usuario no ha sido autenticado.</p>
<h3>Separación De Nombres.</h3>
<p>En PHPLib y otras clases, cuando se va a crear un bloque múltiple,
necesitamos darle un nombre al bloque inicial y otro diferente al bloque que
va a contener el resultado o seguramente obtendríamos filas duplicadas. Con
Template, los bloques sin procesar se almacenan en un lugar separado de donde
se almacenan los bloques ya procesados, por lo que no va a obtener filas
duplicadas aun si usa los mismos nombres. Por cierto, tambien puede usar
nombres diferentes, pero esto solo es cuestión de gustos.</p>
<h3>Plantillas Como Bloques</h3>
<p>Tambien llamadas "Bloques Externos" son plantillas que pueden ser usadas en
otras plantillas. Por ejemplo, podemos tener un bloque que renderiza
información a cerca de un fichero con icono y nombre. Éstos bloques pueden
guardarse en ficheros separados y ser utilizados como librerías de plantillas.
Por ejemplo:</p>
<pre>
<!-- file_big_icons.ihtml -->
<td align="center"><img src="/icons/{type}.gif"><br>
{name}</td>
</pre>
<pre>
<!-- page.html -->
<table border=0>
<tr>
{file}
</tr>
</table>
</pre>
<pre>
$t->set_file(
array(
"page"=>"page.ihtml",
"file"=>"file_big_icons.ihtml"
)
);
$i = 0;
while(list($type, $name) = each($files)) {
$t->set_var("type", $type);
$t->set_var("name", $name);
$t->parse("file", "file", true);
}
</pre>
<p>Aquí procesamos la plantilla <code>"file_big_icons.ihtml"</code> varias veces
almacenando el resultado en <code>"file"</code>, por lo que el
<code>{file}</code> de <code>"page.ihtml"</code> se reemplaza por la lista de
los ficheros. De ésta forma se puede crear una vista de carpetas con íconos(y
si cambia la plantilla puede ver íconos grandes o pequeños).</p>
<h3>Inclusión de ficheros.</h3>
<p>Si desea utilizar ficheros multiples para una misma página(por ejemplo:
<code>header.ihtml</code>, <code>footer.ihtml</code> e
<code>index.ihtml</code>) dispone de la función <code>set_file()</code> o la
directiva FILE dentro la plantilla:</p>
<pre>
<!-- header.ihtml -->
<html>
<head>
<title>{title}</title>
</head>
<body>
</pre>
<pre>
<!-- footer.ihtml -->
</body>
</html>
</pre>
<pre>
<!-- index.ihtml -->
<!-- FILE header.ihtml -->
<p>Hola, estamos usando la directíva FILE para incluir
<code>header.ihtml</code> y <code>footer.ihtml</code>
desde <code>index.ihtml</code></p>
<!-- FILE footer.ihtml -->
</pre>
<p>Las directivas FILE se reemplazan por el fichero que indican tal y como si el
texto fuera parte del fichero. <b>Nota:</b> ésta característica se añadió en
la versión 1.2.</p>
<hr />
<p>Para una referencia de las funciones puede leer <a
href="ref.template.html">ref.template.html</a> que debe acompañar a éste
documento.</p>
<hr />
<pre>
class Template - Clase para procesar plantillas en PHP.
Copyright (C) 2000 Julio César Carrascal Urquijo.
<adnoctum@eudoramail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
</pre>
</td>
</tr>
</table>
<p align="center"><a href="http://www.w3c.org/TR/xhtml1/"><img border="0"
height="31" src="xhtml.png" width="88" /></a> <a
href="http://www.w3c.org/TR/css2/"><img border="0" height="31" src="mwcss.png"
width="88" /></a> <a href="http://www.burnallgifs.org/"><img s" border="0"
height="31" src="burnallgifs.png" width="88" /></a> <a
href="http://www.debian.org/"><img border="0" height="31" src="debian.png"
width="90" /></a><br />
<small>La última versión de éste documento la puedes encontrar en
http://nimutt.hypermart.net/php/class.template.html</small></p>
</body>
</html>
|