Перейти до вмісту

ADR-003 – Механізм шаблонів

ADR-003: Механізм шаблонів (Smarty)

Section titled “ADR-003: Механізм шаблонів (Smarty)”

Запис архітектурного рішення щодо прийняття XOOPS механізму шаблонів Smarty.


Прийнято - Основне рішення з XOOPS 2.0

Розвивається - планується перехід на Smarty 4/5 для XOOPS 4.0


XOOPS потребувало рішення для створення шаблонів, яке б:

  1. Відокремте презентацію від бізнес-логіки
  2. Дозвольте розробникам тем працювати без знання PHP
  3. Підтримка успадкування та включення шаблонів
  4. Забезпечте кешування для продуктивності
  5. Увімкніть настроювані користувачем шаблони
  6. Підтримка інтернаціоналізації

Діаграма прийняття рішень

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

Ми будемо використовувати 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}>

XOOPS використовує <{ і }> замість стандартного { }:

{* Standard Smarty *}
{$variable}
{* XOOPS Smarty - Avoids JavaScript conflicts *}
<{$variable}>
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:#333
  • База даних: налаштовані шаблони, збережені для можливості повернення
  • Файлова система: оригінальні шаблони в каталогах модулів
  • Кеш: скомпільовані шаблони для продуктивності

// 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 “Використані функції шаблону”
{* Simple variable *}
<{$title}>
{* Object property *}
<{$item.title}>
{* With modifier *}
<{$content|truncate:200:'...'}>
{* Escaped output *}
<{$userInput|escape:'html'}>
{* 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}>
{* 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"}>

  1. Дружній для дизайнера: синтаксис, схожий на HTML
  2. Кешування: вбудоване кешування шаблонів
  3. Безпека: ізоляція коду PHP
  4. Гнучкість: Модифікатори, функції, плагіни
  5. Налаштування: користувачі можуть змінювати шаблони
  6. Спільнота: Велика екосистема Smarty
  1. Крива навчання: синтаксис, специфічний для Smarty
  2. Накладні витрати: потрібен крок компіляції
  3. Налагодження: помилки шаблону можуть бути загадковими
  4. Проблеми з версіями: критичні зміни між версіями
  • Навчання: вичерпна документація
  • Продуктивність: агресивне кешування
  • Налагодження: консоль налагодження, очищення повідомлень про помилки
  • Версії: рівень сумісності в XOOPS

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

XOOPS забезпечує рівень сумісності для плавних переходів:

// XoopsTpl extends Smarty with compatibility methods
class 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 “Розглянуті альтернативи”

Плюси: сучасна екосистема Symfony Недоліки: інший синтаксис, спроба міграції Рішення: можливий майбутній варіант для XOOPS 3.x

Плюси: чистий синтаксис, популярний Недоліки: специфічно для Laravel Рішення: не підходить для автономного використання

Переваги: Швидке навчання Недоліки: ризики для безпеки, відсутність розділення Рішення: відхилено через ремонтопридатність


  • ADR-001: Модульна архітектура
  • ADR-002: Абстракція бази даних

  • Smarty Документація: https://www.smarty.net/docs/en/
  • XOOPS Шаблон Системний посібник
  • MVC Шаблон у веб-додатках

#xoops #architecture #adr #smarty #templates #design-decision