Como extender Smarty mediante plugins con PHP

Introducción

En este artículo vamos ver cómo extender el famoso y conocido motor de plantillas (o template engine) Smarty mediante plugins desarrollados completamente en nuestro lenguaje predilecto, PHP.
Smarty es uno de los motores de plantillas más extendidos y conocidos en la comunidad de desarrolladores y/o diseñadores LAMP; sus poderosas características hacen que Smarty sea el elegido a la hora de construir sitios o aplicaciones web. Una de esas características es justamente, la posibilidad de extender y mejorar el framework mediante la creación de plugins desarrollados puramente en PHP.

Existen diferentes tipos de plugins en Smarty: funciones, modificadores, bloques, etc. cada uno de ellos cumplen un propósito específico pero en particular para este artículo vamos a desarrollar un modificador Smarty (modifier); que desde mi punto de vista es lo más simple de realizar y sirve para conocer e introducirse a la arquitectura de Smarty, esto nos permitirá más adelante crear otro tipo de plugin más sofisticado.

Plugins en Smarty

Los modificadores son pequeñas funciones que se aplican sobre una variable en el template y realizan una modificación sobre ella, por ejemplo, puedo usar un modificador que le de formato a una fecha (ese modificador ya es parte de la funcionalidad existente en Smarty, se llama date_format) entonces podríamos enviarle al template todas las fechas como timestamp y que Smarty se encargue de formatearlas según el idioma o las preferencias del usuario.

Para que funcionen correctamente, los plugins deben cumplir con una convención de nombres definida por Smarty, tanto en los nombres de las funciones como en los nombres de los archivos que usemos, veamos:
supongamos que estamos desarrollando un modificador para que cambie el color de un texto, los nombres quedarían de esta forma:

Sintáxis para nombres de archivos: [tipo de plugin].[nombre].php
ejemplo:

 modifier.cambiarcolor.php

Sintáxis para nombres de funciones: smarty_[tipo de plugin]_[nombre de función](parámetro)
ejemplo:

 smarty_modifier_cambiarcolor(parámetro)

Recuerden que los plugins deben ser ubicados en la carpeta plugin, generalmente ubicada en smarty/libs/plugins pero esto depende de su intalación.

Además, los modificadores deben recibir un parámetro obligatorio que es el valor sobre el cual el modificador va a operar, en nuestro ejemplo anterior seria el texto al cual queremos cambiar el color; opcionalmente puede recibir más parámetros si es necesario.

Construyendo el plugin con PHP

Para aclarar lo que hemos visto hasta ahora, veamos un ejemplo completo:


En la plantilla Smarty lo usaríamos de esta forma:

 

{"perro"|mayusculas} 

como pueden imaginar el resultado será:

 

PERRO

En el caso anterior vemos el funcionamiento de un plugin muy simple sin parámetros opcionales; solo recibe el valor a modificar «perro» y retorna la palabra en mayúsculas.

Veamos un ejemplo un poco más complejo:

".$texto_mensaje."
"; return $resultado; } ?>

y en nuestra plantilla lo usaríamos así:

{$texto_mensaje|mensaje:"error"}

En este ejemplo podemos ver el uso de un parámetro opcional $tipo_mensaje donde le indicamos que tipo de mensaje queremos que muestre (error, aviso, ok).

Bueno por ahora hemos llegado al final, espero que este artículo les sea de utilidad y si tienen alguna duda pueden dejar un comentario.

Por mas información:
Sitio oficial Smarty

Juan Benitez

Fundador de Tecnopedia.net. Licenciado en Informática, desarrollador Web, Android y PHP. Apasionado de las tecnologías y el fútbol. Reparto mis días programando, creando sitios, apps o escribiendo en @Tecnopedianet... y sí, además tengo esposa y una hija ;)

View all posts by Juan Benitez →

One thought on “Como extender Smarty mediante plugins con PHP

  1. Yo conozco Smarty porque es el motor de plantillas que integra Prestashop, al principio me costó un poquito aprender a manejarlo, pero cuando empecé a entenderlo pude aprovechar toda la potencia que te aporta.

    Para mi un gran descubrimiento en la programación web.

Comments are closed.