PHP Classes

File: class.template.html

Recommend this page to a friend!
  Classes of Julio César Carrascal Urquijo   Class Template   class.template.html   Download  
File: class.template.html
Role: Documentation
Content type: text/plain
Description: tutorial acerca del uso de Class Template
Class: Class Template
Handling templates compatible with PHPlib
Author: By
Last change:
Date: 24 years ago
Size: 13,080 bytes
 

Contents

Class file image Download
<!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 -&gt; PHP -&gt; 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 -&gt; PHP -&gt; 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> &lt;!-- page.ihtml --&gt; &lt;html&gt; &lt;body bgcolor=&quot;#ffffff&quot;&gt; &lt;p&gt;Listado de productos:&lt;/p&gt; &lt;table border=1 width=&quot;80%&quot;&gt; &lt;tr&gt; &lt;th&gt;Producto&lt;/th&gt; &lt;th&gt;Precio&lt;/th&gt; &lt;th&gt;Cantidad&lt;/th&gt; &lt;/tr&gt; &lt;!-- BEGIN product --&gt; &lt;tr&gt; &lt;td&gt;{name}&lt;/td&gt; &lt;td&gt;{price}&lt;/td&gt; &lt;td&gt;{quantity}&lt;/td&gt; &lt;/tr&gt; &lt;!-- END product --&gt; &lt;/table&gt; &lt;/body&gt; &lt;/html&gt; </pre> <p>Y luego escribimos el código.</p> <pre> &lt;?php include(&quot;class.template.php&quot;); $t = new Template; $db = new DB_Sql; $t-&gt;set_file(&quot;page&quot;, &quot;page.ihtml&quot;); $db-&gt;query(&quot;SELECT name, price, quantity FROM products&quot;); while($db-&gt;next_record()) { $t-&gt;set_var(&quot;name&quot;, $db-&gt;Record[name]); $t-&gt;set_var(&quot;price&quot;, $db-&gt;Record[price]); $t-&gt;set_var(&quot;quantity&quot;, $db-&gt;Record[quantity]); $t-&gt;parse(&quot;product&quot;, &quot;product&quot;, true); } $t-&gt;pparse(&quot;page&quot;); ?&gt; </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-&gt;pparse(&quot;page&quot;);</code> es lo mismo que <code>print($t-&gt;parse(&quot;page&quot;));</code>) la plantilla completa.</li> </ol> <p>Todo ésto generaría una página como la siguiente:</p> <pre> &lt;html&gt; &lt;body bgcolor=&quot;#ffffff&quot;&gt; &lt;p&gt;Listado de productos:&lt;/p&gt; &lt;table border=1 width=&quot;80%&quot;&gt; &lt;tr&gt; &lt;th&gt;Producto&lt;/th&gt; &lt;th&gt;Precio&lt;/th&gt; &lt;th&gt;Cantidad&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Template&lt;/td&gt; &lt;td&gt;Libre&lt;/td&gt; &lt;td&gt;Ilimitada&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Timer&lt;/td&gt; &lt;td&gt;Libre&lt;/td&gt; &lt;td&gt;Ilimitada&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;XMLParser&lt;/td&gt; &lt;td&gt;Libre&lt;/td&gt; &lt;td&gt;Ilimitada&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/body&gt; &lt;/html&gt; </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&uacute;n el idioma del usuario $t = new Template(&quot;templates-$lang&quot;); </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> &lt;form action=&quot;{G_PHP_SELF}&quot;&gt; &lt;input name=&quot;username&quot; type=&quot;text&quot;&gt; &lt;input name=&quot;password&quot; type=&quot;password&quot;&gt; &lt;input type=&quot;submit&quot; value=&quot;login&quot;&gt; &lt;/form&gt; </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-&gt;parse(&quot;login_form&quot;); </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> &lt;!-- file_big_icons.ihtml --&gt; &lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;/icons/{type}.gif&quot;&gt;&lt;br&gt; {name}&lt;/td&gt; </pre> <pre> &lt;!-- page.html --&gt; &lt;table border=0&gt; &lt;tr&gt; {file} &lt;/tr&gt; &lt;/table&gt; </pre> <pre> $t-&gt;set_file( array( &quot;page&quot;=&gt;&quot;page.ihtml&quot;, &quot;file&quot;=&gt;&quot;file_big_icons.ihtml&quot; ) ); $i = 0; while(list($type, $name) = each($files)) { $t-&gt;set_var(&quot;type&quot;, $type); $t-&gt;set_var(&quot;name&quot;, $name); $t-&gt;parse(&quot;file&quot;, &quot;file&quot;, 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> &lt;!-- header.ihtml --&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;{title}&lt;/title&gt; &lt;/head&gt; &lt;body&gt; </pre> <pre> &lt;!-- footer.ihtml --&gt; &lt;/body&gt; &lt;/html&gt; </pre> <pre> &lt;!-- index.ihtml --&gt; &lt;!-- FILE header.ihtml --&gt; &lt;p&gt;Hola, estamos usando la direct&iacute;va FILE para incluir &lt;code&gt;header.ihtml&lt;/code&gt; y &lt;code&gt;footer.ihtml&lt;/code&gt; desde &lt;code&gt;index.ihtml&lt;/code&gt;&lt;/p&gt; &lt;!-- FILE footer.ihtml --&gt; </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&eacute;sar Carrascal Urquijo. &lt;adnoctum@eudoramail.com&gt; 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>