Webs dinámicos con PHP

Ya se ha comentado que uno de los principales problemas a la hora de programar con PHP, o cualquier otro lenguajes que mezcle HTML y el c�digo, es que el c�digo final de las p�ginas tiene mezclado los datos a presentar y el c�digo.

Este mezcla impide adem�s un correcto trabajo entre los desarrolladores de c�digo y los creadores de p�ginas HTML y dise�adores gr�ficos. Para resolver este problemo lo mejor es intentar independizar totalmente el c�digo PHP y el c�digo HTML. Este objetivo es bastante lioso de lograr a menos que se ataque el problema de una forma general y se sea muy estr�cto a la hora de desarrollar las p�ginas.

Los beneficios logrados por esta separaci�n son muy grandes incluyendo por ejemplo el cambio de temas seg�n el tipo de usuario que acceda al servidor de web, facilitar la traducci�n de webs sin tocar para nada el c�digo facilitando as� la internacionalizaci�n del c�digo etc.

Dentro de PHPLIB nos encontramos con una clase que nos ayuda con este objetivo: la clase Template.

Para ver la potencia del uso de plantillas vamos a planter un ejemplo de unsa sencilla p�gina que debe de controlar el acceso a un web y seg�n el usuario que entre, se debe de presentar el web en un idioma u otro. La aplicaci�n lo �nico que hace es mostrar una serie de datos n�mericos sobre cotizaci�n en bolsa en euros, por lo que esta informaci�n es id�ntica para todos los idiomas.

Para ello podr�amos utilizar os mecanismos de autenticaci�n de la propia PHPLIB. Podr�amos crear una nueva tabla en la base de datos asociando identificador de usuario e idioma y tendr�amos que preparar los diferentes webs.

Supongamos que inicialmente tenemos dos idiomas: espa�ol e ingl�s. Podemos crear dos directorios, uno con las plantillas en espa�ol y el otro con las plantillas en ingl�s. El c�digo podr�a empezar de la forma:

page_open(array("sess" => "Example_Session", "auth" => "Example_Auth",
"perm" => "Example_Perm", "user" => "Example_User"));
// Template no es del n�cleo de PHPLIB por lo que hay que
// incluir esta clase de forma expl�cita.
include("template.inc");
$plantillas = "/home/acs/public_html/plantillas";
$plantillasEspa�ol = $plantillas."/espa�ol";
$plantillasIngles= $plantillas."/ingles";
// Ya sabemos que usuario es $auth[uname]
// La funci�n miraIdioma acceder�a a la base de datos para ver que
// idioma le corresponde a un usuario.
$idioma=miraIdioma ($auth[uname]);
if ($idioma=="espa�ol") $t=new Template($plantillasEspa�ol); 
elseif ($idioma=="ingles") $t=new Template($plantillasIngles);
else {echo "Error en la selecci�n de idioma.";exit;} 
// Tenemos dos plantillas: una para la cabecera y otra para el cuerpo
$t->set_file(array(
           "cabecera" => "cabecera.ihtml",
           "cuerpo"  => "cuerpo.ihtml"));
// Suponemos que existe una funci�n que nos devuelve los valores
// a presentar.
$valores = obtenValores();
$fecha = date("d/m/a");
// Cada plantilla puede contener un n�mero de variables cuyo
// valor se controla desde el c�digo a trav�s de Template
$t->set_var(array("Fecha"   => $fecha,
                  "Valores" => $valores));
$t->parse("OUT", array("cabecera", "cuerpo"));

/* imprimimos OUT */
$t->p("OUT");

Todas las plantillas asociadas a un objeto Template han de encontrarse en un directorio. En nuesto ejemplo seg�n el idioma se cogen del directorio en ingl�s o del espa�ol. Una vez asignado el directorio a trav�s de la funci�n "set_file" asociamos plantillas a nombres. De esta forma en nuestro programa utilizaremos los nombres aqu� indicados para referirnos a la plantilla a utilizar. En este sencillo ejemplo s�lo hay dos plantillas "cabecera.ihtml" y "cuerpo.ihtml".

Aparte de definir las plantillas con las que vamos a trabajar hay que definir las variables que hay que sustituir en dichas plantillas. Cualquier ocurrencia de una variable dentro de una plantilla es sustituido por el valor que le asociamos a trav�s de "set_var". En nuestro caso la varible "{Fecha}" se sutituye por "$fecha" y "{Valores}" por $valores.

Por ejemplo, el contenido de "cabecera.ihtml" podr�a ser:

    <html>
    <head>
    <title>Valores de cotizaci�n
    <title>
    <head>
    <body>
    Fecha de los valores: {Fecha}

El valor de "{Fecha}" ser� sustituido de forma autom�tica cuando ejecutemos la funci�n de sustituci�n de valores "parse". El resultado lo almacenamos en la variable "OUT" que imprimimos finalmente con la funci�n "p()".

Las plantillas que se incluyen en PHPLIB tienen una funcionalidad m�s amplia y sugerimos al lector una lectura de la documentaci�n de PHPLIB para ver todas sus posibilidades.

.�La cesta de la compra

Ya dijimos que gracias al control de sesiones ser�a trivial construir una cesta de la compra. Pues PHPLIB incluye una clase llamada "Cart" que es precisamente esto, una cesta de la compra.

El comercio electr�nico siempre obliga a que a la hora de comprar el cliente vaya teniendo su cesta de la compra con los productos que ha ido adquiriendo. El mecanismo por el que se suele mantener este estdo del cliente es mediante cookies, aunque ya vismo que PHPLIB pod�a evitar el uso de "cookies" utilizando el m�todo GET.

La cesta de la compra en PHPLIB es un conjunto de art�culos que se almacenan en la base de datos. PHPLIB nos proporciona una API sencillo para a�adir, consultar o borrar la lista de art�culos en la bolsa de la compra. Para crear nuestra cesta de la compra necesitaremos en general realizar una nueva clase de cesta de la compra basada en "Cart", principalmente para controlar la visualizaci�n de los productos, tal y como se muestra a continuaci�n:

class Mi_Cesta extends Cart {
        var $classname = "Mi_Cesta";

       // Base de datos donde guardamos los art�culos
       var $database_class = "DB_Article";
       var $database_table = "articles";
       var $db;
            
       var $sum = 0;

       function show_cart_open() {
          printf("<table class=cart_table>n");
          $this->sum = 0;
       }
            
       function show_cart_close() {
          printf("</table>\n");
          printf("That's a total of %s.\n", $this->sum);
       }

       function show_item($art, $num) {
         if (!is_object($this->db)) {
           $class    = $this->database_class;
           $this->db = new $class;
         }
              
         $query = sprintf("select * from %s where artid = '%s'",
            $this->database_table,
            $art);
         $this->db->query($query);

         while($this->db->next_record()) {
            printf(" <tr class=cart_row>\n  <td class=cart_cell>%s</td>\n",
              $this->db->Record["name"]);
            printf("  <td class=cart_cell>%s</td>\n",
              $this->db->Record["price"]);
            printf("  <td class=cart_cell>%s</td>\n",
              $num);
            $rowsum = $num * $this->db->Record["price"];
            $this->sum += $rowsum;
            printf("  <td class=cart_cell>%s</td>\n",
              $rowsum);
            printf(" <tr>\n");
         }
       }
}

Para utilizar la clase "Cart" vamos a necesitar crear una tabla m�s donde se encuentren la descripci�n de todos los art�culos que vendamos en nuestra tienda. Esta tabla la podemos crear dentro de una base de datos propia para cada uno de nuestros clientes, base de datos que tambi�n deber� tener la informaci�n de "active_sessions" y "auth_user".

Un ejemplo sencillo podr�a ser:

#
# Estructura de la tabla de 'articles'
#
CREATE TABLE articles (
  name text,
  price float(8,2),
  artid int(11) DEFAULT '0' NOT NULL auto_increment,
  PRIMARY KEY (artid)
);

En la documentaci�n de PHPLIB se encuentran todos los detalles necesarios para un uso completo de esta clase. Su descripci�n completa desbordar�a el espacio del que disponemos para este art�culo.

.�HTML Widgets

PHPLIB incluye tambi�n un conjunto de clases para facilitar la creaci�n de c�digo HTML. Por un lado con Sql_Query podemos construir formularios HTML a partir de los cuales hacer peticiones SQL a una base de datos.

Con Table podemos construir tablas HTML de una forma sencilla, muy �til para presentar el contenido de matrices de datos y de resultados de consultas a una base de datos.

Menu es un widget que a partir de un �rbol genera un men� jer�rquico con enlaces que se puede utilizar como barra de navegaci�n. De esta forma se puede facilitar mucho la creaci�n de este tipo de barras de navegaci�n, que siempre son muy engorrosas de mantener y que, en muchos casos, llevan a los dise�adores web al uso de marcos (frames) en sus p�ginas.

OOHForms es un widget para la construcci�n de formularios con la ventaja de que puede utilizar Javascript y SSI para comprobar que los valores de los campos del formulario son correctos. Antes de enviar el formulario se pueden chequear los valores que los campos del formulario, evitando as� el env�o de datos que desde su origen sus err�neos.

Por �ltimo existen dos �ltimos widget: "tpl_form" para la construcci�n de formularios utilizando OOHForms pero a un nivel de abstracci�n mayor (el objeto es una caja negra de la que podemos obtener datos, pero no sabemos como se obtienen) y Tree que permite representar en HTML estructuras de datos complejas en �rbol como subdirectorios.

.�Resumen de PHPLIB

En la segundo entrega del rinc�n de PHP en Linux Actual os hemos presentado PHPLIB, una librer�a orientada a objetos que facilita en gran medida las necesidades m�s b�sicas a la hora de montar un sitio web basado en PHP: control de sesiones y de identidad. Junto a estas necesidades b�sicas PHPLIB nos ofrece tambi�n clases para programar nuestros sitios utilizando plantillas lo facilita el trabajo en paralelo de desarrolladores PHP y creadores de p�ginas HTML y dise�adores gr�ficos.

Hemos visto tambi�n como PHPLIB no se ha olvidado del comercio electr�nico y entre sus objetos incluye una cesta de la compra integrada con el control de sesiones y de autenticaci�n. Esto nos va a permitir montar tiendas virtuales en Internet utilizando PHP con un esfuerzo m�nimo. Por �ltimo PHPLIB tambi�n contiene un conjunto de widgets que nos liberan de tareas tan arduas como chequear los valores de un formulario o la presentaci�n en HTML de complejas estructuras en �rbol.

.�Referencias

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO