ADR-003 - Šablonový engine
ADR-003: Modul šablony (Smarty)
Sekce “ADR-003: Modul šablony (Smarty)”Záznam rozhodnutí o architektuře pro přijetí Smarty šablonového enginu XOOPS.
Stav
Sekce “Stav”Přijato – Základní rozhodnutí od XOOPS 2.0
Vyvíjející se – Migrace na Smarty 4/5 plánována pro XOOPS 4.0
Souvislosti
Sekce “Souvislosti”XOOPS potřeboval řešení šablon, které by:
- Oddělte prezentaci od obchodní logiky
- Umožněte návrhářům motivů pracovat bez znalostí PHP
- Podpora dědičnosti šablon a jejich součástí
- Poskytněte mezipaměť pro výkon
- Povolte uživatelsky přizpůsobitelné šablony
- Podpora internacionalizace
Diagram rozhodnutí
Sekce “Diagram rozhodnutí”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 --> KRozhodnutí
Sekce “Rozhodnutí”Jako šablonový modul použijeme Smarty, protože:
1. Rozdělení obav
Sekce “1. Rozdělení obav”// 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 Oddělovače
Sekce “2. XOOPS Oddělovače”XOOPS používá <{ a }> místo standardního { }:
{* Standard Smarty *}{$variable}
{* XOOPS Smarty - Avoids JavaScript conflicts *}<{$variable}>3. Hierarchie šablon
Sekce “3. Hierarchie šablon”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. Ukládání šablon
Sekce “4. Ukládání šablon”- Databáze: Přizpůsobené šablony uložené pro možnost vrácení
- Systém souborů: Původní šablony v adresářích modulů
- Cache: Kompilované šablony pro výkon
Konfigurace Smarty
Sekce “Konfigurace 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'];Použité funkce šablony
Sekce “Použité funkce šablony”Proměnné
Sekce “Proměnné”{* Simple variable *}<{$title}>
{* Object property *}<{$item.title}>
{* With modifier *}<{$content|truncate:200:'...'}>
{* Escaped output *}<{$userInput|escape:'html'}>Řídicí struktury
Sekce “Řídicí struktury”{* 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}>Zahrnuje
Sekce “Zahrnuje”{* 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"}>Následky
Sekce “Následky”Pozitivní
Sekce “Pozitivní”- Příjemné pro návrháře: Syntaxe podobná HTML
- Ukládání do mezipaměti: Vestavěné ukládání do mezipaměti šablony
- Zabezpečení: Izolace kódu PHP
- Flexibilita: Modifikátory, funkce, pluginy
- Přizpůsobení: Uživatelé mohou upravovat šablony
- Komunita: Velký ekosystém Smarty
Negativní
Sekce “Negativní”- Křivka učení: Syntaxe specifická pro Smarty
- Režie: Je vyžadován krok kompilace
- Ladění: Chyby šablony mohou být záhadné
- Problémy s verzemi: Přerušení změn mezi verzemi
Zmírnění
Sekce “Zmírnění”- Učení: Komplexní dokumentace
- Výkon: Agresivní ukládání do mezipaměti
- Ladění: Debug konzole, vymazání chybových zpráv
- Verze: Vrstva kompatibility v XOOPS
Historie verzí
Sekce “Historie verzí”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.0Migrace: Smarty 3 na 4/5
Sekce “Migrace: Smarty 3 na 4/5”Prolomení změn
Sekce “Prolomení změn”{* 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}>Vrstva kompatibility
Sekce “Vrstva kompatibility”XOOPS poskytuje vrstvu kompatibility pro hladké přechody:
// 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); }}Zvažovány alternativy
Sekce “Zvažovány alternativy”1. Větvička
Sekce “1. Větvička”Pros: Moderní, Symfony ekosystém Nevýhody: Jiná syntaxe, úsilí o migraci Rozhodnutí: Možná budoucí volba pro XOOPS 3.x
2. Čepel (Laravel)
Sekce “2. Čepel (Laravel)”Pros: Čistá syntaxe, populární Nevýhody: Specifické pro Laravel Rozhodnutí: Nevhodné pro samostatné použití
3. Nativní šablony PHP
Sekce “3. Nativní šablony PHP”Pros: Bez křivky učení, rychle Nevýhody: Bezpečnostní rizika, žádné oddělení Rozhodnutí: Zamítnuto z důvodu údržby
Související rozhodnutí
Sekce “Související rozhodnutí”- ADR-001: Modulární architektura
- ADR-002: Abstrakce databáze
Reference
Sekce “Reference”- Smarty Dokumentace: https://www.smarty.net/docs/en/
- Průvodce systémem šablon XOOPS
- Vzor MVC ve webových aplikacích
#xoops #architektura #adr #smarty #šablony #design-rozhodnutí