Aller au contenu

ADR-003 - Moteur de Modèles

Enregistrement de Décision Architecturale pour l’adoption par XOOPS du moteur de modèles Smarty.


Accepté - Décision centrale depuis XOOPS 2.0

En Évolution - Migration vers Smarty 4/5 prévue pour XOOPS 4.0


XOOPS avait besoin d’une solution de modélisation qui :

  1. Sépare la présentation de la logique métier
  2. Permet aux concepteurs de thèmes de travailler sans connaissance PHP
  3. Supporte l’héritage de modèles et les inclusions
  4. Fournit la mise en cache pour les performances
  5. Enabler les modèles personnalisables par l’utilisateur
  6. Supporter l’internationalisation

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

Nous utiliserons Smarty comme moteur de modèles car :

// PHP (Contrôleur) - Logique métier
$items = $itemHandler->getPublishedItems();
$xoopsTpl->assign('items', $items);
// Smarty (Vue) - Présentation
// 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 utilise <{ et }> au lieu des standards { } :

{* 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
  • Base de Données: Modèles personnalisés stockés pour capacité de restauration
  • Système de Fichiers: Modèles originaux dans répertoires de modules
  • Cache: Modèles compilés pour les performances

// 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'];

  1. Convivial pour les Concepteurs: Syntaxe de type HTML
  2. Mise en Cache: Mise en cache des modèles intégrée
  3. Sécurité: Isolation du code PHP
  4. Flexibilité: Modificateurs, fonctions, plugins
  5. Personnalisation: Les utilisateurs peuvent modifier les modèles
  6. Communauté: Grand écosystème Smarty
  1. Courbe d’Apprentissage: Syntaxe spécifique à Smarty
  2. Surcharge: Étape de compilation requise
  3. Débogage: Les erreurs de modèle peuvent être cryptiques
  4. Problèmes de Version: Changements de rupture entre les versions
  • Apprentissage: Documentation complète
  • Performance: Mise en cache agressive
  • Débogage: Console de débogage, messages d’erreur clairs
  • Versions: Couche de compatibilité dans XOOPS

Pros: Moderne, écosystème Symfony Cons: Syntaxe différente, effort de migration Décision: Possible option future pour XOOPS 3.x

Pros: Syntaxe propre, populaire Cons: Spécifique à Laravel Décision: Non adapté pour une utilisation autonome

Pros: Pas de courbe d’apprentissage, rapide Cons: Risques de sécurité, pas de séparation Décision: Rejeté pour la maintenabilité


  • ADR-001: Architecture Modulaire
  • ADR-002: Abstraction de Base de Données


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