Pxxo_Widget_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.

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 - 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 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");
    }
?>
fr/doc/pxxo_widget_controller.txt · Dernière modification: 2010/05/07 21:10 par parmentf
 
 

©2003-2010 Pxxo

Partenaires : INIST-CNRS | Sourcesup | Web2.0 chat server | Micropolia | Jeux gratuits | Areno