Hola saludos, hoy aporto con alguna configuracion y peque?isimo desarrollo para los interesados en trabajar con ?motores de plantillas, tambien podran encontrar esta configuracion en
www.postgresql.cl (aporte que hice alguna vez), "Smarty"..............
Una de las inquietudes y comentarios mas escuchados en este ultimo tiempo es:
Como separar el c?digo de programaci?n de el dise?o de las paginas en los sistemas web, para asi evitar problemas entre las personas que tienen asignada estas misiones.
Ac? va una gu?a "practica" para instalar Smarty, un motor de plantillas cuyo uso sin duda ira aumentando en los desarrollos orientados a la web; y mas aun ahora, debido al creciente uso que esta teniendo UML (Lenguaje para Modelamiento Unificado) para el modelamiento de sistemas.
Cabe aclarar que UML no esta orientado a PHP, pero si se puede en parte adecuar para esta funcion. Quiz?s con PHP5 o posteriores esto se vea mas claro.
Comenzamos sin dejar de decir que se requiere tener instalado la versi?n de PHP 4.0.6 o superior, y que este documento esta orientado a los sistema Gnu/Linux.
Bueno, lo primero es bajar Smarty desde el link:
http://smarty.php.net/download.php en este documento trabajare con la versi?n Smarty-2.6.1.tar.gz
Descomprimimos y desempaquetamos Smarty:
# tar zxvf Smarty-2.6.1.tar.gz
Gracias al paso anterior aparecera la carpeta Smarty-2.6.1, y dentro de ella los siguientes archivos y directorios, los cuales deberemos mover a la carpeta con aplicaciones web.
En este caso mi aplicaci?n web esta en la carpeta "ejemplo1" que se localiza en
/var/www/html/ejemplo1
entonces a mover los archivos:
#mv??Smarty.class.php? ? ?/var/www/html/ejemplo1
#mv??Smarty_Compiler.class.php? ? ?/var/www/html/ejemplo1
#mv? Config_File.class.php? ? ?/var/www/html/ejemplo1
#mv? debug.tpl? ? ?/var/www/html/ejemplo1
y los siguientes directorios con todo su contenido:
#mv? core/*.php? ? ?/var/www/html/ejemplo1
#mv? plugins/ *.php? ? ?/var/www/html/ejemplo1
Deber?a quedar de esta forma:
/var/www/html/ejemplo1/Smarty.class.php /var/www/html/ejemplo1/Smarty_Compiler.class.php /var/www/html/ejemplo1/Config_File.class.php
/var/www/html/ejemplo1/debug.tpl
/var/www/html/ejemplo1/core/*.php
/var/www/html/ejemplo1/plugins/*.php
Crearemos 4 directorios:? ? ?templates, ?templates_c,? configs y? cache
dentro de: ? /var/www/html/ejemplo1
hagamoslo entonces:
mkdir ?templates ?templates_c ?configs ?cache
Con lo cual el directorio ejemplo1 debiera verse as?:
/var/www/html/ejemplo1/templates/
/var/www/html/ejemplo1/templates_c/
/var/www/html/ejemplo1/configs/
/var/www/html/ejemplo1/cache/
/var/www/html/ejemplo1/Smarty.class.php /var/www/html/ejemplo1/Smarty_Compiler.class.php /var/www/html/ejemplo1/Config_File.class.php
/var/www/html/ejemplo1/debug.tpl
/var/www/html/ejemplo1/core/*.php
/var/www/html/ejemplo1/plugins/*.php
Bueno, les dire que el motor de plantillas Smarty necesita acceso de escritura a algunos subdirectorios.
Si examinas el archivo de configuracion de Apache (httpd)
/etc/httpd/conf/httpd.conf
podras ver qu? usuario, y qu? grupo tiene asignado el servidor web Apache.
Si no lo ves generalmente son el usuario "nobody" , y el grupo "nobody".
Dentro del directorio: /var/www/html/ejemplo1
puedes entregar o asignar permisos de esta forma:
#chown ? nobody:nobody ? templates_c/
#chmod ? 770 ? templates_c/
#chown ? nobody:nobody ? cache/
#chmod ? 770 ? cache/
Una vez realizado lo anterior estaremos en condiciones de realizar nuestra primera prueba. Vamos a realizar, con tu editor favorito, tres script's.
Para ser mas especificos:
index.php,
include.php
index.tpl
include.php seria asi:
<?
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->template_dir = 'templates/';
$smarty->compile_dir = 'templates_c/';
$smarty->config_dir = 'configs/';
$smarty->cache_dir = 'cache/';
?>
y lo guardaremos dentro de: /var/www/html/ejemplo1
quedando entonces como:
/var/www/html/ejemplo1/include.php
index.tpl seria asi:
{* comentarios en smarty *}
{*Va a resultar nuestra primera prueba de eso estoy seguro*}
{$probando}
y lo guardamos en: /var/www/html/ejemplo1/templates
quedando como:
/var/www/html/ejemplo1/templates/index.tpl
index.php seria:
<?
require('include.php');
$smarty->assign('probando','La siempre aburrida prueba Hola Mundo');
$smarty->display('index.tpl');
?>
y lo guardamos en: /var/www/html/ejemplo1
quedando como:
/var/www/html/ejemplo1/index.php
Luego vamos al navegador, donde yo coloco en mi caso por la ubicaci?n de las aplicaciones web:
http://127.0.0.1/ejemplo1/ En caso de no funcionar lo m?s probable que alla cometido un error usted. ;-)
si el error estuviera relacionado con los permisos abra una ventana terminal, y dentro del directorio?? /var/www/html/ejemplo1? ?coloque lo siguiente:
#chmod ??777 ??templates_c/
#chmod ??777 ??cache/
Si tampoco funcionara revise los permisos de cada carpeta de la aplicaci?n.
Nota: El directorio usado fue solo un ejemplo, pueden usar el que ustedes quieran siempre que respeten los par?metros que entregamos en este peque?a gu?a.
Realizaremos un ejemplo un poco m?s grande trabajando con POSTGRESQL.
Las agendas y libretas de fonos son una aplicacion clasica, en este caso usaremos esta ultima ya que no necesitamos mas campos.
1- Crearemos al comenzar una base de datos y una tabla.

?#createdb libreta
? ? ?CREATE TABLE libreta (
? ? ? ? ? ? ? ? ? id integer not null,
? ? ? ? ? ? ? ? ? nombre varchar(100),
? ? ? ? ? ? ? ? ? telefono varchar(20)
? ? ? ? ? ? ? ? ? );
2 - El estilo de programaci?n cuando se trabaja con Smarty se puede ver de mejor forma en los scripts.
Aqui detallo los scripts *.php que vamos a crear, y que deben ser guardados en nuestro directorio:
/var/www/html/ejemplo1/
include.php
config.php
index.php
ingresar.php
guardar.php
mostrar.php
y las plantillas *.tpl, que deben ser guardadas en nuestro directorio:
/var/www/html/ejemplo1/templates
index.tpl
mostrar.tpl
ingresar.tpl
Comenzamos con el script de conexi?n a la base de datos:
config.php
? <?
? // los par?metros para el acceso a la base de datos
? $host = "localhost";
? $user = "postgres";
? $pass = "postgres";
? $db = "libreta";
?// conectarse a la base de datos
? $conexion = pg_connect("host=$host dbname=$db user=$user password=$pass ? ?port=5432");
? if (!$conexion){
? die("No ha sido posible establecer la conecci?n con la base de datos.");
? }
? ?>
En el siguiente script indicamos a la clase Smarty la ubicacion de los directorios creados anteriormente.
include.php
?<?
? require('Smarty.class.php');
? $smarty = new Smarty;
? $smarty->template_dir = 'templates/';
? $smarty->compile_dir = 'templates_c/';
? $smarty->config_dir = 'configs/';
? $smarty->cache_dir = 'cache/';
? ?>
En el siguiente script ponemos algo de parafernalia para poder navegar.
En este ejemplo trabaja con index.tpl.
index.php
?<?
? //para trabajar con Mart?
? require("include.php");
? $smarty -> assign('DESEO','QUE DESEA HACER');
? $smarty -> display('index.tpl');
? ?>
En el siguiente script mostramos la asignaci?n de valores a variables con Smarty.
En realidad este script no tenia mucha necesidad de crearse ya que son solo textos
los que se asignan a las variables, pero lo hice para que lo tomen como ejemplo.
Trabaja con ingresar.tpl
ingresar.php
<?
? //para trabajar con smarty
? require("include.php");
? $smarty ->assign('Titulo','Ingresar Nombre y Fono');
? $smarty ->assign('encabezado','Ingresar Nombre y Fono');
? $smarty ->assign('campo1','Nombre'); $smarty ->assign('campo2','Fono');
?
? $smarty ->display('ingresar.tpl');
?>
El siguiente script inserta en la tabla libreta, los datos de las personas agregadas.
guardar.php
<? // conexion a la base de datos
? require("config.php");
? // recibe los datos enviados desde el formulario
? $nombre =$nombre;
? $tel =$fono;
?
? $sql = "BEGIN TRANSACTION";
? $result = pg_query($sql) or die("Error en el query: $query. " . pg_last_error($connection));
?//select para sacar cuantos hay solamente lo hago as? porque me siento ? ?mas seguro
? //de aumentar yo ?l id que es un numero secuencial
? $sqlc .=" select * from libreta";
? $res = pg_query($sqlc);
? $contador = 0;
? while($row=pg_fetch_array($res))
? {
? ? $contador++;
? }
? $contador++;
? $sqli .=" insert into libreta (lib_id,lib_nombre,lib_fono)";
? $sqli .=" values('$contador','$nombre','$fono')";
? $resi = pg_query($sqli);
? if (!$resi)
? ? {
? ? $error = pg_last_error($conexion);
? ? $termino = "ROLLBACK";
? ? echo "Ocurrieron errores al intentar ingresar valores en la base de datos.
? ? analizar el mensaje enviado:
? ? <ul>
? ? $error
? ? </ul>
? ? ";
? ? }
? ? else
? ? {
? ? $termino = "COMMIT";
? ? echo "<script>alert('Los datos se han ingresado correctamente');</script>";
? ? }
? pg_query($termino);
?
? // cierro conexion a la base de datos
? pg_close($conexion);
?
? echo "<script>location.href='index.php'</script>";
?>
Script que despliega el total de personas dentro de la tabla libreta.
Trabaja con mostrar.tpl
mostrar.php
<? // conexi?n a la base de datos
? require("config.php");
? // para trabajar con smarty
? require("include.php");
? // Consulta a base de datos
? $sql ="select * from libreta";
? $sql .=" order by lib_nombre";
? $res = pg_query($sql) or die("Error en el query: $sql. " . pg_last_error($connection));
? $rows = pg_num_rows($res);
? $cont = "En este momento hay $rows Personas en la Libreta de fonos.";
? // cerrar la conexi?n con la base de datos
? pg_close($conexion);
?while($row=pg_fetch_array($res))
? {
? ? $smarty->append('Libreta', array(
? ? 'ID' => $row["lib_id"],
? ? 'NOMBRE' => $row["lib_nombre"],
? ? 'FONO' => $row["lib_fono"]
? ? ));
? }
?$smarty ->assign('TEMA','Libreta de Fonos');
? $smarty ->assign('ENCABEZADO','Libreta de Fonos');
$smarty ->assign_by_ref('VALOR',$cont);
$smarty ->display('mostrar.tpl');
?>
Ahora las plantillas:
La siguiente es solo para navegar por el ejemplo, las variables desplegadas con {$x} vienen de index.php
index.tpl
<table align="center"> ? ?
?<tr>
? ?<td>
? ? ? <b>{$DESEO}</b>
? ?</td>
?</tr>
</table> ? ?
<table width="449" border="0" align="center" bgcolor="#CCCCCC">
?<tr>
? ?<td align="center">
? ? ?<input type="button" name="ingreso" value="Ingresar" ? ?
? ? ? ? ? ? onclick="javascript:location.href='ingresar.php';">
? ? ?<input type="button" name="ingreso" value="Mostrar" ? ?
? ? ? ? ? ? onclick="javascript:location.href='mostrar.php';">
? ?</td>
?</tr>
</table>
Otra plantilla
las variables desplegadas con {$x} vienen de ingresar.php
ingresar.tpl
<html>
?<head>
? ?<title>{$titulo}</title>
? ?<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
?</head>
?<body>
? ?<form name="form1" action="guardar.php" method="post">
? ? ?<table width="449" border="0" align="center" bgcolor="#CCCCCC">
? ? ? ?<tr>
? ? ? ? ?<td col colspan="2" align="center">
? ? ? ? ? ?<div align="center">
? ? ? ? ? ? ?<b><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#FFFFFF">
? ? ? ? ? ? ? ? {$encabezado}
? ? ? ? ? ? ?</b>
? ? ? ? ? ?</div>
? ? ? ? ?</td>
? ? ? ?</tr>
? ? ? ?<tr>
? ? ? ? ?<td width="217">
? ? ? ? ? ?<font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#GGGGGG">
? ? ? ? ? ? ?{$campo1}
? ? ? ? ? ?</font>
? ? ? ? ? ? <input type="text" name="nombre">
? ? ? ? ?</td>
? ? ? ? ?<td width="216">
? ? ? ? ? ?<font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#GGGGGG">
? ? ? ? ? ? ?{$campo2}
? ? ? ? ? ?</font>
? ? ? ? ? ? <input name="fono" type="text">
? ? ? ? ?</td>
? ? ? ?</tr>
? ? ? ?<tr>
? ? ? ? ?<td colspan="2" align="center">
? ? ? ? ? ?<input type="submit" name="Submit" value="Agregar">
? ? ? ? ? ?<input type="button" name="volver" value="Volver/Cancelar"
? ? ? ? ? ? ? ? ? onclick="javascript:location.href='index.php';">
? ? ? ? ?</td>
? ? ? ?</tr>
? ? ?</table>
? ?</form>
?</body>
</html>
Plantilla para el despliegue de las personas que est?n ya registradas.
Las variables {$x} vienen de mostrar.php
mostrar.tpl:
<html>
?<head>
? ?<title>{$TEMA}</title>
?</head>
?<body bgcolor="#ffffff">
? ?<table align="center">
? ? ?<tr>
? ? ? ?<td>{$VALOR}</td>
? ? ?</tr>
? ?</table>
? ?<table align="center">
? ? ?<tr>
? ? ? ?<td align="center">
? ? ? ? ?<b>{$ENCABEZADO}</b>
? ? ? ?</td>
? ? ?</tr>
? ?</table>
? ?<table width="449" border="0" align="center" bgcolor="#CCCCCC">
? ? ?{section name=despliege loop=$Libreta}
? ? ?<tr>
? ? ? ?<td>
? ? ? ? ?{$Libreta[despliege].ID}
? ? ? ?</td>
? ? ? ?<td>
? ? ? ? ?{$Libreta[despliege].NOMBRE}
? ? ? ?</td>
? ? ? ?<td>
? ? ? ? ?{$Libreta[despliege].FONO}
? ? ? ?</td>
? ? ?</tr>
? ? ?{/section}
? ? ?<br>
? ?</table>
? ?<br>
? ?<table align="center">
? ? ?<tr>
? ? ? ?<td align="center">
? ? ? ? ?<input name="vol" type="button" value="Volver" ?
? ? ? ? ? ? ? ? onclick="javascript:location.href='index.php';">
? ? ? ?</td>
? ? ?</tr>
? ?</table>
?</body>
</html>
Nos vemos muy pronto con otro aporte......