ADR-003 - Motor de Plantillas
ADR-003: Motor de Plantillas (Smarty)
Sección titulada «ADR-003: Motor de Plantillas (Smarty)»Registro de Decisión Arquitectónica para la adopción del motor de plantillas Smarty de XOOPS.
Aceptado - Decisión central desde XOOPS 2.0
Evolucionando - Migración a Smarty 4/5 planeada para XOOPS 4.0
Contexto
Sección titulada «Contexto»XOOPS necesitaba una solución de plantillas que:
- Separe la presentación de la lógica de negocio
- Permita a diseñadores de temas trabajar sin conocimiento de PHP
- Apoye herencia de plantillas e inclusiones
- Proporcione almacenamiento en caché para rendimiento
- Permita plantillas personalizables por el usuario
- Apoye internacionalización
Diagrama de Decisión
Sección titulada «Diagrama de Decisión»flowchart TB subgraph "PHP Layer" A[Module Controller] B[Template Variables] end
subgraph "Smarty Engine" C[Smarty Core] D[Template Compiler] E[Cache Manager] end
subgraph "Templates" F[Module Templates] G[Theme Templates] H[Block Templates] end
subgraph "Output" I[Compiled PHP] J[Cached HTML] K[Final HTML] end
A --> B B --> C C --> D C --> E D --> F D --> G D --> H F --> I G --> I H --> I E --> J I --> K J --> KDecisión
Sección titulada «Decisión»Usaremos Smarty como motor de plantillas porque:
1. Separación de Responsabilidades
Sección titulada «1. Separación de Responsabilidades»// PHP (Controller) - Business logic$items = $itemHandler->getPublishedItems();$xoopsTpl->assign('items', $items);
// Smarty (View) - Presentation// templates/items.tpl{* Smarty template - No PHP logic *}<{foreach item=item from=$items}> <article> <h2><{$item.title}></h2> <p><{$item.summary}></p> </article><{/foreach}>2. Delimitadores de XOOPS
Sección titulada «2. Delimitadores de XOOPS»XOOPS usa <{ y }> en lugar de estándar { }:
{* Standard Smarty *}{$variable}
{* XOOPS Smarty - Avoids JavaScript conflicts *}<{$variable}>3. Jerarquía de Plantillas
Sección titulada «3. Jerarquía de Plantillas»graph TB A[Theme Master Template<br>theme.html] --> B[Module Template<br>module_index.tpl] A --> C[Block Templates<br>block_*.tpl] B --> D[Partial Templates<br>_header.tpl] B --> E[Partial Templates<br>_footer.tpl]
style A fill:#f9f,stroke:#333 style B fill:#9ff,stroke:#333 style C fill:#ff9,stroke:#3334. Almacenamiento de Plantillas
Sección titulada «4. Almacenamiento de Plantillas»- Base de Datos: Plantillas personalizadas almacenadas para capacidad de reversión
- Sistema de Archivos: Plantillas originales en directorios de módulos
- Caché: Plantillas compiladas para rendimiento
Configuración de Smarty
Sección titulada «Configuración de Smarty»// XOOPS Smarty initialization$xoopsTpl = new XoopsTpl();
// Custom delimiters$xoopsTpl->left_delim = '<{';$xoopsTpl->right_delim = '}>';
// Caching$xoopsTpl->caching = XOOPS_TEMPLATE_CACHE;$xoopsTpl->cache_lifetime = 3600;
// Security$xoopsTpl->security_policy = new Smarty_Security($xoopsTpl);$xoopsTpl->security_policy->php_functions = [];$xoopsTpl->security_policy->php_modifiers = ['escape', 'count'];Características de Plantillas Usadas
Sección titulada «Características de Plantillas Usadas»Variables
Sección titulada «Variables»{* Simple variable *}<{$title}>
{* Object property *}<{$item.title}>
{* With modifier *}<{$content|truncate:200:'...'}>
{* Escaped output *}<{$userInput|escape:'html'}>Estructuras de Control
Sección titulada «Estructuras de Control»{* Conditional *}<{if $isAdmin}> <a href="admin.php">Admin</a><{elseif $isUser}> <a href="profile.php">Profile</a><{else}> <a href="login.php">Login</a><{/if}>
{* Loop *}<{foreach item=item from=$items name=itemloop}> <{$smarty.foreach.itemloop.index}>: <{$item.title}><{/foreach}>Inclusiones
Sección titulada «Inclusiones»{* Include another template *}<{include file="db:mymodule_header.tpl"}>
{* Include with variables *}<{include file="db:mymodule_item.tpl" item=$currentItem}>
{* Include from theme *}<{include file="file:$theme_path/partials/sidebar.tpl"}>Consecuencias
Sección titulada «Consecuencias»Positivas
Sección titulada «Positivas»- Amigable para diseñadores: Sintaxis similar a HTML
- Almacenamiento en caché: Caché de plantillas incorporado
- Seguridad: Aislamiento de código PHP
- Flexibilidad: Modificadores, funciones, complementos
- Personalización: Los usuarios pueden modificar plantillas
- Comunidad: Gran ecosistema de Smarty
Negativas
Sección titulada «Negativas»- Curva de aprendizaje: Sintaxis específica de Smarty
- Sobrecarga: Se requiere paso de compilación
- Depuración: Los errores de plantilla pueden ser crípticos
- Problemas de versión: Cambios importantes entre versiones
Mitigaciones
Sección titulada «Mitigaciones»- Aprendizaje: Documentación completa
- Rendimiento: Caché agresivo
- Depuración: Consola de depuración, mensajes de error claros
- Versiones: Capa de compatibilidad en XOOPS
Historial de Versiones
Sección titulada «Historial de Versiones»timeline title Smarty in XOOPS 2003 : Smarty 2.x : Initial integration 2013 : Smarty 3.0 : XOOPS 2.5.5 2020 : Smarty 3.1 : XOOPS 2.5.10 2026 : Smarty 4/5 : XOOPS 4.0Migración: Smarty 3 a 4/5
Sección titulada «Migración: Smarty 3 a 4/5»Cambios Importantes
Sección titulada «Cambios Importantes»{* Smarty 3 - Deprecated *}<{php}>echo date('Y');<{/php}>
{* Smarty 4+ - Use modifiers or assign from PHP *}<{$current_year}>
{* Smarty 3 - {section} deprecated *}<{section name=i loop=$items}> <{$items[i].title}><{/section}>
{* Smarty 4+ - Use {foreach} *}<{foreach $items as $item}> <{$item.title}><{/foreach}>Capa de Compatibilidad
Sección titulada «Capa de Compatibilidad»XOOPS proporciona una capa de compatibilidad para transiciones sin problemas:
// XoopsTpl extends Smarty with compatibility methodsclass XoopsTpl extends Smarty{ public function assign($tpl_var, $value = null) { // Handles both Smarty 3 and 4 syntax return parent::assign($tpl_var, $value); }}Alternativas Consideradas
Sección titulada «Alternativas Consideradas»1. Twig
Sección titulada «1. Twig»Pros: Moderno, ecosistema Symfony Cons: Sintaxis diferente, esfuerzo de migración Decisión: Posible opción futura para XOOPS 3.x
2. Blade (Laravel)
Sección titulada «2. Blade (Laravel)»Pros: Sintaxis limpia, popular Cons: Específico de Laravel Decisión: No adecuado para uso independiente
3. Plantillas PHP Nativas
Sección titulada «3. Plantillas PHP Nativas»Pros: Sin curva de aprendizaje, rápido Cons: Riesgos de seguridad, sin separación Decisión: Rechazado por mantenibilidad
Decisiones Relacionadas
Sección titulada «Decisiones Relacionadas»- ADR-001: Arquitectura Modular
- ADR-002: Abstracción de Base de Datos
Referencias
Sección titulada «Referencias»- Documentación de Smarty: https://www.smarty.net/docs/en/
- Guía del Sistema de Plantillas de XOOPS
- Patrón MVC en Aplicaciones Web
#xoops #architecture #adr #smarty #templates #design-decision