ADR-003 – Механізм шаблонів
ADR-003: Механізм шаблонів (Smarty)
Section titled “ADR-003: Механізм шаблонів (Smarty)”Запис архітектурного рішення щодо прийняття XOOPS механізму шаблонів Smarty.
Статус
Section titled “Статус”Прийнято - Основне рішення з XOOPS 2.0
Розвивається - планується перехід на Smarty 4/5 для XOOPS 4.0
Контекст
Section titled “Контекст”XOOPS потребувало рішення для створення шаблонів, яке б:
- Відокремте презентацію від бізнес-логіки
- Дозвольте розробникам тем працювати без знання PHP
- Підтримка успадкування та включення шаблонів
- Забезпечте кешування для продуктивності
- Увімкніть настроювані користувачем шаблони
- Підтримка інтернаціоналізації
Діаграма прийняття рішень
Section titled “Діаграма прийняття рішень”flowchart TB subgraph "PHP Layer" A[Module Controller] B[Template Variables] end
subgraph "Smarty Engine" C[Smarty Core] D[Template Compiler] E[Cache Manager] end
subgraph "Templates" F[Module Templates] G[Theme Templates] H[Block Templates] end
subgraph "Output" I[Compiled PHP] J[Cached HTML] K[Final HTML] end
A --> B B --> C C --> D C --> E D --> F D --> G D --> H F --> I G --> I H --> I E --> J I --> K J --> KРішення
Section titled “Рішення”Ми будемо використовувати Smarty як систему шаблонів, оскільки:
1. Відокремлення інтересів
Section titled “1. Відокремлення інтересів”// PHP (Controller) - Business logic$items = $itemHandler->getPublishedItems();$xoopsTpl->assign('items', $items);
// Smarty (View) - Presentation// templates/items.tpl{* Smarty template - No PHP logic *}<{foreach item=item from=$items}> <article> <h2><{$item.title}></h2> <p><{$item.summary}></p> </article><{/foreach}>2. XOOPS Роздільники
Section titled “2. XOOPS Роздільники”XOOPS використовує <{ і }> замість стандартного { }:
{* Standard Smarty *}{$variable}
{* XOOPS Smarty - Avoids JavaScript conflicts *}<{$variable}>3. Ієрархія шаблону
Section titled “3. Ієрархія шаблону”graph TB A[Theme Master Template<br>theme.html] --> B[Module Template<br>module_index.tpl] A --> C[Block Templates<br>block_*.tpl] B --> D[Partial Templates<br>_header.tpl] B --> E[Partial Templates<br>_footer.tpl]
style A fill:#f9f,stroke:#333 style B fill:#9ff,stroke:#333 style C fill:#ff9,stroke:#3334. Зберігання шаблонів
Section titled “4. Зберігання шаблонів”- База даних: налаштовані шаблони, збережені для можливості повернення
- Файлова система: оригінальні шаблони в каталогах модулів
- Кеш: скомпільовані шаблони для продуктивності
Конфігурація Smarty
Section titled “Конфігурація Smarty”// XOOPS Smarty initialization$xoopsTpl = new XoopsTpl();
// Custom delimiters$xoopsTpl->left_delim = '<{';$xoopsTpl->right_delim = '}>';
// Caching$xoopsTpl->caching = XOOPS_TEMPLATE_CACHE;$xoopsTpl->cache_lifetime = 3600;
// Security$xoopsTpl->security_policy = new Smarty_Security($xoopsTpl);$xoopsTpl->security_policy->php_functions = [];$xoopsTpl->security_policy->php_modifiers = ['escape', 'count'];Використані функції шаблону
Section titled “Використані функції шаблону”Змінні
Section titled “Змінні”{* Simple variable *}<{$title}>
{* Object property *}<{$item.title}>
{* With modifier *}<{$content|truncate:200:'...'}>
{* Escaped output *}<{$userInput|escape:'html'}>Керуючі структури
Section titled “Керуючі структури”{* Conditional *}<{if $isAdmin}> <a href="admin.php">Admin</a><{elseif $isUser}> <a href="profile.php">Profile</a><{else}> <a href="login.php">Login</a><{/if}>
{* Loop *}<{foreach item=item from=$items name=itemloop}> <{$smarty.foreach.itemloop.index}>: <{$item.title}><{/foreach}>Включає
Section titled “Включає”{* Include another template *}<{include file="db:mymodule_header.tpl"}>
{* Include with variables *}<{include file="db:mymodule_item.tpl" item=$currentItem}>
{* Include from theme *}<{include file="file:$theme_path/partials/sidebar.tpl"}>Наслідки
Section titled “Наслідки”Позитивно
Section titled “Позитивно”- Дружній для дизайнера: синтаксис, схожий на HTML
- Кешування: вбудоване кешування шаблонів
- Безпека: ізоляція коду PHP
- Гнучкість: Модифікатори, функції, плагіни
- Налаштування: користувачі можуть змінювати шаблони
- Спільнота: Велика екосистема Smarty
Негативний
Section titled “Негативний”- Крива навчання: синтаксис, специфічний для Smarty
- Накладні витрати: потрібен крок компіляції
- Налагодження: помилки шаблону можуть бути загадковими
- Проблеми з версіями: критичні зміни між версіями
Пом’якшення
Section titled “Пом’якшення”- Навчання: вичерпна документація
- Продуктивність: агресивне кешування
- Налагодження: консоль налагодження, очищення повідомлень про помилки
- Версії: рівень сумісності в XOOPS
Історія версій
Section titled “Історія версій”timeline title Smarty in XOOPS 2003 : Smarty 2.x : Initial integration 2013 : Smarty 3.0 : XOOPS 2.5.5 2020 : Smarty 3.1 : XOOPS 2.5.10 2026 : Smarty 4/5 : XOOPS 4.0Міграція: Smarty 3 до 4/5
Section titled “Міграція: Smarty 3 до 4/5”Ключові зміни
Section titled “Ключові зміни”{* Smarty 3 - Deprecated *}<{php}>echo date('Y');<{/php}>
{* Smarty 4+ - Use modifiers or assign from PHP *}<{$current_year}>
{* Smarty 3 - {section} deprecated *}<{section name=i loop=$items}> <{$items[i].title}><{/section}>
{* Smarty 4+ - Use {foreach} *}<{foreach $items as $item}> <{$item.title}><{/foreach}>Рівень сумісності
Section titled “Рівень сумісності”XOOPS забезпечує рівень сумісності для плавних переходів:
// XoopsTpl extends Smarty with compatibility methodsclass XoopsTpl extends Smarty{ public function assign($tpl_var, $value = null) { // Handles both Smarty 3 and 4 syntax return parent::assign($tpl_var, $value); }}Розглянуті альтернативи
Section titled “Розглянуті альтернативи”1. Гілочка
Section titled “1. Гілочка”Плюси: сучасна екосистема Symfony Недоліки: інший синтаксис, спроба міграції Рішення: можливий майбутній варіант для XOOPS 3.x
2. Блейд (Laravel)
Section titled “2. Блейд (Laravel)”Плюси: чистий синтаксис, популярний Недоліки: специфічно для Laravel Рішення: не підходить для автономного використання
3. Власні шаблони PHP
Section titled “3. Власні шаблони PHP”Переваги: Швидке навчання Недоліки: ризики для безпеки, відсутність розділення Рішення: відхилено через ремонтопридатність
Пов’язані рішення
Section titled “Пов’язані рішення”- ADR-001: Модульна архітектура
- ADR-002: Абстракція бази даних
Посилання
Section titled “Посилання”- Smarty Документація: https://www.smarty.net/docs/en/
- XOOPS Шаблон Системний посібник
- MVC Шаблон у веб-додатках
#xoops #architecture #adr #smarty #templates #design-decision