Ce widget permet de décorer un autre widget en déclenchant des actions dans la hiérarchie du widget qu'il décore.
Ce widget va analyser les URL en provenance du navigateur et il en déduira quelles actions de quelles classes doivent être déclenchées.
Pour rappel, avec Pxxo, on déclenche l'action d'une classe Pxxo avec des URL du type :
[ClassID] = [nom_d_une_méthode]
et ceci autant de fois que l'on souhaite déclencher d'actions simultanées. Exemple :
?Pxxo_Widget_Truc=defaut&Pxxo_Widget_Bidule=machin&a=1&b=2
Et bien à la place, le Controller va permettre d'utiliser des URL du type :
/action1/action2/action3/[?a=1&b=2]
Pour réussir ce mapping, le controller utilise la règle suivante :
ClassID = [préfix]Action1
[préfix]Action1 = [préfix]Action2
[préfix]Action2 = [préfix]Action3
Cette syntaxe permet d'obtenir 2 types de fonctionnement :
Sur le widget décoré, les URL /truc/ et /bidule/, exécuteront respectivement la méthode {truc} ou la méthode {bidule}
En admettant que l'objet décoré possède des méthodes qui instancient des objets du même nom. Avec l' URL [/root]/truc/chouette/ on exécutera la méthode {chouette} de la classe [prefix]Truc instanciée par la méthode [prefix]Truc de la classe décorée.
Si on crée plusieurs classes avec un fonctionnement similaire, on peut obtenir un déclenchement récursif et hiérarchique d'objets.
Très compliqué d'approche, mais simple et puissant à l'usage.
| Nom | Valeur par défaut | Description |
|---|---|---|
| equivalent | - | table de conversion entre un chemin dans l'URL et un nom de classe |
| prefix | - | un préfixe à ajouter au noms de classe déduit des répertoire fictifs |
| translator | - | callback prenant en entrée le chemin trouvé dans l'URL et qui renvoit en sortie un nouveau chemin |
Pour rediriger correctement les URLs fictives, on utilise le mod_rewrite d'Apache avec par exemple ce fichier .htaccess :
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
On y associera un fichier index.php qui devra exécuter un widget décoré :
require_once 'classes/Root.php'; // Création du widget racine qui contiendra tous les objets $o = new Root(array( 'CacheMode' => false, // Active ou désactive le cache pour la hiérarchie. )); // décore l'objet $o->addDecorator('Pxxo_Widget_Decorator_Controller') $o->main(); // Exécution de la classe principale $o->dump(); // Affichage
Il faut aussi ajouter dans le template associé à Root :
<?php $this->Self->printWidget(); ?>
Et si on veut aussi traiter les cas où l'URL ne correspond pas à un Widget :
<?php if($this->Self->hasWidget()) { $this->Self->printWidget(); } else { // Error 404 $this->Self->Response->setRedirect("/error/404"); } ?>
©2003-2010 Pxxo
Partenaires : INIST-CNRS | Sourcesup | Web2.0 chat server | Micropolia | Jeux gratuits | Areno