Login   Register  
PHP Classes
elePHPant
Icontem

File: class.template.html

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  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: 13 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>