Przejdź do głównej zawartości

Migracja Smarty 4

Ten przewodnik obejmuje zmiany i kroki migracji potrzebne do aktualizacji z Smarty 3 na Smarty 4 w XOOPS. Zrozumienie tych różnic jest niezbędne do utrzymania kompatybilności z nowoczesną instalacją XOOPS.

  • Smarty-Basics - Fundamenty Smarty w XOOPS
  • Theme-Development - Tworzenie motywów XOOPS
  • Template-Variables - Dostępne zmienne w szablonach

Smarty 4 wprowadził kilka przełomowych zmian z Smarty 3:

  1. Zmienione zachowanie przypisania zmiennych
  2. Tagi {php} całkowicie usunięte
  3. Zmiany API cachowania
  4. Aktualizacje obsługi modyfikatorów
  5. Zmiany polityki bezpieczeństwa
  6. Usunięte przestarzałe funkcje

W Smarty 2/3 przypisane wartości były bezpośrednio dostępne:

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

W Smarty 4 zmienne są owiniętę w obiekty Smarty_Variable:

Smarty_Variable Object
(
[value] => http://example.com/modules/mymodule/
[nocache] =>
)
{* Smarty 4 - dostęp do właściwości value *}
<img src="<{$mod_url->value}>/assets/images/icon.png">

Włącz tryb kompatybilności w PHP:

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

Umożliwia bezpośredni dostęp do zmiennych jak w Smarty 3.

Pisz szablony, które działają w obu wersjach:

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

Utwórz funkcję pomocniczą do przypisań:

function smartyAssign($smarty, $name, $value)
{
if (version_compare($smarty->version, '4.0.0', '>=')) {
// Smarty 4+ - przypisz normalnie, dostęp przez ->value w szablonach
$smarty->assign($name, $value);
} else {
// Smarty 3 - standardowe przypisanie
$smarty->assign($name, $value);
}
}

Smarty 3+ nie obsługuje tagów {php} ze względów bezpieczeństwa:

{* To NIE DZIAŁA JUŻ w Smarty 3+ *}
<{assign var="cid" value=$downloads.cid}>
<{php}>
$catid = $this->get_template_vars('cid');
<{/php}>
{* Używaj wbudowanego dostępu do zmiennych Smarty *}
<{assign var="cid" value=$downloads.cid}>
<{assign var="catid" value=$smarty.template_vars.cid}>

Złożona logika powinna być w PHP, nie w szablonach:

// W PHP - wykonaj przetwarzanie
$catid = $downloads['cid'];
$categoryInfo = getCategoryInfo($catid);
// Przypisz przetworzone dane do szablonu
$GLOBALS['xoopsTpl']->assign('category', $categoryInfo);
{* W szablonie - po prostu wyświetl *}
<h2><{$category.name}></h2>

Dla wielokrotnego użytku funkcjonalności, utwórz wtyczki 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());
}
}
{* W szablonie *}
<{getcategory id=$cid assign="category"}>
<h2><{$category.name}></h2>
// Styl Smarty 3
$smarty->caching = true;
$smarty->cache_lifetime = 3600;
$smarty->cache_dir = '/path/to/cache';
// Per-zmienna nocache
$xoopsTpl->tpl_vars["mod_url"]->nocache = false;
// Styl Smarty 4
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
$smarty->setCacheLifetime(3600);
$smarty->setCacheDir('/path/to/cache');
// Lub przy użyciu właściwości (nadal działa)
$smarty->caching = Smarty::CACHING_LIFETIME_CURRENT;
$smarty->cache_lifetime = 3600;
// Tryby cachowania
Smarty::CACHING_OFF // Brak cachowania
Smarty::CACHING_LIFETIME_CURRENT // Użyj cache_lifetime
Smarty::CACHING_LIFETIME_SAVED // Użyj cached lifetime
{* Oznacz zawartość jako nigdy nie cached *}
<{nocache}>
<p>Current time: <{$smarty.now|date_format:"%H:%M:%S"}></p>
<{/nocache}>

Niektóre modyfikatory zostały zmienione lub wycofane:

{* Smarty 3 *}
<{$text|escape:'htmlall'}>
{* Smarty 4 - użyj 'html' zamiast *}
<{$text|escape:'html'}>

Modyfikatory tablicy wymagają prefiksu @:

{* Policz elementy tablicy *}
<{$items|@count}> items
{* Połącz tablicę *}
<{$tags|@implode:', '}>
{* Koduj JSON *}
<{$data|@json_encode}>

Niestandardowe modyfikatory muszą być zarejestrowane:

// Zarejestruj niestandardowy modyfikator
$smarty->registerPlugin('modifier', 'my_modifier', 'my_modifier_function');
function my_modifier_function($string, $param1 = 'default')
{
// Przetwórz i zwróć
return processed_string($string, $param1);
}

Smarty 4 ma bardziej surowe domyślne bezpieczeństwo:

// Konfiguruj politykę bezpieczeństwa
$smarty->enableSecurity('Smarty_Security');
// Lub utwórz niestandardową politykę
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));

Domyślnie Smarty 4 ogranicza które funkcje PHP mogą być używane:

{* Te mogą być ograniczone *}
<{if isset($variable)}>
<{if empty($array)}>
<{$array|@count}>

Skonfiguruj dozwolone funkcje jeśli to konieczne:

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

Składnia bloku pozostaje podobna ale z niektórymi zmianami:

{* Szablon rodzica *}
<html>
<head>
{block name=head}
<title>Default Title</title>
{/block}
</head>
<body>
{block name=content}{/block}
</body>
</html>
{* Szablon dziecka *}
{extends file="parent.tpl"}
{block name=head}
{$smarty.block.parent} {* Dołącz zawartość bloku rodzica *}
<meta name="custom" content="value">
{/block}
{block name=content}
<h1>My Content</h1>
{/block}
{block name=head append}
{* To jest dodane po zawartości rodzica *}
<link rel="stylesheet" href="extra.css">
{/block}
{block name=scripts prepend}
{* To jest dodane przed zawartością rodzica *}
<script src="early.js"></script>
{/block}
FunkcjaAlternatywa
{php} tagsPrzenieś logikę do PHP lub użyj wtyczek
{include_php}Użyj zarejestrowanych wtyczek
$smarty.captureNadal działa ale przestarzałe
{strip} z spacjamiUżyj narzędzi minifikacji
{* Zamiast {php} *}
{* Przenieś do PHP i przypisz wynik *}
{* Zamiast include_php *}
<{include file="db:mytemplate.tpl"}>
{* Zamiast capture (nadal działa ale rozważ) *}
<{capture name="sidebar"}>
<h3>Sidebar</h3>
<{/capture}>
<div><{$smarty.capture.sidebar}></div>
  1. Backupuj wszystkie szablony
  2. Wypisz wszystkie użycia {php} tagu
  3. Dokumentuj niestandardowe wtyczki
  4. Testuj bieżącą funkcjonalność
  1. Usuń wszystkie tagi {php}
  2. Aktualizuj składnię dostępu do zmiennych
  3. Sprawdź użycie modyfikatorów
  4. Aktualizuj konfigurację cachowania
  5. Przejrzyj ustawienia bezpieczeństwa
  1. Testuj wszystkie szablony
  2. Sprawdzaj czy wszystkie formularze działają
  3. Weryfikuj czy cachowanie działa
  4. Testuj z różnymi rolami użytkownika
// Sprawdzaj wersję Smarty w PHP
$version = Smarty::SMARTY_VERSION;
if (version_compare($version, '4.0.0', '>=')) {
// Kod specyficzny dla Smarty 4+
} else {
// Kod Smarty 3
}
{* Check wersję w szablonie *}
<{assign var="smarty_major" value=$smarty.version|regex_replace:'/\\..*$/':''}>
<{if $smarty_major >= 4}>
{* Kod szablonu Smarty 4+ *}
<{else}>
{* Kod szablonu Smarty 3 *}
<{/if}>
  1. Całkowicie unikaj tagów {php} - Nie działają w Smarty 3+

  2. Utrzymuj szablony proste - Złożona logika należy do PHP

  3. Używaj standardowych modyfikatorów - Unikaj przestarzałych

  4. Testuj w obu wersjach - Jeśli musisz obsługiwać obie

  5. Używaj wtyczek dla złożonych operacji - Łatwiejsze do utrzymania

{* Działa zarówno w Smarty 3 jak i 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>

Problem: <{$mod_url}> zwraca nic w Smarty 4

Rozwiązanie: Użyj <{$mod_url->value}> lub włącz tryb kompatybilności

Problem: Szablon wyrzuca błąd na tagach {php}

Rozwiązanie: Usuń wszystkie tagi PHP i przenieś logikę do plików PHP

Problem: Niestandardowy modyfikator wyrzuca błąd “unknown modifier”

Rozwiązanie: Zarejestruj modyfikator z registerPlugin()

Problem: Funkcja nie dozwolona w szablonie

Rozwiązanie: Dodaj funkcję do listy dozwolonych polityki bezpieczeństwa


#smarty #migracja #aktualizacja #xoops #smarty4 #kompatybilność