Fondamenti di Smarty
2.5.x: Smarty 3 4.0.x: Smarty 4
Smarty è un motore di template per PHP che consente agli sviluppatori di separare la presentazione (HTML/CSS) dalla logica dell’applicazione. XOOPS usa Smarty per tutti i suoi esigenze di creazione di template, abilitando una separazione pulita tra il codice PHP e l’output HTML.
Documentazione Correlata
Sezione intitolata “Documentazione Correlata”- Theme-Development - Creazione di temi XOOPS
- Template-Variables - Variabili disponibili nei template
- Smarty-4-Migration - Aggiornamento da Smarty 3 a 4
Cos’è Smarty?
Sezione intitolata “Cos’è Smarty?”Smarty fornisce:
- Separazione delle Preoccupazioni: Mantieni HTML nei template, logica PHP nelle classi
- Eredità del Template: Crea layout complessi da blocchi semplici
- Caching: Migliora le prestazioni con template compilati
- Modificatori: Trasforma l’output con funzioni integrate o personalizzate
- Sicurezza: Controlla quali funzioni PHP possono accedere ai template
Configurazione di Smarty in XOOPS
Sezione intitolata “Configurazione di Smarty in XOOPS”XOOPS configura Smarty con delimitatori personalizzati:
Smarty Predefinito: { e }XOOPS Smarty: <{ e }>Ciò previene conflitti con il codice JavaScript nei template.
Sintassi Basica
Sezione intitolata “Sintassi Basica”Variabili
Sezione intitolata “Variabili”Le variabili vengono passate da PHP ai template:
// In PHP$GLOBALS['xoopsTpl']->assign('title', 'My Page Title');$GLOBALS['xoopsTpl']->assign('count', 42);{* Nel template *}<h1><{$title}></h1><p>Total items: <{$count}></p>Accesso all’Array
Sezione intitolata “Accesso all’Array”// PHP$item = [ 'id' => 1, 'title' => 'Article Title', 'author' => 'John Doe'];$GLOBALS['xoopsTpl']->assign('item', $item);{* Template *}<h2><{$item.title}></h2><p>By: <{$item.author}></p>Proprietà dell’Oggetto
Sezione intitolata “Proprietà dell’Oggetto”// PHP$GLOBALS['xoopsTpl']->assign('user', $xoopsUser);{* Template *}<p>Welcome, <{$user->getVar('uname')}>!</p>Commenti
Sezione intitolata “Commenti”I commenti in Smarty non vengono renderizzati in HTML:
{* Questo è un commento - non apparirà nell'output HTML *}
{* I commenti su più righe sono anche supportati*}Strutture di Controllo
Sezione intitolata “Strutture di Controllo”Istruzioni If/Else
Sezione intitolata “Istruzioni If/Else”<{if $user_logged_in}> <p>Welcome back!</p><{elseif $is_guest}> <p>Hello, Guest!</p><{else}> <p>Please log in.</p><{/if}>Operatori di Confronto
Sezione intitolata “Operatori di Confronto”{* Uguaglianza *}<{if $status == 'published'}>Published<{/if}><{if $status eq 'published'}>Published<{/if}>
{* Disuguaglianza *}<{if $count != 0}>Has items<{/if}><{if $count neq 0}>Has items<{/if}>
{* Maggiore/Minore di *}<{if $count > 10}>Many items<{/if}><{if $count gt 10}>Many items<{/if}><{if $count < 5}>Few items<{/if}><{if $count lt 5}>Few items<{/if}>
{* Maggiore/Minore o uguale *}<{if $count >= 10}>Ten or more<{/if}><{if $count gte 10}>Ten or more<{/if}><{if $count <= 5}>Five or less<{/if}><{if $count lte 5}>Five or less<{/if}>
{* Operatori logici *}<{if $logged_in && $is_admin}>Admin Panel<{/if}><{if $logged_in and $is_admin}>Admin Panel<{/if}><{if $option1 || $option2}>One option selected<{/if}><{if $option1 or $option2}>One option selected<{/if}><{if !$is_banned}>Access granted<{/if}><{if not $is_banned}>Access granted<{/if}>Verifica di Vuoto/Isset
Sezione intitolata “Verifica di Vuoto/Isset”{* Verifica che la variabile esista e abbia valore *}<{if $title}> <h1><{$title}></h1><{/if}>
{* Verifica che l'array non sia vuoto *}<{if $items|@count > 0}> <ul> <{foreach $items as $item}> <li><{$item.name}></li> <{/foreach}> </ul><{/if}>
{* Utilizzo di isset *}<{if isset($description)}> <p><{$description}></p><{/if}>Cicli Foreach
Sezione intitolata “Cicli Foreach”{* Foreach basico *}<ul><{foreach $items as $item}> <li><{$item.name}></li><{/foreach}></ul>
{* Con chiave *}<{foreach $options as $key => $value}> <option value="<{$key}>"><{$value}></option><{/foreach}>
{* Con @index, @first, @last *}<{foreach $items as $item}> <{if $item@first}><ul><{/if}> <li class="item-<{$item@index}>"><{$item.name}></li> <{if $item@last}></ul><{/if}><{/foreach}>
{* Colori riga alternati *}<{foreach $rows as $row}> <tr class="<{if $row@iteration is odd}>odd<{else}>even<{/if}>"> <td><{$row.name}></td> </tr><{/foreach}>
{* Foreachelse per array vuoti *}<{foreach $items as $item}> <li><{$item.name}></li><{foreachelse}> <li>No items found.</li><{/foreach}>Cicli For
Sezione intitolata “Cicli For”<{for $i=1 to 10}> <p>Item <{$i}></p><{/for}>
<{for $i=10 to 1 step -1}> <p>Countdown: <{$i}></p><{/for}>Cicli While
Sezione intitolata “Cicli While”<{while $count > 0}> <p><{$count}></p> <{$count = $count - 1}><{/while}>Modificatori di Variabile
Sezione intitolata “Modificatori di Variabile”I modificatori trasformano l’output della variabile:
Modificatori di Stringa
Sezione intitolata “Modificatori di Stringa”{* Escape HTML (usa sempre per l'input dell'utente!) *}<{$title|escape}><{$title|escape:'html'}>
{* Codifica URL *}<{$url|escape:'url'}>
{* Maiuscolo/Minuscolo *}<{$name|upper}><{$name|lower}><{$name|capitalize}>
{* Tronca testo *}<{$content|truncate:100:'...'}>
{* Rimuovi tag HTML *}<{$html|strip_tags}>
{* Sostituisci *}<{$text|replace:'old':'new'}>
{* A capo parola *}<{$text|wordwrap:80:"\n"}>
{* Valore predefinito *}<{$optional_var|default:'No value'}>Modificatori Numerici
Sezione intitolata “Modificatori Numerici”{* Formattazione numero *}<{$price|string_format:"%.2f"}><{$count|number_format}>
{* Formattazione data *}<{$timestamp|date_format:"%B %e, %Y"}><{$timestamp|date_format:"%Y-%m-%d %H:%M"}>Modificatori di Array
Sezione intitolata “Modificatori di Array”{* Conta elementi *}<{$items|@count}> items
{* Unisci array *}<{$tags|@implode:', '}>
{* Codifica JSON *}<{$data|@json_encode}>Concatenamento di Modificatori
Sezione intitolata “Concatenamento di Modificatori”<{$content|strip_tags|truncate:200:'...'|escape}>Include e Insert
Sezione intitolata “Include e Insert”Inclusi di Altri Template
Sezione intitolata “Inclusi di Altri Template”{* Includi un file di template *}<{include file="db:mymodule_header.tpl"}>
{* Includi con variabili *}<{include file="db:mymodule_item.tpl" item=$currentItem}>
{* Includi con variabili assegnate *}<{include file="db:sidebar.tpl" assign="sidebar_content"}><div class="sidebar"><{$sidebar_content}></div>Inserimento di Contenuto Dinamico
Sezione intitolata “Inserimento di Contenuto Dinamico”{* Insert chiama una funzione PHP per il contenuto dinamico *}<{insert name="getBanner"}>Assegna Variabili nei Template
Sezione intitolata “Assegna Variabili nei Template”{* Assegnazione semplice *}<{assign var="page_title" value="Welcome"}><{$page_title = "Welcome"}>
{* Assegnazione da espressione *}<{assign var="full_name" value="`$first_name` `$last_name`"}>
{* Contenuto del blocco di cattura *}<{capture name="sidebar"}> <h3>Sidebar</h3> <ul> <li>Link 1</li> <li>Link 2</li> </ul><{/capture}><div class="sidebar"><{$smarty.capture.sidebar}></div>Variabili Smarty Integrate
Sezione intitolata “Variabili Smarty Integrate”Variabile $smarty
Sezione intitolata “Variabile $smarty”{* Timestamp corrente *}<{$smarty.now|date_format:"%Y-%m-%d"}>
{* Variabili di richiesta *}<{$smarty.get.page}><{$smarty.post.username}><{$smarty.request.id}><{$smarty.cookies.session_id}><{$smarty.server.HTTP_HOST}>
{* Costanti *}<{$smarty.const.XOOPS_URL}>
{* Variabili di configurazione *}<{$smarty.config.var_name}>
{* Informazioni del template *}<{$smarty.template}><{$smarty.current_dir}>
{* Versione di Smarty *}<{$smarty.version}>
{* Proprietà Sezione/Foreach *}<{$smarty.foreach.items.index}><{$smarty.foreach.items.iteration}><{$smarty.foreach.items.first}><{$smarty.foreach.items.last}>Blocchi Letterali
Sezione intitolata “Blocchi Letterali”Per JavaScript con parentesi graffe:
<{literal}><script> var config = { url: 'https://example.com', count: 10 }; if (config.count > 5) { console.log('Many items'); }</script><{/literal}>Oppure usa variabili Smarty all’interno di JavaScript:
<script>var moduleUrl = '<{$xoops_url}>/modules/mymodule';var items = <{$items_json}>;</script>Funzioni Personalizzate
Sezione intitolata “Funzioni Personalizzate”XOOPS fornisce funzioni Smarty personalizzate:
{* URL dell'Immagine XOOPS *}<img src="<{xoImgUrl}>images/logo.png" alt="Logo">
{* URL del Modulo XOOPS *}<a href="<{xoModuleUrl}>">Module Home</a>
{* URL dell'App *}<a href="<{xoAppUrl 'item.php'}>?id=<{$item.id}>">View Item</a>Best Practice
Sezione intitolata “Best Practice”Sempre Sfuggi l’Output
Sezione intitolata “Sempre Sfuggi l’Output”{* Per il contenuto generato dall'utente, sempre sfuggi *}<p><{$user_comment|escape}></p>
{* Per il contenuto HTML, usa il metodo appropriato *}<div><{$content}></div> {* Solo se il contenuto è pre-sanitizzato *}Usa Nomi Variabili Significativi
Sezione intitolata “Usa Nomi Variabili Significativi”// Buono$GLOBALS['xoopsTpl']->assign('article_title', $title);$GLOBALS['xoopsTpl']->assign('article_items', $items);
// Evita$GLOBALS['xoopsTpl']->assign('t', $title);$GLOBALS['xoopsTpl']->assign('arr', $items);Mantieni la Logica Minima
Sezione intitolata “Mantieni la Logica Minima”I template dovrebbero concentrarsi sulla presentazione. Sposta la logica complessa a PHP:
{* Evita la logica complessa nei template *}{* Cattivo *}<{if $user && $user->getVar('level') > 5 && $user->getVar('status') == 'active' && $permissions|in_array:'edit'}>
{* Buono - calcola in PHP e passa una semplice bandiera *}<{if $can_edit}>Usa l’Eredità del Template
Sezione intitolata “Usa l’Eredità del Template”Per layout coerenti, usa l’eredità del template (vedi Theme-Development).
Debug dei Template
Sezione intitolata “Debug dei Template”Console di Debug
Sezione intitolata “Console di Debug”{* Mostra tutte le variabili assegnate *}<{debug}>Output Temporaneo
Sezione intitolata “Output Temporaneo”{* Debug variabile specifica *}<pre><{$variable|@print_r}></pre><pre><{$variable|@var_export}></pre>Pattern Comuni di Template XOOPS
Sezione intitolata “Pattern Comuni di Template XOOPS”Struttura del Template del Modulo
Sezione intitolata “Struttura del Template del Modulo”{* Intestazione del modulo *}<div class="mymodule"> <h2><{$module_name}></h2>
{* Breadcrumb *} <{if $breadcrumb}> <nav class="breadcrumb"> <{foreach $breadcrumb as $crumb}> <{if $crumb@last}> <span><{$crumb.title}></span> <{else}> <a href="<{$crumb.link}>"><{$crumb.title}></a> » <{/if}> <{/foreach}> </nav> <{/if}>
{* Contenuto *} <div class="content"> <{$content}> </div></div>Paginazione
Sezione intitolata “Paginazione”<{if $page_nav}><div class="pagination"> <{$page_nav}></div><{/if}>Visualizzazione del Modulo
Sezione intitolata “Visualizzazione del Modulo”<{if $form}><div class="form-container"> <{$form}></div><{/if}>#smarty #templates #xoops #frontend #template-engine