Smarty Templating in XOOPS¶
Overview¶
XOOPS uses the Smarty template engine for separating presentation from logic. This guide covers Smarty syntax, XOOPS-specific features, and template best practices.
Basic Syntax¶
Variables¶
{* Scalar variables *}
<{$variable}>
<{$article.title}>
<{$user->getUsername()}>
{* Array access *}
<{$items[0]}>
<{$config['setting']}>
{* Default values *}
<{$title|default:'Untitled'}>
Modifiers¶
{* 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}>
Conditionals¶
{* 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}>
Loops¶
{* 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}>
Sections (Legacy)¶
XOOPS-Specific Features¶
Global Variables¶
{* 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}>
Including Files¶
{* 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"}>
Block Display¶
{* In theme.html *}
<{foreach item=block from=$xoops_lblocks}>
<div class="block">
<{if $block.title}>
<h3><{$block.title}></h3>
<{/if}>
<{$block.content}>
</div>
<{/foreach}>
Form Integration¶
{* 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>
Custom Functions¶
Registered by XOOPS¶
{* XoopsFormLoader *}
<{xoFormLoader form=$form}>
{* Breadcrumb *}
<{xoBreadcrumb}>
{* Module menu *}
<{xoModuleMenu}>
Custom Plugins¶
// include/smarty_plugins/function.myfunction.php
function smarty_function_myfunction($params, $smarty)
{
$name = $params['name'] ?? 'World';
return "Hello, {$name}!";
}
Template Organization¶
Recommended Structure¶
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.tpl
Partial Templates¶
{* 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}>
Performance¶
Caching¶
// In PHP
$xoopsTpl->caching = 1;
$xoopsTpl->cache_lifetime = 3600; // 1 hour
// Check if cached
if (!$xoopsTpl->is_cached('mymodule_index.tpl')) {
// Fetch data only if not cached
$items = $handler->getObjects();
$xoopsTpl->assign('items', $items);
}
Clear Cache¶
// Clear specific template
$xoopsTpl->clear_cache('mymodule_index.tpl');
// Clear all module templates
$xoopsTpl->clear_all_cache();
Best Practices¶
- Escape Output - Always escape user-generated content
- Use Modifiers - Apply appropriate transformations
- Keep Logic Minimal - Complex logic belongs in PHP
- Use Partials - Reuse common template fragments
- Semantic HTML - Use proper HTML5 elements
- Accessibility - Include ARIA attributes where needed
Related Documentation¶
- Theme-Development - Theme creation
- Template-System - XOOPS template API
- Block-Development - Block templates
- Form-Elements - Form rendering