Přeskočit na obsah

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

Smarty 4 představil několik zásadních změn oproti Smarty 3:

  1. Změnilo se chování přiřazení proměnných
  2. Štítky {php} zcela odstraněny
  3. Ukládání změn do mezipaměti API
  4. Modifikátor obsluhující aktualizace
  5. Změny bezpečnostní politiky
  6. Zastaralé funkce byly odstraněny

Změny variabilního přístupu

Sekce “Změny variabilního přístupu”

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}”

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:

/class/smarty/plugins/function.getcategory.php
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>

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 modes
Smarty::CACHING_OFF // No caching
Smarty::CACHING_LIFETIME_CURRENT // Use cache_lifetime
Smarty::CACHING_LIFETIME_SAVED // Use cached lifetime
{* Mark content as never cached *}
<{nocache}>
<p>Current time: <{$smarty.now|date_format:"%H:%M:%S"}></p>
<{/nocache}>

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 vyžadují předponu @:

{* Count array elements *}
<{$items|@count}> items
{* Join array *}
<{$tags|@implode:', '}>
{* JSON encode *}
<{$data|@json_encode}>

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 má přísnější výchozí zabezpečení:

// Configure security policy
$smarty->enableSecurity('Smarty_Security');
// Or create custom policy
class 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));

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”

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}
{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}
FunkceAlternativa
Štítky {php}Přesuňte logiku na PHP nebo použijte pluginy
{include_php}Používejte registrované pluginy
$smarty.captureStále funguje, ale již není podporováno
{strip} s mezeramiPouž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”
  1. Zálohujte všechny šablony
  2. Seznam všech použití tagů {php}
  3. Dokumentujte vlastní pluginy
  4. Otestujte aktuální funkčnost
  1. Odstraňte všechny značky {php}
  2. Aktualizujte syntaxi přístupu proměnných
  3. Zkontrolujte použití modifikátoru
  4. Aktualizujte konfiguraci mezipaměti
  5. Zkontrolujte nastavení zabezpečení
  1. Otestujte všechny šablony
  2. Zkontrolujte funkčnost všech formulářů
  3. Ověřte, že ukládání do mezipaměti funguje
  4. Testujte s různými uživatelskými rolemi

Testování kompatibility

Sekce “Testování kompatibility”
// Check Smarty version in PHP
$version = Smarty::SMARTY_VERSION;
if (version_compare($version, '4.0.0', '>=')) {
// Smarty 4+ specific code
} else {
// Smarty 3 code
}
{* 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”
  1. Zcela se vyhněte tagům {php} – Nefungují v Smarty 3+

  2. Udržujte šablony jednoduché - Komplexní logika patří do PHP

  3. Používejte standardní modifikátory – Vyhněte se zastaralým modifikátorům

  4. Test v obou verzích - Pokud potřebujete podporovat obě verze

  5. 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