Smarty 4 Migrace
Tato příručka popisuje změny a kroky migrace potřebné při upgradu ze Smarty 3 na Smarty 4 v XOOPS. Pochopení těchto rozdílů je nezbytné pro zachování kompatibility s moderními instalacemi XOOPS.
Související dokumentace
Sekce “Související dokumentace”- Smarty-Základy - Základy Smarty v XOOPS
- Vývoj motivů - Vytváření motivů XOOPS
- Template-Variables - Dostupné proměnné v šablonách
Přehled změn
Sekce “Přehled změn”Smarty 4 představil několik zásadních změn oproti Smarty 3:
- Změnilo se chování přiřazení proměnných
- Štítky
{php}zcela odstraněny - Ukládání změn do mezipaměti API
- Modifikátor obsluhující aktualizace
- Změny bezpečnostní politiky
- Zastaralé funkce byly odstraněny
Změny variabilního přístupu
Sekce “Změny variabilního přístupu”Problém
Sekce “Problém”V Smarty 2/3 byly přiřazené hodnoty přímo přístupné:
// PHP$GLOBALS['xoopsTpl']->assign('mod_url', $helper->url());{* Smarty 2/3 - worked fine *}<img src="<{$mod_url}>/assets/images/icon.png">V Smarty 4 jsou proměnné zabaleny do objektů Smarty_Variable:
Smarty_Variable Object( [value] => http://example.com/modules/mymodule/ [nocache] =>)Řešení 1: Otevřete vlastnost Value
Sekce “Řešení 1: Otevřete vlastnost Value”{* Smarty 4 - access the value property *}<img src="<{$mod_url->value}>/assets/images/icon.png">Řešení 2: Režim kompatibility
Sekce “Řešení 2: Režim kompatibility”Povolte režim kompatibility v PHP:
$smarty = new Smarty();$smarty->setCompatibilityMode(true);To umožňuje přímý variabilní přístup jako Smarty 3.
Řešení 3: Podmíněná kontrola verze
Sekce “Řešení 3: Podmíněná kontrola verze”Napište šablony, které fungují v obou verzích:
<{if $smarty.version|regex_replace:'[^0-9]':'' >= 4}> <{$mod_url->value}><{else}> <{$mod_url}><{/if}>Řešení 4: Funkce Wrapper
Sekce “Řešení 4: Funkce Wrapper”Vytvořte pomocnou funkci pro úkoly:
function smartyAssign($smarty, $name, $value){ if (version_compare($smarty->version, '4.0.0', '>=')) { // Smarty 4+ - assign normally, access via ->value in templates $smarty->assign($name, $value); } else { // Smarty 3 - standard assignment $smarty->assign($name, $value); }}Odebírání značek {php}
Sekce “Odebírání značek {php}”Problém
Sekce “Problém”Smarty 3+ z bezpečnostních důvodů nepodporuje značky {php}:
{* This NO LONGER works in Smarty 3+ *}<{assign var="cid" value=$downloads.cid}><{php}> $catid = $this->get_template_vars('cid');<{/php}>Řešení: Použijte proměnné Smarty
Sekce “Řešení: Použijte proměnné Smarty”{* Use Smarty's built-in variable access *}<{assign var="cid" value=$downloads.cid}><{assign var="catid" value=$smarty.template_vars.cid}>Řešení: Přesuňte logiku na PHP
Sekce “Řešení: Přesuňte logiku na PHP”Komplexní logika by měla být v PHP, nikoli v šablonách:
// In PHP - do the processing$catid = $downloads['cid'];$categoryInfo = getCategoryInfo($catid);
// Assign processed data to template$GLOBALS['xoopsTpl']->assign('category', $categoryInfo);{* In template - just display *}<h2><{$category.name}></h2>Řešení: Vlastní pluginy
Sekce “Řešení: Vlastní pluginy”Pro opakovaně použitelné funkce vytvořte pluginy 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()); }}{* In template *}<{getcategory id=$cid assign="category"}><h2><{$category.name}></h2>Změny v mezipaměti
Sekce “Změny v mezipaměti”Smarty 3 Ukládání do mezipaměti
Sekce “Smarty 3 Ukládání do mezipaměti”// Smarty 3 style$smarty->caching = true;$smarty->cache_lifetime = 3600;$smarty->cache_dir = '/path/to/cache';
// Per-variable nocache$xoopsTpl->tpl_vars["mod_url"]->nocache = false;Smarty 4 Ukládání do mezipaměti
Sekce “Smarty 4 Ukládání do mezipaměti”// Smarty 4 style$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);$smarty->setCacheLifetime(3600);$smarty->setCacheDir('/path/to/cache');
// Or using properties (still works)$smarty->caching = Smarty::CACHING_LIFETIME_CURRENT;$smarty->cache_lifetime = 3600;Ukládání konstant do mezipaměti
Sekce “Ukládání konstant do mezipaměti”// Caching modesSmarty::CACHING_OFF // No cachingSmarty::CACHING_LIFETIME_CURRENT // Use cache_lifetimeSmarty::CACHING_LIFETIME_SAVED // Use cached lifetimeNocache v šablonách
Sekce “Nocache v šablonách”{* Mark content as never cached *}<{nocache}> <p>Current time: <{$smarty.now|date_format:"%H:%M:%S"}></p><{/nocache}>Změny modifikátoru
Sekce “Změny modifikátoru”Modifikátory řetězců
Sekce “Modifikátory řetězců”Některé modifikátory byly přejmenovány nebo zastaralé:
{* Smarty 3 *}<{$text|escape:'htmlall'}>
{* Smarty 4 - use 'html' instead *}<{$text|escape:'html'}>Modifikátory pole
Sekce “Modifikátory pole”Modifikátory pole vyžadují předponu @:
{* Count array elements *}<{$items|@count}> items
{* Join array *}<{$tags|@implode:', '}>
{* JSON encode *}<{$data|@json_encode}>Vlastní modifikátory
Sekce “Vlastní modifikátory”Vlastní modifikátory musí být zaregistrovány:
// Register a custom modifier$smarty->registerPlugin('modifier', 'my_modifier', 'my_modifier_function');
function my_modifier_function($string, $param1 = 'default'){ // Process and return return processed_string($string, $param1);}Změny zásad zabezpečení
Sekce “Změny zásad zabezpečení”Smarty 4 Zabezpečení
Sekce “Smarty 4 Zabezpečení”Smarty 4 má přísnější výchozí zabezpečení:
// Configure security policy$smarty->enableSecurity('Smarty_Security');
// Or create custom policyclass 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));Povolené funkce
Sekce “Povolené funkce”Ve výchozím nastavení Smarty 4 omezuje, které funkce PHP lze použít:
{* These may be restricted *}<{if isset($variable)}><{if empty($array)}><{$array|@count}>V případě potřeby nakonfigurujte povolené funkce:
$smarty->security_policy->php_functions = [ 'isset', 'empty', 'count', 'sizeof', 'in_array', 'is_array', 'date', 'time'];Aktualizace dědičnosti šablon
Sekce “Aktualizace dědičnosti šablon”Bloková syntaxe
Sekce “Bloková syntaxe”Syntaxe bloku zůstává podobná, ale s některými změnami:
{* Parent template *}<html><head> {block name=head} <title>Default Title</title> {/block}</head><body> {block name=content}{/block}</body></html>{* Child template *}{extends file="parent.tpl"}
{block name=head} {$smarty.block.parent} {* Include parent block content *} <meta name="custom" content="value">{/block}
{block name=content} <h1>My Content</h1>{/block}Přidat a přidat před
Sekce “Přidat a přidat před”{block name=head append} {* This is added after parent content *} <link rel="stylesheet" href="extra.css">{/block}
{block name=scripts prepend} {* This is added before parent content *} <script src="early.js"></script>{/block}Zastaralé funkce
Sekce “Zastaralé funkce”Odstraněno v Smarty 4
Sekce “Odstraněno v Smarty 4”| Funkce | Alternativa |
|---|---|
Štítky {php} | Přesuňte logiku na PHP nebo použijte pluginy |
{include_php} | Používejte registrované pluginy |
$smarty.capture | Stále funguje, ale již není podporováno |
{strip} s mezerami | Použijte nástroje minifikace |
Používejte alternativy
Sekce “Používejte alternativy”{* Instead of {php} *}{* Move to PHP and assign result *}
{* Instead of include_php *}<{include file="db:mytemplate.tpl"}>
{* Instead of capture (still works but consider) *}<{capture name="sidebar"}> <h3>Sidebar</h3><{/capture}><div><{$smarty.capture.sidebar}></div>Kontrolní seznam migrace
Sekce “Kontrolní seznam migrace”Před migrací
Sekce “Před migrací”- Zálohujte všechny šablony
- Seznam všech použití tagů
{php} - Dokumentujte vlastní pluginy
- Otestujte aktuální funkčnost
Během migrace
Sekce “Během migrace”- Odstraňte všechny značky
{php} - Aktualizujte syntaxi přístupu proměnných
- Zkontrolujte použití modifikátoru
- Aktualizujte konfiguraci mezipaměti
- Zkontrolujte nastavení zabezpečení
Po migraci
Sekce “Po migraci”- Otestujte všechny šablony
- Zkontrolujte funkčnost všech formulářů
- Ověřte, že ukládání do mezipaměti funguje
- Testujte s různými uživatelskými rolemi
Testování kompatibility
Sekce “Testování kompatibility”Detekce verze
Sekce “Detekce verze”// Check Smarty version in PHP$version = Smarty::SMARTY_VERSION;
if (version_compare($version, '4.0.0', '>=')) { // Smarty 4+ specific code} else { // Smarty 3 code}Kontrola verze šablony
Sekce “Kontrola verze šablony”{* Check version in template *}<{assign var="smarty_major" value=$smarty.version|regex_replace:'/\\..*$/':''}>
<{if $smarty_major >= 4}> {* Smarty 4+ template code *}<{else}> {* Smarty 3 template code *}<{/if}>Psaní vzájemně kompatibilních šablon
Sekce “Psaní vzájemně kompatibilních šablon”Nejlepší postupy
Sekce “Nejlepší postupy”-
Zcela se vyhněte tagům
{php}– Nefungují v Smarty 3+ -
Udržujte šablony jednoduché - Komplexní logika patří do PHP
-
Používejte standardní modifikátory – Vyhněte se zastaralým modifikátorům
-
Test v obou verzích - Pokud potřebujete podporovat obě verze
-
Používejte zásuvné moduly pro složité operace – Snadnější údržba
Příklad: Křížově kompatibilní šablona
Sekce “Příklad: Křížově kompatibilní šablona”{* Works in both Smarty 3 and 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>Společné problémy s migrací
Sekce “Společné problémy s migrací”Problém: Proměnné se vrací prázdné
Sekce “Problém: Proměnné se vrací prázdné”Problém: <{$mod_url}> nevrací nic v Smarty 4Řešení: Použijte <{$mod_url->value}> nebo povolte režim kompatibility
Problém: Chyby značek PHP
Sekce “Problém: Chyby značek PHP”Problém: Šablona vyvolá chybu u značek {php}
Řešení: Odstraňte všechny značky PHP a přesuňte logiku do souborů PHP
Problém: Modifikátor nenalezen
Sekce “Problém: Modifikátor nenalezen”Problém: Vlastní modifikátor vyvolá chybu „neznámý modifikátor“.
Řešení: Zaregistrujte modifikátor u registerPlugin()
Problém: Bezpečnostní omezení
Sekce “Problém: Bezpečnostní omezení”Problém: Funkce není v šabloně povolena
Řešení: Přidejte funkci do seznamu povolených bezpečnostních zásad
#smarty #migrace #upgrade #xoops #smarty4 #kompatibilita