L'overlay "mutable"
Analyse de @overlays/fusion.php - L'Overlay Composite
Ce fichier définit l'overlay Fusion, qui est un "méta-overlay" ou un "overlay composite". Son rôle n'est pas de fournir du contenu directement, mais de combiner plusieurs overlays en un seul.
C'est une implémentation très puissante du pattern de conception Composite. Il permet d'appliquer les effets de plusieurs overlays différents à un seul et même contenu (un article, une section, etc.) sans avoir à créer un nouvel overlay spécifique pour chaque combinaison.
Concept Clé
L'idée est simple : vous déclarez l'overlay fusion suivi des noms des autres overlays que vous voulez combiner.
Exemple d'utilisation (dans les options d'une page) : fusion overlay_A overlay_B overlay_C
Quand cette page sera affichée, YACS chargera l'overlay Fusion, qui à son tour chargera des instances de overlay_A, overlay_B et overlay_C. Lorsque le système demandera à Fusion de produire du contenu (par exemple, avec get_view_text()), Fusion interrogera ses "enfants" (overlay_A, B, C) et combinera leurs réponses de manière intelligente.
Fonctionnement Interne
La classe Fusion surcharge la plupart des méthodes de la classe Overlay de base (get_fields, get_view_text, get_id, etc.). Pour chaque méthode, elle applique une stratégie de fusion spécifique.
Le cœur du système repose sur 3 stratégies principales, implémentées dans des méthodes privées :
1. fusion_chain_method (Stratégie d'Agrégation / Concaténation)
Cette stratégie exécute la même méthode sur tous les overlays enfants et combine leurs résultats.
- Pour du texte (string) : elle concatène les résultats.
- Pour des tableaux (array) : elle fusionne les tableaux (array_merge).
- Pour des booléens (boolean) : elle fait un ET logique (&&). Un seul false rend tout le résultat false.
- Pour des nombres (integer/float) : elle les additionne.
Utilisé pour :
- get_fields(): Pour afficher les champs de formulaire de tous les overlays.
- get_view_text(), get_list_text(), get_trailer_text(): Pour afficher les contenus de tous les overlays les uns à la suite des autres.
- get_tabs(): Pour fusionner les onglets de tous les overlays.
- remember(), parse_fields(): Pour que chaque overlay puisse traiter les données du formulaire et se sauvegarder.
2. fusion_first_reply (Stratégie "Le Premier qui Répond Gagne")
Cette stratégie exécute la méthode sur chaque overlay enfant, dans l'ordre de leur déclaration, et s'arrête dès que l'un d'eux retourne un résultat non-`null`. Le résultat de ce premier overlay est alors retourné.
Utilisé pour :
- get_id(): L'ID de la fusion sera l'ID du premier overlay enfant qui en possède un.
- get_label(), get_live_title(): Le titre ou le libellé sera celui défini par le premier overlay qui souhaite le surcharger. L'ordre est donc crucial ici.
- render(): La première surcouche capable de gérer le rendu l'emporte.
3. fusion_pipe_method (Stratégie de "Pipeline" / Filtre en chaîne)
Cette stratégie est plus rare mais très puissante. Le résultat d'un overlay est passé comme argument au suivant.
- overlay_A reçoit la valeur initiale et retourne valeur_A.
- overlay_B reçoit valeur_A et retourne valeur_B.
- overlay_C reçoit valeur_B et retourne valeur_C.
- Le résultat final est valeur_C.
Utilisé pour :
- get_live_description(), get_live_introduction(): Permet à chaque overlay de modifier successivement la description ou l'introduction de la page.
Stockage des Données
Le mécanisme de sauvegarde est également très malin. Quand le formulaire est soumis (parse_fields), l'overlay Fusion :
1. Demande à chaque overlay enfant de traiter le formulaire.
2. Récupère les attributs de chaque enfant.
3. Stocke ces attributs dans son propre tableau $this->attributes, en utilisant le nom de l'overlay enfant comme clé.
Le résultat sérialisé ressemble à ça :
1 array(
2 'overlay_type' => 'fusion',
3 'overlay_parameters' => 'overlay_A overlay_B',
4 'overlay_A' => array( ... attributs de A ... ),
5 'overlay_B' => array( ... attributs de B ... )
6 )
Lors du chargement, fusion_load_overlays utilise ces données pour "réhydrater" chaque overlay enfant avec son état précédent.
Points d'Attention (mentionnés dans le code)
L'auteur prévient à juste titre :
- Conflits de noms : Si deux overlays fusionnés utilisent un champ de formulaire avec le même nom (ex: <input name="titre">), cela créera des conflits.
- Conflits d'ID : De même pour les ID des onglets dans get_tabs().
- L'ordre est important : Pour la stratégie fusion_first_reply, l'ordre dans lequel vous déclarez les overlays (fusion A B vs fusion B A) change le comportement.
Conclusion
L'overlay Fusion est un outil d'architecture logicielle extrêmement puissant et élégant. Il offre une modularité et une flexibilité incroyables aux administrateurs
du site, qui peuvent désormais "construire" une page en assemblant des briques de fonctionnalités (les overlays) sans avoir besoin d'une seule ligne de code
supplémentaire. C'est la quintessence d'un système bien conçu, permettant de créer des combinaisons complexes à partir de composants simples.