Migración Smarty 4
Esta guía cubre los cambios y pasos de migración necesarios al actualizar de Smarty 3 a Smarty 4 en XOOPS. Comprender estas diferencias es esencial para mantener la compatibilidad con instalaciones XOOPS modernas.
Documentación Relacionada
Sección titulada «Documentación Relacionada»- Smarty-Basics - Fundamentos de Smarty en XOOPS
- Theme-Development - Creación de temas XOOPS
- Template-Variables - Variables disponibles en plantillas
Descripción General de Cambios
Sección titulada «Descripción General de Cambios»Smarty 4 introdujo varios cambios importantes de Smarty 3:
- El comportamiento de asignación de variables cambió
- Las etiquetas
{php}se eliminaron completamente - Cambios en la API de caché
- Actualizaciones en el manejo de modificadores
- Cambios en la política de seguridad
- Características obsoletas eliminadas
Cambios en Acceso a Variables
Sección titulada «Cambios en Acceso a Variables»El Problema
Sección titulada «El Problema»En Smarty 2/3, los valores asignados eran directamente accesibles:
// PHP$GLOBALS['xoopsTpl']->assign('mod_url', $helper->url());{* Smarty 2/3 - funcionaba bien *}<img src="<{$mod_url}>/assets/images/icon.png">En Smarty 4, las variables se envuelven en objetos Smarty_Variable:
Smarty_Variable Object( [value] => http://example.com/modules/mymodule/ [nocache] =>)Solución 1: Acceder a la Propiedad Value
Sección titulada «Solución 1: Acceder a la Propiedad Value»{* Smarty 4 - acceder a la propiedad value *}<img src="<{$mod_url->value}>/assets/images/icon.png">Solución 2: Modo de Compatibilidad
Sección titulada «Solución 2: Modo de Compatibilidad»Habilitar el modo de compatibilidad en PHP:
$smarty = new Smarty();$smarty->setCompatibilityMode(true);Esto permite acceso directo a variables como en Smarty 3.
Solución 3: Verificación de Versión Condicional
Sección titulada «Solución 3: Verificación de Versión Condicional»Escribir plantillas que funcionen en ambas versiones:
<{if $smarty.version|regex_replace:'[^0-9]':'' >= 4}> <{$mod_url->value}><{else}> <{$mod_url}><{/if}>Solución 4: Función Contenedora
Sección titulada «Solución 4: Función Contenedora»Crear una función auxiliar para asignaciones:
function smartyAssign($smarty, $name, $value){ if (version_compare($smarty->version, '4.0.0', '>=')) { // Smarty 4+ - asignar normalmente, acceder mediante ->value en plantillas $smarty->assign($name, $value); } else { // Smarty 3 - asignación estándar $smarty->assign($name, $value); }}Eliminación de Etiquetas {php}
Sección titulada «Eliminación de Etiquetas {php}»El Problema
Sección titulada «El Problema»Smarty 3+ no soporta etiquetas {php} por razones de seguridad:
{* Esto YA NO funciona en Smarty 3+ *}<{assign var="cid" value=$downloads.cid}><{php}> $catid = $this->get_template_vars('cid');<{/php}>Solución: Usar Variables de Smarty
Sección titulada «Solución: Usar Variables de Smarty»{* Usar el acceso a variables incorporado de Smarty *}<{assign var="cid" value=$downloads.cid}><{assign var="catid" value=$smarty.template_vars.cid}>Solución: Mover Lógica a PHP
Sección titulada «Solución: Mover Lógica a PHP»La lógica compleja debe estar en PHP, no en plantillas:
// En PHP - hacer el procesamiento$catid = $downloads['cid'];$categoryInfo = getCategoryInfo($catid);
// Asignar datos procesados a la plantilla$GLOBALS['xoopsTpl']->assign('category', $categoryInfo);{* En plantilla - solo mostrar *}<h2><{$category.name}></h2>Solución: Complementos Personalizados
Sección titulada «Solución: Complementos Personalizados»Para funcionalidad reutilizable, crear complementos Smarty:
function smarty_function_getcategory($params, $smarty){ $catId = $params['id'] ?? 0; $categoryHandler = xoops_getModuleHandler('category', 'mymodule'); $category = $categoryHandler->get($catId);
if ($category) { $smarty->assign($params['assign'], $category->toArray()); }}{* En plantilla *}<{getcategory id=$cid assign="category"}><h2><{$category.name}></h2>Cambios en Caché
Sección titulada «Cambios en Caché»Caché de Smarty 3
Sección titulada «Caché de Smarty 3»// Estilo Smarty 3$smarty->caching = true;$smarty->cache_lifetime = 3600;$smarty->cache_dir = '/path/to/cache';
// Por variable nocache$xoopsTpl->tpl_vars["mod_url"]->nocache = false;Caché de Smarty 4
Sección titulada «Caché de Smarty 4»// Estilo Smarty 4$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);$smarty->setCacheLifetime(3600);$smarty->setCacheDir('/path/to/cache');
// O usando propiedades (aún funciona)$smarty->caching = Smarty::CACHING_LIFETIME_CURRENT;$smarty->cache_lifetime = 3600;Constantes de Caché
Sección titulada «Constantes de Caché»// Modos de cachéSmarty::CACHING_OFF // No cachingSmarty::CACHING_LIFETIME_CURRENT // Usar cache_lifetimeSmarty::CACHING_LIFETIME_SAVED // Usar vida útil en cachéNocache en Plantillas
Sección titulada «Nocache en Plantillas»{* Marcar contenido como nunca en caché *}<{nocache}> <p>Current time: <{$smarty.now|date_format:"%H:%M:%S"}></p><{/nocache}>Cambios en Modificadores
Sección titulada «Cambios en Modificadores»Modificadores de Cadena
Sección titulada «Modificadores de Cadena»Algunos modificadores fueron renombrados u obsoletos:
{* Smarty 3 *}<{$text|escape:'htmlall'}>
{* Smarty 4 - usar 'html' en su lugar *}<{$text|escape:'html'}>Modificadores de Matriz
Sección titulada «Modificadores de Matriz»Los modificadores de matriz requieren el prefijo @:
{* Contar elementos de matriz *}<{$items|@count}> items
{* Unir matriz *}<{$tags|@implode:', '}>
{* JSON encode *}<{$data|@json_encode}>Modificadores Personalizados
Sección titulada «Modificadores Personalizados»Los modificadores personalizados deben registrarse:
// Registrar un modificador personalizado$smarty->registerPlugin('modifier', 'my_modifier', 'my_modifier_function');
function my_modifier_function($string, $param1 = 'default'){ // Procesar y devolver return processed_string($string, $param1);}Cambios en Política de Seguridad
Sección titulada «Cambios en Política de Seguridad»Seguridad de Smarty 4
Sección titulada «Seguridad de Smarty 4»Smarty 4 tiene seguridad por defecto más estricta:
// Configurar política de seguridad$smarty->enableSecurity('Smarty_Security');
// O crear política personalizadaclass MySecurityPolicy extends Smarty_Security{ public $php_functions = ['isset', 'empty', 'count']; public $php_modifiers = ['escape', 'count']; public $allow_super_globals = false;}
$smarty->enableSecurity(new MySecurityPolicy($smarty));Funciones Permitidas
Sección titulada «Funciones Permitidas»Por defecto, Smarty 4 restringe qué funciones PHP se pueden usar:
{* Estos pueden estar restringidos *}<{if isset($variable)}><{if empty($array)}><{$array|@count}>Configurar funciones permitidas si es necesario:
$smarty->security_policy->php_functions = [ 'isset', 'empty', 'count', 'sizeof', 'in_array', 'is_array', 'date', 'time'];Actualizaciones en Herencia de Plantillas
Sección titulada «Actualizaciones en Herencia de Plantillas»Sintaxis de Bloque
Sección titulada «Sintaxis de Bloque»La sintaxis de bloque sigue siendo similar pero con algunos cambios:
{* Plantilla padre *}<html><head> {block name=head} <title>Default Title</title> {/block}</head><body> {block name=content}{/block}</body></html>{* Plantilla hijo *}{extends file="parent.tpl"}
{block name=head} {$smarty.block.parent} {* Incluir contenido del bloque padre *} <meta name="custom" content="value">{/block}
{block name=content} <h1>Mi Contenido</h1>{/block}Agregar y Prepend
Sección titulada «Agregar y Prepend»{block name=head append} {* Esto se añade después del contenido padre *} <link rel="stylesheet" href="extra.css">{/block}
{block name=scripts prepend} {* Esto se añade antes del contenido padre *} <script src="early.js"></script>{/block}Características Obsoletas
Sección titulada «Características Obsoletas»Eliminadas en Smarty 4
Sección titulada «Eliminadas en Smarty 4»| Característica | Alternativa |
|---|---|
Etiquetas {php} | Mover lógica a PHP o usar complementos |
{include_php} | Usar complementos registrados |
$smarty.capture | Aún funciona pero es obsoleto |
{strip} con espacios | Usar herramientas de minificación |
Usar Alternativas
Sección titulada «Usar Alternativas»{* En lugar de {php} *}{* Mover a PHP y asignar resultado *}
{* En lugar de include_php *}<{include file="db:mytemplate.tpl"}>
{* En lugar de capture (aún funciona pero considerar) *}<{capture name="sidebar"}> <h3>Sidebar</h3><{/capture}><div><{$smarty.capture.sidebar}></div>Lista de Verificación de Migración
Sección titulada «Lista de Verificación de Migración»Antes de Migrar
Sección titulada «Antes de Migrar»- Hacer copia de seguridad de todas las plantillas
- Listar todo el uso de etiquetas
{php} - Documentar complementos personalizados
- Probar funcionalidad actual
Durante Migración
Sección titulada «Durante Migración»- Eliminar todas las etiquetas
{php} - Actualizar sintaxis de acceso a variables
- Verificar uso de modificadores
- Actualizar configuración de caché
- Revisar configuración de seguridad
Después de Migración
Sección titulada «Después de Migración»- Probar todas las plantillas
- Verificar que todos los formularios funcionen
- Verificar que el caché funcione
- Probar con diferentes roles de usuario
Pruebas de Compatibilidad
Sección titulada «Pruebas de Compatibilidad»Detección de Versión
Sección titulada «Detección de Versión»// Comprobar versión de Smarty en PHP$version = Smarty::SMARTY_VERSION;
if (version_compare($version, '4.0.0', '>=')) { // Código específico de Smarty 4+} else { // Código de Smarty 3}Comprobación de Versión en Plantilla
Sección titulada «Comprobación de Versión en Plantilla»{* Comprobar versión en plantilla *}<{assign var="smarty_major" value=$smarty.version|regex_replace:'/\\..*$/':''}>
<{if $smarty_major >= 4}> {* Código de plantilla Smarty 4+ *}<{else}> {* Código de plantilla Smarty 3 *}<{/if}>Escribir Plantillas Compatible
Sección titulada «Escribir Plantillas Compatible»Mejores Prácticas
Sección titulada «Mejores Prácticas»-
Evitar etiquetas
{php}por completo - No funcionan en Smarty 3+ -
Mantener plantillas simples - La lógica compleja pertenece en PHP
-
Usar modificadores estándar - Evitar los obsoletos
-
Probar en ambas versiones - Si necesita soportar ambas
-
Usar complementos para operaciones complejas - Más mantenible
Ejemplo: Plantilla Compatible
Sección titulada «Ejemplo: Plantilla Compatible»{* Funciona en Smarty 3 y 4 *}<!DOCTYPE html><html><head> <title><{$page_title|default:'Default Title'|escape}></title></head><body> <{if isset($items) && $items|@count > 0}> <ul> <{foreach $items as $item}> <li><{$item.name|escape}></li> <{/foreach}> </ul> <{else}> <p>No items found.</p> <{/if}></body></html>Problemas Comunes de Migración
Sección titulada «Problemas Comunes de Migración»Problema: Las Variables Devuelven Vacío
Sección titulada «Problema: Las Variables Devuelven Vacío»Problema: <{$mod_url}> devuelve nada en Smarty 4
Solución: Usar <{$mod_url->value}> o habilitar modo de compatibilidad
Problema: Errores de Etiqueta PHP
Sección titulada «Problema: Errores de Etiqueta PHP»Problema: La plantilla genera error en etiquetas {php}
Solución: Eliminar todas las etiquetas PHP y mover lógica a archivos PHP
Problema: Modificador No Encontrado
Sección titulada «Problema: Modificador No Encontrado»Problema: El modificador personalizado genera error “unknown modifier”
Solución: Registrar el modificador con registerPlugin()
Problema: Restricción de Seguridad
Sección titulada «Problema: Restricción de Seguridad»Problema: Función no permitida en plantilla
Solución: Agregar función a la lista permitida de la política de seguridad
#smarty #migration #upgrade #xoops #smarty4 #compatibility