Plantillas Smarty en XOOPS
Descripción General
Sección titulada «Descripción General»XOOPS utiliza el motor de plantillas Smarty para separar la presentación de la lógica. Esta guía cubre la sintaxis de Smarty, características específicas de XOOPS y mejores prácticas de plantillas.
Sintaxis Básica
Sección titulada «Sintaxis Básica»Variables
Sección titulada «Variables»{* Scalar variables *}<{$variable}><{$article.title}><{$user->getUsername()}>
{* Array access *}<{$items[0]}><{$config['setting']}>
{* Default values *}<{$title|default:'Untitled'}>Modificadores
Sección titulada «Modificadores»{* Text transformations *}<{$text|upper}><{$text|lower}><{$text|capitalize}><{$text|truncate:100:'...'}>
{* HTML handling *}<{$content|strip_tags}><{$html|escape:'html'}><{$url|escape:'url'}>
{* Date formatting *}<{$timestamp|date_format:'%Y-%m-%d'}><{$date|date_format:$xoops_config.dateformat}>
{* Chaining modifiers *}<{$text|strip_tags|truncate:50|escape}>Condicionales
Sección titulada «Condicionales»{* If/else *}<{if $logged_in}> Welcome, <{$username}>!<{elseif $is_guest}> Please log in.<{else}> Unknown state.<{/if}>
{* Comparisons *}<{if $count > 0}><{if $status == 'published'}><{if $items|@count >= 5}>
{* Logical operators *}<{if $is_admin && $can_edit}><{if $type == 'news' || $type == 'article'}><{if !$is_hidden}>{* Foreach with items *}<{foreach item=article from=$articles}> <h2><{$article.title}></h2><{/foreach}>
{* With key *}<{foreach key=id item=value from=$items}> <{$id}>: <{$value}><{/foreach}>
{* With iteration info *}<{foreach item=item from=$items name=itemloop}> <{$smarty.foreach.itemloop.index}> <{$smarty.foreach.itemloop.iteration}> <{$smarty.foreach.itemloop.first}> <{$smarty.foreach.itemloop.last}><{/foreach}>
{* Foreachelse for empty arrays *}<{foreach item=item from=$items}> <{$item.name}><{foreachelse}> No items found.<{/foreach}>Secciones (Heredado)
Sección titulada «Secciones (Heredado)»<{section name=i loop=$items}> <{$items[i].title}><{/section}>Características Específicas de XOOPS
Sección titulada «Características Específicas de XOOPS»Variables Globales
Sección titulada «Variables Globales»{* Site info *}<{$xoops_sitename}><{$xoops_url}><{$xoops_rootpath}><{$xoops_theme}>
{* User info *}<{$xoops_isuser}><{$xoops_isadmin}><{$xoops_userid}><{$xoops_uname}>
{* Module info *}<{$xoops_dirname}><{$xoops_pagetitle}>
{* Meta *}<{$xoops_meta_keywords}><{$xoops_meta_description}>Incluir Archivos
Sección titulada «Incluir Archivos»{* Include from theme *}<{include file="theme:header.html"}>
{* Include from module *}<{include file="db:modulename_partial.tpl"}>
{* Include with variables *}<{include file="db:mymodule_item.tpl" item=$article}>
{* Include from file system *}<{include file="$xoops_rootpath/modules/mymodule/templates/partial.tpl"}>Mostrar Bloques
Sección titulada «Mostrar Bloques»{* In theme.html *}<{foreach item=block from=$xoops_lblocks}> <div class="block"> <{if $block.title}> <h3><{$block.title}></h3> <{/if}> <{$block.content}> </div><{/foreach}>Integración de Formularios
Sección titulada «Integración de Formularios»{* XoopsForm rendering *}<{$form.javascript}><form action="<{$form.action}>" method="<{$form.method}>"> <{foreach item=element from=$form.elements}> <div class="form-group"> <label><{$element.caption}></label> <{$element.body}> <{if $element.description}> <small><{$element.description}></small> <{/if}> </div> <{/foreach}></form>Funciones Personalizadas
Sección titulada «Funciones Personalizadas»Registradas por XOOPS
Sección titulada «Registradas por XOOPS»{* XoopsFormLoader *}<{xoFormLoader form=$form}>
{* Breadcrumb *}<{xoBreadcrumb}>
{* Module menu *}<{xoModuleMenu}>Complementos Personalizados
Sección titulada «Complementos Personalizados»function smarty_function_myfunction($params, $smarty){ $name = $params['name'] ?? 'World'; return "Hello, {$name}!";}<{myfunction name="XOOPS"}>Organización de Plantillas
Sección titulada «Organización de Plantillas»Estructura Recomendada
Sección titulada «Estructura Recomendada»templates/├── admin/│ ├── index.tpl│ ├── item_list.tpl│ └── item_form.tpl├── blocks/│ ├── recent.tpl│ └── popular.tpl├── frontend/│ ├── index.tpl│ ├── item_view.tpl│ └── item_list.tpl└── partials/ ├── _header.tpl ├── _footer.tpl └── _pagination.tplPlantillas Parciales
Sección titulada «Plantillas Parciales»{* partials/_pagination.tpl *}<nav class="pagination"> <{if $page > 1}> <a href="<{$base_url}>&page=<{$page-1}>">Previous</a> <{/if}>
<span>Page <{$page}> of <{$total_pages}></span>
<{if $page < $total_pages}> <a href="<{$base_url}>&page=<{$page+1}>">Next</a> <{/if}></nav>
{* Usage *}<{include file="db:mymodule_pagination.tpl" page=$current_page total_pages=$pages base_url=$url}>Rendimiento
Sección titulada «Rendimiento»// In PHP$xoopsTpl->caching = 1;$xoopsTpl->cache_lifetime = 3600; // 1 hour
// Check if cachedif (!$xoopsTpl->is_cached('mymodule_index.tpl')) { // Fetch data only if not cached $items = $handler->getObjects(); $xoopsTpl->assign('items', $items);}Limpiar Caché
Sección titulada «Limpiar Caché»// Clear specific template$xoopsTpl->clear_cache('mymodule_index.tpl');
// Clear all module templates$xoopsTpl->clear_all_cache();Mejores Prácticas
Sección titulada «Mejores Prácticas»- Escapar Salida - Siempre escapar contenido generado por el usuario
- Usar Modificadores - Aplicar transformaciones apropiadas
- Mantener la Lógica Mínima - La lógica compleja pertenece en PHP
- Usar Parciales - Reutilizar fragmentos de plantilla comunes
- HTML Semántico - Usar elementos HTML5 apropiados
- Accesibilidad - Incluir atributos ARIA donde sea necesario
Documentación Relacionada
Sección titulada «Documentación Relacionada»- Theme-Development - Creación de temas
- ../../04-API-Reference/Template/Template-System - API de plantillas XOOPS
- ../../03-Module-Development/Block-Development - Plantillas de bloques
- ../Forms/Form-Elements - Renderización de formularios