Smarty 4 Міграція
У цьому посібнику описано зміни та етапи міграції, необхідні під час оновлення з Smarty 3 до Smarty 4 у XOOPS. Розуміння цих відмінностей є важливим для підтримки сумісності з сучасними установками XOOPS.
Пов’язана документація
Section titled “Пов’язана документація”- Smarty-Basics - Основи Smarty у XOOPS
- Розробка тем - Створення тем XOOPS
- Template-Variables - доступні змінні в шаблонах
Огляд змін
Section titled “Огляд змін”У Smarty 4 представлено кілька критичних змін у порівнянні з Smarty 3:
- Змінено поведінку присвоювання змінних
- Теги
{php}повністю видалено - Кешування змін API
- Модифікатор обробки оновлень
- Зміни політики безпеки
- Застарілі функції видалено
Зміни доступу до змінних
Section titled “Зміни доступу до змінних”Проблема
Section titled “Проблема”У Smarty 2/3 призначені значення були доступні безпосередньо:
// PHP$GLOBALS['xoopsTpl']->assign('mod_url', $helper->url());{* Smarty 2/3 - worked fine *}<img src="<{$mod_url}>/assets/images/icon.png">У Smarty 4 змінні загорнуті в об’єкти Smarty_Variable:
Smarty_Variable Object( [value] => http://example.com/modules/mymodule/ [nocache] =>)Рішення 1: отримати доступ до властивості Value
Section titled “Рішення 1: отримати доступ до властивості Value”{* Smarty 4 - access the value property *}<img src="<{$mod_url->value}>/assets/images/icon.png">Рішення 2: Режим сумісності
Section titled “Рішення 2: Режим сумісності”Увімкніть режим сумісності в PHP:
$smarty = new Smarty();$smarty->setCompatibilityMode(true);Це дозволяє прямий доступ до змінних, наприклад Smarty 3.
Рішення 3: Умовна перевірка версії
Section titled “Рішення 3: Умовна перевірка версії”Напишіть шаблони, які працюють в обох версіях:
<{if $smarty.version|regex_replace:'[^0-9]':'' >= 4}> <{$mod_url->value}><{else}> <{$mod_url}><{/if}>Рішення 4: функція Wrapper
Section titled “Рішення 4: функція Wrapper”Створіть допоміжну функцію для завдань:
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); }}Видалення тегів {php}
Section titled “Видалення тегів {php}”Проблема
Section titled “Проблема”Smarty 3+ не підтримує теги {php} з міркувань безпеки:
{* This NO LONGER works in Smarty 3+ *}<{assign var="cid" value=$downloads.cid}><{php}> $catid = $this->get_template_vars('cid');<{/php}>Рішення: використовуйте змінні Smarty
Section titled “Рішення: використовуйте змінні Smarty”{* Use Smarty's built-in variable access *}<{assign var="cid" value=$downloads.cid}><{assign var="catid" value=$smarty.template_vars.cid}>Рішення: перемістіть логіку в PHP
Section titled “Рішення: перемістіть логіку в PHP”Складна логіка має бути в PHP, а не в шаблонах:
// 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>Рішення: спеціальні плагіни
Section titled “Рішення: спеціальні плагіни”Для багаторазового використання створіть плагіни 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>Кешування змін
Section titled “Кешування змін”Smarty 3 Кешування
Section titled “Smarty 3 Кешування”// 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 Кешування
Section titled “Smarty 4 Кешування”// 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;Кешування констант
Section titled “Кешування констант”// Caching modesSmarty::CACHING_OFF // No cachingSmarty::CACHING_LIFETIME_CURRENT // Use cache_lifetimeSmarty::CACHING_LIFETIME_SAVED // Use cached lifetimeNocache у шаблонах
Section titled “Nocache у шаблонах”{* Mark content as never cached *}<{nocache}> <p>Current time: <{$smarty.now|date_format:"%H:%M:%S"}></p><{/nocache}>Зміни модифікатора
Section titled “Зміни модифікатора”Модифікатори рядків
Section titled “Модифікатори рядків”Деякі модифікатори були перейменовані або визнані застарілими:
{* Smarty 3 *}<{$text|escape:'htmlall'}>
{* Smarty 4 - use 'html' instead *}<{$text|escape:'html'}>Модифікатори масиву
Section titled “Модифікатори масиву”Для модифікаторів масиву потрібен префікс @:
{* Count array elements *}<{$items|@count}> items
{* Join array *}<{$tags|@implode:', '}>
{* JSON encode *}<{$data|@json_encode}>Спеціальні модифікатори
Section titled “Спеціальні модифікатори”Користувацькі модифікатори повинні бути зареєстровані:
// 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);}Зміни політики безпеки
Section titled “Зміни політики безпеки”Smarty 4 Безпека
Section titled “Smarty 4 Безпека”Smarty 4 має суворішу безпеку за замовчуванням:
// 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));Дозволені функції
Section titled “Дозволені функції”За замовчуванням Smarty 4 обмежує, які функції PHP можна використовувати:
{* These may be restricted *}<{if isset($variable)}><{if empty($array)}><{$array|@count}>За потреби налаштуйте дозволені функції:
$smarty->security_policy->php_functions = [ 'isset', 'empty', 'count', 'sizeof', 'in_array', 'is_array', 'date', 'time'];Оновлення успадкування шаблонів
Section titled “Оновлення успадкування шаблонів”Синтаксис блоку
Section titled “Синтаксис блоку”Синтаксис блоку залишається подібним, але з деякими змінами:
{* 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}Додавання та початок
Section titled “Додавання та початок”{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}Застарілі функції
Section titled “Застарілі функції”Видалено в Smarty 4
Section titled “Видалено в Smarty 4”| Особливість | Альтернатива |
|---|---|
{php} теги | Перемістіть логіку до PHP або скористайтеся плагінами |
{include_php} | Використовуйте зареєстровані плагіни |
$smarty.capture | Все ще працює, але не підтримується |
{strip} з пробілами | Використовуйте інструменти мінімізації |
Використовуйте альтернативи
Section titled “Використовуйте альтернативи”{* 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>Контрольний список міграції
Section titled “Контрольний список міграції”Перед міграцією
Section titled “Перед міграцією”- Створіть резервну копію всіх шаблонів
- Перелік усіх використаних тегів
{php} - Спеціальні плагіни документа
- Перевірте поточну функціональність
Під час міграції
Section titled “Під час міграції”- Видаліть усі теги
{php} - Оновити синтаксис доступу до змінних
- Перевірте використання модифікатора
- Оновити конфігурацію кешування
- Перегляньте налаштування безпеки
Після міграції
Section titled “Після міграції”- Перевірте всі шаблони
- Перевірте роботу всіх форм
- Перевірка кешування працює
- Перевірте з різними ролями користувачів
Тестування на сумісність
Section titled “Тестування на сумісність”Виявлення версії
Section titled “Виявлення версії”// Check Smarty version in PHP$version = Smarty::SMARTY_VERSION;
if (version_compare($version, '4.0.0', '>=')) { // Smarty 4+ specific code} else { // Smarty 3 code}Перевірка версії шаблону
Section titled “Перевірка версії шаблону”{* 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}>Написання крос-сумісних шаблонів
Section titled “Написання крос-сумісних шаблонів”Найкращі практики
Section titled “Найкращі практики”-
Повністю уникайте тегів
{php}- вони не працюють у Smarty 3+ -
Зберігайте шаблони простими - Складна логіка належить до PHP
-
Використовуйте стандартні модифікатори – уникайте застарілих
-
Тестуйте в обох версіях - якщо вам потрібно підтримувати обидві
-
Використовуйте плагіни для складних операцій - Більш зручна в обслуговуванні
Приклад: крос-сумісний шаблон
Section titled “Приклад: крос-сумісний шаблон”{* 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>Поширені проблеми міграції
Section titled “Поширені проблеми міграції”Проблема: змінні повертають порожні
Section titled “Проблема: змінні повертають порожні”Проблема: <{$mod_url}> нічого не повертає в Smarty 4
Рішення: використовуйте <{$mod_url->value}> або ввімкніть режим сумісності
Проблема: помилки тегів PHP
Section titled “Проблема: помилки тегів PHP”Проблема: шаблон видає помилку для тегів {php}
Рішення: видаліть усі теги PHP і перемістіть логіку до файлів PHP
Проблема: модифікатор не знайдено
Section titled “Проблема: модифікатор не знайдено”Проблема: спеціальний модифікатор видає помилку “невідомий модифікатор”.
Рішення: зареєструйте модифікатор за допомогою registerPlugin()
Проблема: обмеження безпеки
Section titled “Проблема: обмеження безпеки”Проблема: функція не дозволена в шаблоні
Рішення: додайте функцію до дозволеного списку політики безпеки
#smarty #migration #upgrade #xoops #smarty4 #compatibility