Skip to content

Migracija Smarty 4

Ta priročnik pokriva spremembe in korake selitve, potrebne pri nadgradnji s Smarty 3 na Smarty 4 v XOOPS. Razumevanje teh razlik je bistveno za ohranjanje združljivosti s sodobnimi XOOPS namestitvami.

  • Osnove Smarty - Osnove Smarty v XOOPS
  • Razvoj tem - Ustvarjanje XOOPS tem
  • Template-Variables - razpoložljive spremenljivke v predlogah

Smarty 4 je uvedel več pomembnih sprememb v primerjavi s Smarty 3:

  1. Vedenje pri dodelitvi spremenljivk se je spremenilo
  2. {php} oznake popolnoma odstranjene
  3. Predpomnjenje API sprememb
  4. Modifikator, ki obravnava posodobitve
  5. Spremembe varnostne politike
  6. Odstranjene zastarele funkcije

V Smarty 2/3 so bile dodeljene vrednosti neposredno dostopne:

// PHP
$GLOBALS['xoopsTpl']->assign('mod_url', $helper->url());
{* Smarty 2/3 - worked fine *}
<img src="<{$mod_url}>/assets/images/icon.png">

V Smarty 4 so spremenljivke ovite v Smarty_Variable objektov:

Smarty_Variable Object
(
[value] => http://example.com/modules/mymodule/
[nocache] =>
)

1. rešitev: Dostopite do lastnosti vrednosti

Section titled “1. rešitev: Dostopite do lastnosti vrednosti”
{* Smarty 4 - access the value property *}
<img src="<{$mod_url->value}>/assets/images/icon.png">

Omogoči način združljivosti v PHP:

$smarty = new Smarty();
$smarty->setCompatibilityMode(true);

To omogoča neposreden spremenljiv dostop, kot je Smarty 3.

3. rešitev: Pogojno preverjanje različice

Section titled “3. rešitev: Pogojno preverjanje različice”

Napišite predloge, ki delujejo v obeh različicah:

<{if $smarty.version|regex_replace:'[^0-9]':'' >= 4}>
<{$mod_url->value}>
<{else}>
<{$mod_url}>
<{/if}>

Ustvarite pomožno funkcijo za dodelitve:

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);
}
}

Smarty 3+ ne podpira oznak {php} iz varnostnih razlogov:

{* This NO LONGER works in Smarty 3+ *}
<{assign var="cid" value=$downloads.cid}>
<{php}>
$catid = $this->get_template_vars('cid');
<{/php}>
{* Use Smarty's built-in variable access *}
<{assign var="cid" value=$downloads.cid}>
<{assign var="catid" value=$smarty.template_vars.cid}>

Kompleksna logika naj bo v PHP, ne v predlogah:

// 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>

Za večkratno uporabo ustvarite vtičnike 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 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 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;
// 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}>

Nekateri modifikatorji so bili preimenovani ali opuščeni:

{* Smarty 3 *}
<{$text|escape:'htmlall'}>
{* Smarty 4 - use 'html' instead *}
<{$text|escape:'html'}>

Modifikatorji matrike zahtevajo predpono @:

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

Modifikatorje po meri je treba registrirati:

// 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);
}

Smarty 4 ima strožjo privzeto varnost:

// 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));

Smarty 4 privzeto omejuje, katere PHP funkcije je mogoče uporabiti:

{* These may be restricted *}
<{if isset($variable)}>
<{if empty($array)}>
<{$array|@count}>

Po potrebi konfigurirajte dovoljene funkcije:

$smarty->security_policy->php_functions = [
'isset', 'empty', 'count', 'sizeof',
'in_array', 'is_array', 'date', 'time'
];

Sintaksa bloka ostaja podobna, vendar z nekaj spremembami:

{* 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}
FunkcijaAlternativa
{php} oznakePremaknite logiko na PHP ali uporabite vtičnike
{include_php}Uporabite registrirane vtičnike
$Smarty.captureŠe vedno deluje, vendar zastarelo
{strip} s presledkiUporabite orodja za pomanjševanje
{* 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>
  1. Varnostno kopirajte vse predloge
  2. Navedite vse uporabe oznak {php}
  3. Dokumentirajte vtičnike po meri
  4. Preizkusite trenutno delovanje
  1. Odstranite vse oznake {php}
  2. Posodobi spremenljivo sintakso dostopa
  3. Preverite uporabo modifikatorja
  4. Posodobite konfiguracijo predpomnjenja
  5. Preglejte varnostne nastavitve
  1. Preizkusite vse predloge
  2. Preverite delo vseh obrazcev
  3. Preverite, ali predpomnjenje deluje
  4. Preizkusite z različnimi uporabniškimi vlogami
// 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}>
  1. V celoti se izogibajte oznakam {php} - ne delujejo v Smarty 3+

  2. Predloge naj bodo preproste - Kompleksna logika sodi v PHP

  3. Uporabljajte standardne modifikatorje – izogibajte se zastarelim

  4. Preizkusite v obeh različicah - Če potrebujete podporo za obe

  5. Uporabite vtičnike za zapletene operacije – lažje jih je vzdrževati

{* 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>

Težava: <{$mod_url}> ne vrne ničesar v Smarty 4

Rešitev: Uporabite <{$mod_url->value}> ali omogočite način združljivosti

Težava: Predloga vrže napako na oznakah {php}

Rešitev: Odstranite vse oznake PHP in premaknite logiko v datoteke PHP

Težava: modifikatorja ni bilo mogoče najti

Section titled “Težava: modifikatorja ni bilo mogoče najti”

Težava: modifikator po meri vrže napako »neznan modifikator«.

Rešitev: Registrirajte modifikator z registerPlugin()

Težava: funkcija ni dovoljena v predlogi

Rešitev: Dodajte funkcijo na seznam dovoljenih varnostnih pravilnikov


#Smarty #migration #upgrade #XOOPS #smarty4 #compatibility