====== Pxxo_Widgets_Decorator_Controller ======
Ce widget permet de décorer un autre widget en déclenchant des actions dans la hiérarchie du widget qu'il décore.
Le widget est un décorateur, pour savoir comment l'utiliser, il faut donc se référer à la [[:fr:doc:pxxo_widgets_decorator|documentation des décorateurs]], ou bien simplement se rendre dans la section des exemples plus bas.
* [[http://demo.pxxo.net/widgets/demos/|Exemple d'utilisation en ligne]]
* [[fr:install|Installer]]
===== Fonctionnement =====
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 :
* Simple :
Sur le widget décoré, les URL /truc/ et /bidule/, exécuteront respectivement
la méthode {truc} ou la méthode {bidule}
* Avancée :
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.//
===== Paramètres =====
^ 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 | - | [[http://www.php.net/callback|callback]] prenant en entrée le chemin trouvé dans l'URL et qui renvoit en sortie un nouveau chemin |
===== Mise en place du Controller =====
Pour rédiriger 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 le fichier index.php suivant :
require_once 'Pxxo/Config.php';
$config = new Pxxo_Config;
$config->path = dirname(__FILE__).DIRECTORY_SEPARATOR;
$config->url_root = dirname($_SERVER['PHP_SELF']);
$config->class_path = $config->path.'class';
$config->resources_path = $config->path.'rsc';
$config->resources_url = $config->url_root.'/rsc';
$config->session_flag = true;
$config->register();
require_once 'Application.php';
$o = new Application;
$o->addDecorator('Pxxo_Widgets_Decorator_Controller')
$o->main();
$o->dump();