Vous êtes sur la page 1sur 7

PHPLIB (I) PHPLIB (I)

Manual PHP. PHPLIB (I)

Despus de la primera entrega de esta seccin donde presentamos PHP4, vamos a ponernos ya a programar aplicaciones utilizando PHP. Y PHP no es ms que un lenguaje y un conjunto de libreras orientadas hacia el desarrollado de aplicaciones web. Todo lo que podemos hacer con PHP lo podramos hacer exactamente igual con otro lenguaje utilizando CGI, pero la complejidad y tiempo de desarrollo seran mucho mayores y su integracin con el web mucho menor. Quizs podamos ver PHP como una extensin de HTML del lado del servidor. Recordemos que en principio el lenguaje PHP se mezcla con HTML en una pgina HTML con extensin ".php". Es precisamente esta extensin la que alerta al servidor de web para que antes de entregar la pgina al cliente, se la pase al interprete de PHP para que ejecute las partes PHP y enve al cliente el HTML y los resultados de las partes PHP. A lo largo de esta entrega nos vamos a centrar en describir PHPLIB, una librera que nos va a permitir de forma sencilla poder trabajar con diferentes bases de datos de forma transparente, poder gestionar sesiones de una forma sencilla y llevar un control de acceso muy flexible basado en bases de datos. PHPLIB tambin proporciona clases, est basada en objetos, para gestionar plantillas y crear HTML desde PHP. Como veremos uno de los problemas fundamentales con lenguajes como PHP, donde se mezcla el cdigo PHP con el cdigo HTML, es que no est bien delimitado el campo del diseador HTML y del programador y que el cdigo resultante puede ser complejo de entender y por o tanto, muy complicado de mantener. Las plantillas permiten que el cdigo HTML est totalmente fuera del cdigo PHP con lo que el resultado final es mucho ms flexible y mantenible. PHPLIB es una librera GPL y se puede obtener en la referencia [1]. Su instalacin es un tanto compleja ya que toda su funcionalidad principal utiliza base de datos. Por lo tanto lo primero es tener una base de datos funcionando en el sistema. Nos vamos a centrar en MySQL pero la instalacin sera muy similar para PostgreSQL o MS Access. Una vez que hayamos obtenido el "tar.gz" de la librera la descomprimimos en un directorio (tar xvfz phplib-7.2.tar.gz ) y pasamos a instalarla. La estructura de directorios resultante es:
CHANGES COPYING HELP README COMMIT CREDITS Makefile TODO VERSION pages stuff doc php unsup

La documentacin de la librera es de los ms completa y se encuentra en el directorio "doc". Las clases que componente la librera se encuentran en el directorio "php" y los "scripts" de creacin de base de datos y tablas necesarios para el funcionamiento de la librera y el soporte de LDAP se encuentra en el directorio "stuff". En el directorio "pages" tenemos unos sencillos ejemplos para comenzar a trabajar con la librera y en "unsup" tenemos utilidades de las que no se da soporte, es decir, que pueden ser tiles pero que no son parte de la distribucin oficial. Sobre la licencia como ya dijimos es software GPL y por lo tanto dentro de "COPYING" tenemos la querida licencia GPL. La gua de instalacin rpida nos cuenta en 10 pasos como instalar la librera. Como ya dijimos lo primero es tener una base de datos funcionando en el sistema. Quizs puede parecer un requisito excesivo pero los servidores web sin base de datos sern una especie en extincin en el futuro cercano. Si tenemos MySQL instalado todo va a ser sencillo. Accedemos al directorio "stuff" y ejecutamos:
mysqladmin -u root create phplib mysql -u root < create_database.mysql

Con ello creamos una base de datos para PHPLIB y dentro de ella la poblamos con una serie de tablas. En estas tablas es donde PHPLIB guarda toda la informacin de sesiones y control de accesos. Una vez que ya tenemos la infraestructura de base de datos preparada hay que indicar a

PHP que en todas las pginas incluya el ncleo de PHPLIB. Se puede evitar hacer esto pero es muy cmodo tener toda esta funcionalidad de forma automtica en nuestras pginas PHP, y este ncleo es bastante reducido. Esto lo vamos a lograr accediendo al fichero de configuracin de PHP, normalmente "/etc/php.ini", e incluir en la lnea que comienza con "auto_prepend_file" la localizacin del fichero "prepend.php3" que se encuentra dentro del directorio "php" de PHPLIB. De esta forma el interprete de PHP incluye PHPLIB en todas las pginas PHP. Una vez hecho esto solo nos queda acceder al fichero "local.inc" y especificar los datos necesarios en la clase "DB_Example" para que PHPLIB puede acceder a la base de datos. El contenido de esta clase es:
class DB_Example extends DB_Sql { var $Host = "localhost"; var $Database = "phplib"; var $User = "root"; var $Password = ""; }

Tenemos que especificar en que mquina est corriendo la base de datos, como se llama la base de datos en la que se van a almacenar los datos de PHPLIB, y un usuario y clave para acceder a esa base de datos. La clase DB_Sql es una abstraccin del acceso a la base de datos, es decir, que a travs de esta clase podemos acceder de forma idntica a varios tipos de bases de datos diferentes. En concreto en la versin actual de PHPLIB nos encontramos implementaciones de DB_Sql para las siguientes bases de datos:
db_msql.inc: msql db_mssql.inc: MS SQL Server db_mysql.inc: MySQL db_oci8.inc, db_oracle.inc: ORACLE db_odbc.inc: ODBC db_pgsql.inc: PostgreSQL db_sybase.inc: Sybase

Si basamos nuestros desarrollos en PHPLIB y DB_Sql la migracin de un sistema de bases de datos ser trivial: slo habr que traspasar los datos y cambiar la clase con la que se accede a la base de datos. Todo nuestro cdigo ser idntico. -----------------------Manual PHP. PHPLIB. Control de sesiones y de identidad de usuarios

PHPLIB. Control de sesiones


Ya en este punto estamos en disposicin de utilizar la librera PHPLIB. Para ello lo mejor es poner el directorio "pages" de la distribucin en algn lugar desde el que el servidor de web pueda acceder a l y a travs de un navegador acceder a la pgina "index.php3". Si prueba el lector a recargar la pgina ver que el contador que aparece va aumentando. Lo que est ocurriendo es que la primera vez que se accedi a esta pgina se cre una "cookie" para el control de la sesin. A partir de este momento est "cookie" con el identificador de sesin es enviado al servidor de web por el cliente cada vez accede a la pgina permitiendo el control del estado de la sesin. De hecho este control se realiza utilizando la base de datos "phplib" que creamos anteriormente. Si vemos las tablas que hay en la base de datos "phplib" encontramos:
active_sessions active_sessions_split auth_use auth_user_md5 db_sequence

En la tabla "active_sessions" es donde se almacena la informacin de sesin y cada vez que se crea una nueva sesin, se crea un registro en esta tabla para su control. Supongamos que queremos controlar el acceso a un conjunto de pginas por nuestros clientes. Con PHPLIB es tan sencillo como incluir al comienzo de cada pgina con control de sesin la llamada:
page_open(array("sess" => "Sesin de control"));

De esta forma PHPLIB verifica si el usuario tiene ya creada la "cookie". Si no la tiene se la crea y si la tiene nos permite acceder a todos los datos de la sesin. Gracias al control de sesiones podemos almacenar diferentes variables asociadas a esta sesin. Desde el momento que se abre una sesin, se abren todas las variables de dicha sesin. Para asociar una variable a una sesin utilizamos una

llamada de PHPLIB:
$sess->register("s");

Al final de una pgina con control de sesin, tenemos que realizar una llamada a PHPLIB para cerrar la sesin. En esta llamada todas las variables asociadas a la sesin se guardan para que no se pierdan:
page_close();

Es por todos conocido lo poco que gustan las "cookies" a la gente por el ataque hacia su privacidad que supone. Con PHPLIB el control de sesiones se puede realizar tambin utilizando el mtodo GET de envo de datos, es decir, adjuntando a la URL de acceso a la pgina el identificador de la sesin. Esto se controla si en la pgina con control de sesiones ponemos todos los enlaces a otras pginas de la siguiente forma:
$sess->purl("showoff.php3");

Ya hemos visto pues una de las principales ventajas de utilizar PHPLIB: el sencillo control de sesiones. con este control el implementar una bolsa de la compra donde se vayan almacenando todos los artculos de una compra es trivial. O el almacenamiento de una barra de navegacin con todas las pginas por las que ha ido accediendo el usuario.

PHPLIB. Control de Identidad de Usuarios


Junto con el control de sesiones es el control de acceso a pginas una de las principales necesidades en las aplicaciones web. Y de nuevo con PHPLIB tenemos solucionado de forma sencilla este control. Es cierto que con Apache tenemos mecanismos para el control de acceso a pginas, pero es un control de acceso o no acceso. Normalmente necesitamos ir ms all. Necesitamos que segn la persona que acceda dar acceso a unas partes u otras, poder crear grupos de usuarios con privilegios etc. Adems PHPLIB asocia este control de identidad de usuarios al control de sesiones, algo que nos permite asociar de forma automtica una sesin a un usuario identificado. Cuando queremos que una pgina solo pueda ser accedida por un usuario identificado incluimos en la primera lnea de esta pgina:
page_open(array("sess" => "Example_Session", "auth" => "Example_Auth", "perm" => "Example_Perm", "user" => "Example_User"));

Es en la tabla "auth_user" de la base de datos "phplib" donde se almacena toda la informacin sobre los usuarios. Y en esta tabla tambin se incluye un campo "perms" donde se pueden detallar los permisos que tiene un usuario. Supongamos que hay una parte de administracin a la que slo pueden acceder los usuarios con permiso de administrador. Para ello en el campo "perms" del registro del usuario debe aparecer "admin". Con PHPLIB lo nico que hay que hacer para realizar este control es incluir la llamada:
$perm->check("admin");

Si el usuario no est an autenticado se le presentar una pgina para que inserte un identificador y una clave de entrada. En el ejemplo inicial de PHPLIB el identificador es "kris" y la clave es "test". Una vez introducidos podemos volver a acceder a esta pgina y ya se nos volver a pedir el identificador. ------------------------

Manual PHP. PHPLIB (II)


PHPLIB. Plantillas
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 cdigo, es que el cdigo final de las pginas tiene mezclado los datos a presentar y el cdigo. Este mezcla impide adems un correcto trabajo entre los desarrolladores de cdigo y los creadores de pginas HTML y diseadores grficos. Para resolver este problema lo mejor es intentar independizar totalmente el cdigo PHP y el cdigo HTML. Este objetivo es bastante lioso de lograr a menos que se ataque el problema de una forma general y se sea muy estricto a la hora de desarrollar las pginas. Los beneficios logrados por esta separacin son muy grandes incluyendo por ejemplo el cambio de temas segn el tipo de usuario que acceda al servidor de web, facilitar la traduccin de webs sin tocar para nada el cdigo facilitando as la internacionalizacin del cdigo 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 pgina que debe de controlar el acceso a un web y segn el usuario que entre, se debe de presentar el web en un idioma u otro. La aplicacin lo nico que hace es mostrar una serie de datos nmericos sobre cotizacin en bolsa en euros, por lo que esta informacin es idntica para todos los idiomas. Para ello podramos utilizar os mecanismos de autenticacin de la propia PHPLIB. Podramos crear una nueva tabla en la base de datos asociando identificador de usuario e idioma y tendramos que preparar los diferentes webs. Supongamos que inicialmente tenemos dos idiomas: espaol e ingls. Podemos crear dos directorios, uno con las plantillas en espaol y el otro con las plantillas en ingls. El cdigo podra empezar de la forma:
page_open(array("sess" => "Example_Session", "auth" => "Example_Auth", "perm" => "Example_Perm", "user" => "Example_User")); // Template no es del ncleo de PHPLIB por lo que hay que // incluir esta clase de forma explcita. include("template.inc"); $plantillas = "/home/acs/public_html/plantillas"; $plantillasEspaol = $plantillas."/espaol"; $plantillasIngles= $plantillas."/ingles"; // Ya sabemos que usuario es $auth[uname] // La funcin miraIdioma accedera a la base de datos para ver que // idioma le corresponde a un usuario. $idioma=miraIdioma ($auth[uname]); if ($idioma=="espaol") $t=new Template($plantillasEspaol); elseif ($idioma=="ingles") $t=new Template($plantillasIngles); else {echo "Error en la seleccin 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 funcin que nos devuelve los valores // a presentar. $valores = obtenValores(); $fecha = date("d/m/a"); // Cada plantilla puede contener un nmero de variables cuyo // valor se controla desde el cdigo a travs 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 segn el idioma se cogen del directorio en ingls o del espaol. Una vez asignado el directorio a travs de la funcin "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 slo 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 travs de "set_var". En nuestro caso la varible "{Fecha}" se sutituye por "$fecha" y "{Valores}" por $valores. Por ejemplo, el contenido de "cabecera.ihtml" podra ser:
<html> <head> <head> <body> <title>Valores de cotizacin<title> Fecha de los valores: {Fecha}

El valor de "{Fecha}" ser sustituido de forma automtica cuando ejecutemos la funcin de sustitucin de valores "parse". El resultado lo almacenamos en la variable "OUT" que imprimimos finalmente con la funcin "p()". Las plantillas que se incluyen en PHPLIB tienen una funcionalidad ms amplia y sugerimos al lector una lectura de la documentacin de PHPLIB para ver todas sus posibilidades.

PHPLIB. Carro de la compra


Ya dijimos que gracias al control de sesiones sera 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 electrnico siempre obliga a que a la hora de comprar el cliente vaya teniendo su carro de compra con los productos que ha ido adquiriendo. El mecanismo por el que se suele mantener este estado del cliente es mediante cookies, aunque ya vimos que PHPLIB poda evitar el uso de "cookies" utilizando el mtodo GET. La cesta de la compra en PHPLIB es un conjunto de artculos que se almacenan en la base de datos. PHPLIB nos proporciona una API sencillo para aadir, consultar o borrar la lista de artculos 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 visualizacin de los productos, tal y como se muestra a continuacin:
class Mi_Cesta extends Cart { var $classname = "Mi_Cesta"; // Base de datos donde guardamos los artculos 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 ms donde se encuentren la descripcin de todos los artculos 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 tambin deber tener la informacin de "active_sessions" y "auth_user". Un ejemplo sencillo podra 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 documentacin de PHPLIB se encuentran todos los detalles necesarios para un uso completo de esta clase. Su descripcin completa desbordara el espacio del que disponemos para este artculo. ------------------------

Manual PHP. PHPLIB. HTML Widgets


HTML Widgets
PHPLIB incluye tambin un conjunto de clases para facilitar la creacin de cdigo 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 jerrquico con enlaces que se puede utilizar como barra de navegacin. De esta forma se puede facilitar mucho la creacin de este tipo de barras de navegacin, que siempre son muy engorrosas de mantener y que, en muchos casos, llevan a los diseadores web al uso de marcos (frames) en sus pginas. OOHForms es un widget para la construccin 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 envo de datos que desde su origen sus errneos. Por ltimo existen dos ltimos widget: "tpl_form" para la construccin de formularios utilizando OOHForms pero a un nivel de abstraccin 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 rincn de PHP en Linux Actual os hemos presentado PHPLIB, una

librera orientada a objetos que facilita en gran medida las necesidades ms bsicas a la hora de montar un sitio web basado en PHP: control de sesiones y de identidad. Junto a estas necesidades bsicas PHPLIB nos ofrece tambin clases para programar nuestros sitios utilizando plantillas lo facilita el trabajo en paralelo de desarrolladores PHP y creadores de pginas HTML y diseadores grficos. Hemos visto tambin como PHPLIB no se ha olvidado del comercio electrnico y entre sus objetos incluye una cesta de la compra integrada con el control de sesiones y de autenticacin. Esto nos va a permitir montar tiendas virtuales en Internet utilizando PHP con un esfuerzo mnimo. Por ltimo PHPLIB tambin contiene un conjunto de widgets que nos liberan de tareas tan arduas como chequear los valores de un formulario o la presentacin en HTML de complejas estructuras en rbol.

Referencias

[1] http://phplib.netuse.de: Librera PHPLIB

Vous aimerez peut-être aussi