0% encontró este documento útil (0 votos)
15 vistas19 páginas

Manual Smarty

Smarty es un motor de plantillas que separa la lógica del diseño en aplicaciones, ofreciendo un sistema de caché, estructuras de control y la capacidad de trabajar con templates compilados. Se organiza en cuatro directorios principales y permite el uso de variables, condicionales y ciclos para generar contenido dinámico. Además, incluye funcionalidades para manejar caché y acceder a objetos PHP desde los templates, facilitando la creación de aplicaciones web complejas.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
15 vistas19 páginas

Manual Smarty

Smarty es un motor de plantillas que separa la lógica del diseño en aplicaciones, ofreciendo un sistema de caché, estructuras de control y la capacidad de trabajar con templates compilados. Se organiza en cuatro directorios principales y permite el uso de variables, condicionales y ciclos para generar contenido dinámico. Además, incluye funcionalidades para manejar caché y acceder a objetos PHP desde los templates, facilitando la creación de aplicaciones web complejas.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

SMARTY

La función básica y necesaria para un motor de templates reside en separar la lógica del diseño en una
aplicación. Smarty, por supuesto, nos otorga la posibilidad de llevar a cabo esta acción, pero va mucho
mas allá, porque incluye un avanzado sistema de caché, estructuras de control, extensiones, y opciones
para interferir el diseño de las páginas. Además, introduce el concepto de templates compilados, que
son scripts PHP generados a partir de templates. La invocación se realiza sobre el archivo compilado,
que se vuelve a compilar cuando el documento original cambia.

Podemos descargar Smarty desde http://smarty.net

Modos de trabajo

Las funcionalidades ofrecidas por Smarty están segmentadas en dos partes: una orientada a los
diseñadores y otra para programadores.

Los críticos de esta herramienta sostienen que Smarty complejiza y ensucia innecesariamente la
función inicial de un motor de templates, convirtiéndose casi en un lenguaje de programación por
encima de PHP.

Por otra parte, las empresas profesionales cuyos miembros trabajan desde hace ya un tiempo con
Smarty no ven complejidad, sino una respuesta a las necesidades de cada caso. Para utilizar esta
herramienta, debemos solamente copiar el directorio libs que viene junto con la distribución) a un lugar
accesible por las páginas PHP. Luego será necesario instanciar la clase Smarty como veremos en los
siguientes ejemplos.

<?php
require 'Smarty.class.php';
$smarty = new Smarty;
?>
Una opción válida es definir la constante SMARTY_DIR, asignándole el directorio en donde se ubica
la clase principal.

define ('SMARTY_DIR', 'C:/www/proyecto/smarty/lib/');

define('SMARTY_DIR', '/usr/local/lib/php/Smarty/libs/'');

<?php

requiree SMARTY_DIR.'Smarty.class.php'
$smarty = new Smarty;

?>

Una aplicación Smarty se estructura básicamente mediante cuatro directorios, cada uno de los cuales
cumple una función específica:

* template_dir (aquí ubicamos los templates)


* compile_dir (templates compilados)
* config_dir (archivos de configuración)
* cache_dir (caché de templates)

Para definir estos directorios en la página usamos las propiedades del objeto Smarty:

$smarty->template_dir = ' ./smarty/templates';


$smarty->compile_dir = './smarty/templates_c';
$smarty->config_dir = './smarty/configs';
$smarty->cache_dir = './smarty/cache';
Variables

Las variables pueden ser simples, arrays, propiedades, métodos de objetos, etcétera. Los delimitadores
por defecto son las llaves de apertura ({) y de cierre (}):

{$nombre variable}

Dentro de un script, es posible cargar las variables con valores mediante el método assign mostrado a
continuación:

<?php
$smarty->assign('variable1', 'valor1');
$samrty->assign('variable2', 'valor2');
?>

Condicionales

{if $variable eq “valor1”}


...
{elseif $variable eq “valor2”}
...
{else}
...
{/if}
Ciclos

Con foreach, es osible iterar un array PHP.

$paises = array('Brasil', 'Noruega', 'Francia');


asort($paises);
$smarty->assign('paises', $paises);
$smarty->display('index.tpl');

index.tpl

{foreach from=$paises Key=idPais item=nombrePais}


<li>nombre del pais: {$nombrePais}
(posicion {$idPais})
{/foreach}

A través de la variable especial smarty, obtenemos información acerca de la iteración:


$smarty.foreach.nombreForeach.nombrePropiedad

Donde nombrePropiedad puede ser:

• iteration: iteración actual.


• First: true si es la primera iteración.
• Last: ture si es la última iteración.
• Total: nos muestra el número de iteraciones del foreach.

Las secciones también pueden ser iteradas a través de los atributos loop (nombre de la variable), start
(índice de comienzo), step (salta del start al start +step, -1 para ir desde el fin al comienzo), y max
(máximo número de iteraciones);
{section name=pais loop=$paises start=1}
<li>nombre del pais: {$paises[pais]}
(posicion {$smarty.section.pais.index}, iteracion nro {$smarty.section.pais.iteracion})
{sectionelse}
No hay paises disponibles !
{/section}

Como se observa, es posible obtener información acerca de la iteración, en la sintaxis:

$smarty.section.nombreSeccion.nombrePropiedad

Donde nombrePropiedad puede ser:

• index: índice actual.


• index_prev: índice anterior.
• index_next: siguiente índice.
• Iteración o rownum: iteración actual.
• Firt: true si es la primera iteración.
• Last: true si es la última iteración.
• Total: nos muestra el número de iteraciones del foreach.
• Loop: último número del índice.

Funciones

Los argumentos pasados a las funciones son similares a los atributos de los elementos HTML. Para
generar elementos checkbox, contamos con html_checkboxes:
<?php

require 'smarty/lib/Smarty.class.php';
$smarty = new Smarty;

<?php

$smarty->template_dir ='./smarty/templates';
$smarty->compile_dir ='./smarty/templates_c';
$smarty->config_dir ='./smarty/configs';
$smarty->cache_dir ='./smarty/cache';

for ($c=1; $c<=3; $c++)


$opciones[$c] = “Valor $c”;

$smarty->assign('opciones', $opciones);
$smarty->assign('idOpcionSeleccionada', array(1, 2 ,3 ));
$smarty->display('index.tpl');

?>

• index.tpl
{html_checkoxes name=”idOpcion” options=$opciones
selected = $idOpcionSeleccionada separador =”<br />”}

Salida:

<label><input type=”checkbox” name=”idOpcion[]” value=”1” /> Valor 1 </label> <br/>


<label><input type=”checkbox” name=”idOpcion[]” value=”2” /> Valor 2 </label> <br/>
<label><input type=”checkbox” name=”idOpcion[]” value=”3” /> Valor 3
checked=”checked”</label> <br/>
Para generar elementos img, contamos con html_image:

<?php

require 'smarty/lib/Smarty.class.php';
$smarty = new Smarty;

$smarty->template_dir = './smarty/templates';
$smarty->tcompile_dir = './smarty/templates_c';
$smarty->config_dir = './smarty/configs';
$smarty->cache_dir = './smarty/cache';

$smarty->assign('archivo', 'http://www.google.com.ar/intl/en_com/images/logo_plain.png');
$smarty->assig('alto', 110);
$smarty->assign('ancho', 276);
$smarty->assign('alt','google');
$smarty->assign('enlace', 'http://www.google.com.ar/')
$smarty->display('index.tpl')

?>

{html_image file=”$archivo” height=”$alto” width =”$ancho” alt=”$alt” href=”$enlace” border=”0”}

Salida:

<a href=”http://www.google.com.ar/”><img
src=”http://www.google.com.ar/intl/en_com/images/logo_plain.png” alt=”Google” width”276”
height=”110” border=”0” /> </a>
Para gnerar opciones de elementos select, se tiene html_options:

<?php
require 'smarty/lib/Smarty.class.php';
$smarty = new Smarty;

$smarty->template_dir = './smarty/templates';
$smarty->tcompile_dir = './smarty/templates_c';
$smarty->config_dir = './smarty/configs';
$smarty->cache_dir = './smarty/cache';

for ($c; $c<=3; $c++) {


$textos[$c] =”Valor $c”;
$ids[$c] = $c*10;

$smarty->assign('id', array_values($ids));
$smarty->assign('texto', array_values($textos));
$smarty->assign('idSeleccionado', 4*10);
$smarty->display('index.tpl');
?>

• index.tpl

<select name=nombreSelect>
{html_options values=$id output=$texto selected=$idSeleccionado}
</select>
Salida

select name”nombreSelect” id=”nombreSelect”>


<option label=”Valor1” value=”10”> Valor 1 </option>
<option label=”Valor2” value=”20”> Valor 2 </option>
<option label=”Valor3” value=”30” selected=”selected”> Valor 3 </option>
</select>

Si las opciones y los valores están en el mismo array asociativo, podemos utilizar el atributo options:

for ($c=1; $c<=10; $c++) {


$opciones[$c*10] = “Valor $c”;

y el contenido del archivo queincluye el template:

{html_options options=$opciones selected=$idSeleccionado}

Para generar elementos de la tabla contamos con htmll_table.

<?php
require 'smarty/lib/Smarty.class.php';
$smarty = new Smarty;

$smarty->template_dir = './smarty/templates';
$smarty->tcompile_dir = './smarty/templates_c';
$smarty->config_dir = './smarty/configs';
$smarty->cache_dir = './smarty/cache';
for ($c=1; $c<=6; $c++) {
$datos[] = “Valor $c”;
}

$smarty->assign('datos', $datos);

$smarty->display('index.tpl');

?>

• index.tpl

{html_table lopp=$datos cols=3 table_attr='border=”1” cellspacing=”0” cellpadding=”4”'}

Salida:

<table border=”1” cellspacing=”0” cellpadding=”4”>

<tbody>
<tr>
<td>Valor 1>/td>
<td>Valor 2>/td>
<td>Valor 3>/td>
</tr>
<tr>
<td>Valor 4>/td>
<td>Valor 5>/td>
<td>Valor 6>/td>
</tr>
</tbody>
</table>
Caché

La caché es utilizada principalmente para alcanzar mayor velocidad en lo referido a la carga y


visualización de templates, a través del método display, por ejemplo, la definición del tiempo en caché
de una página es importante y deberá ser personal para cada una. Así, un template que no actualiza de
manera frecuente podrá permanecer más tiempo en caché, y viceversa.

$smarty->cahing= true;

Si la página no está en caché, y esta funcionalidad está activada, Smarty genera el archivo
correspondiente y lo almacena en el directorio definido por la propiedad cache_dir.

$smarty->caching =2;
$smarty->cache_lifetime =120; //segundos
$smarty->display('index.tpl');

$smarty->cache_lifetime =3600;
$smarty->display('noticias.tpl');

$smarty->cachelifetime = 30;
$smarty->display('mensajes.tpl');
Objetos

Otra funcionalidad que se tiene es la de acceder a objetos PHP desde un template, previo registro de
éstos. Ejemplo:

<?php
class nombreClase {
function metodo1($arg1, $arg2){
return “Método ·#1 - “.($arg1+$arg2);
}

function metodo1($arg1){
return “Método #2”;
}

function metodo3($arg1){
return “Método #3”;
}
}

$nombreObjeto = new nombreClase;


$smarty->register_object(“NombreObjetoEnTemplate”, $nombreObjeto);
$smarty->display(“index.tpl”);

?>

• index.tpl
{nombreObjetoEnTemplate->metodo 1 p1=”2” p2=”6” assign=”salida”}
<b>{$salida}</b>
Ejemplo Completo de Uso

En el siguiente proyecto, se implementa: el ingreso de usuarios a través de un registro y la visualización


del sitio en distintos idiomas. Se utiliza:

* include_base.tpl (estructura que contiene a los demás templates)


* include_encabezado.tpl (encabezado de las páginas)
* include_izquierda.tpl (barra izquierda)
* include_contenido.tpl (contnido central)
* include_pie.tpl (pie de página)

La estructura de la base de datos para validar el nombre de usuario y la contraseña del usuario es la
siguiente:

create database smarty;


use smarty;
create table users (
iduser int(5) primary key not null auto_increment,
nameUser varchar(200) not null,
usernameUser varchar(200) not null,
passwordUser varchar(200) not null
);

insert into users values();


insert into users values();

El formulario de ingreso está en include_izquierda.tpl

<form method=”post”>
<table witdth='160' border=”0” cellspacing=”0” cellpadding=”2” bordercolor='#FFFFFF'
align=”center” class=”text”>

{if $smarty.session.logged != ' '}

<tr>
<td valing=”top” bordercolor=”#CCCCCC”> Username <br>
<input type=”text” name=”usernameUser” name=”usernameUser”
value=”{$smarty.post.usernameUser}” size=”15”>
<br>
</td>
</tr>

<tr>
<td valing=”top” bordercolor=”#CCCCCC”> Password <br>
<input type=”password” name=”passwordUser” name=”passwordUser”
value=”{$smarty.post.passwordUser}” size=”15”>
</td>
</tr>

<tr>
<td valing=”top” bordercolor=”#CCCCCC”> height=”33”>
<input type=”submit” id=”sendLogin” name=”sendLogin” value=”Login”>
</td>
</tr>

{/if}
{/if}
</table>
</form>
Cuando se envía , el resultado se procesa en index.php

if ($_POST['sendLogin']) {
$res = mysql_query(“select * from users where usernameUser = 'S_POST[usernameUser]' and
passwordUser ='$_POST[passwordUser]'”);

if ( mysql_num_rows($res)) {

$row = mysql_fetch_array($res);
$_SESSION['logged'] = true;
$_SESSION['nameUser'] = $row['nameUser'];
$_SESSION['dateLogged'] = date();
header(“location: ?”);
exit;

} else {

$errorLogin = true;
}

if ($errorLogin)

$smarty->assign('errorLogin', smarty->get_config_vers('errorLogin'));

Si los datos son incorrectos, mostramos un mensaje de error, caso contrario:

if ($_SESSION['nameUser', “, $_SESSION[nameUser]($_SESSION[dateLogged])”);
En include_contenido.tpl se toma una drección u otra según el valor de la variable logged:

{if $smarty.session.logged != ' '}

<p>Lorem ipsum dolor sit amet, consetetur ...</p>

{else}

<p> {#mensajeLogin#} </p>

{/if}

Cuando el usuario desea terminar su sesión, se ejecuta el siguiente código dentro de index.php:

session_start();

if ($_GET['logout']){

tmp = $_SESSION['idioma´];
session_unset();
session_destroy();
session_start();

$_SESSION['idioma'] = $tmp;
header(“location:?”);
exit;

}
<select id=”cboIdioma” name=”cboIdioma” onchange=”windows.location = '?cboIdioma=' +
this.value”>

{html_options options= $cboOpcionesIdioma selected=$cboIdIdiomaSeleccionado}


</select>

En index.php, almacenamos la selección en una variable de sesión:

if ($_GET['cboIdioma']) {

$_SESSION['idioma'] =$_GET['cboIdioma'];
header(“location:?”);
exit;
} elseif (!$_SESSION['idioma']) {
$_SESSION['idioma'] = 'esp';
}

Y cargamos los valores de las variables desde un archivo de configuración:

$smarty->config_load('idiomas.conf', $_SESSION['idioma']);

$cboOpcionesIdioma['eng']= 'English/Ingles';

$cboOpcionesIdioma['esp'] = 'Spanish / Español';

$smarty->assign('cboOpcionesIdioma', $cboOpcionesIdioma);
$smarty->assign('cboIdIdiomaSeleccionado', $_SESSION['idioma']);
El archivo idiomas.conf tiene el siguiente aspecto:

[eng]
tituloSeleccioneIdioma = “Select your language: “
tituloInicioSession = “Member Login: “
tituloPagina = “Smarty example”
tituloPaginaContenido = “Welcome to Company Website”
mensajeLogin = “Please insert your username and password”
errorLogin = “Login error !”
menuHome =”Home”
menuCompany = “Company”
menuServices = “Services”
menuProducts = “Products”
menuClients = “Clients”

menuDownloads = “Downloads”
menuSiteMap = “Site Map”
menuContactUS = “Contact US”

[esp]
tituloSeleccioneIdioma = “ Seleccione su Idioma: “
tituloInicioSession= “Inicio de Session: ”
tituloPagina = “Ejemplo Smarty”
tituloPaginaContenido =”Bienvenido al Website de la Compañia”
mensajeLogin = “Por favor ingrese su nombre de usuario y contraseña”
errorLogin =”Error en registro !”
menuHome = “Inicio”
menuCompany = “Compañia”
menuServices = “Servicios”
menuProducts = “Productos”
menuClients = “Clientes”
menuDownloas=”Descargas”
menuSiteMap=”Mapa del Sitio”
menuContactUS=”Contacto”

Las variables están repartidas en los distintos templates. En cuanto a los archivos y directorios
utilizados por el sistema, los definimos en index.php cómo vemos en el código a continuación:

include 'db/conexion.php';
require 'smarty/lib/Smarty.class.php';
$smarty = new Smarty;

$smarty->template_dir = './smarty/templates';
$smarty->compile_dir = './smarty/templates_c';
$smarty->config_dir = './smarty/configs';

También podría gustarte