L'utilisateur peut maintenant passer en paramètre un chemin à prendre en priorité pour le thème du widget. Par exemple :
$params['themepath'] = 'chemin/vers/mon/theme/perso';
Ce chemin sera alors automatiquement ajouté en préfixe du ThemePath du widget en question.
Lorsqu'un widget utilise d'autre widgets (qui sont donc des fils), son thème doit pouvoir surcharger le thème de chacun de ses fils. Pour cela il suffit d'ajouter dans son répertoire de thème des répertoires ayant le même nom que les widgets fils.
Par exemple, le widget Pxxo_Widgets_Auth utilise le widget Pxxo_Widgets_Form_Generic. La structure du thème a cette forme :
Pxxo/Widgets/Auth/defaut/defaut.php.html Pxxo/Widgets/Auth/defaut/style.php.css Pxxo/Widgets/Auth/defaut/Pxxo_Widgets_Form_Generic/style.php.css
La méthode $this→setTemplateRaw(); fait son apparition, on peut maintenant définir un template sans forcément qu'il soit dans un fichier…
Exemple :
class test extends Pxxo_widgets { var $texte = ''; function xxx() { parent::Pxxo_Widgets(array(), __FILE__); } function defaut() { $this->setTemplateRaw('defaut', '<?php echo $texte ?>'); $this->texte = 'hello you'; } }
Seuls sont conservés les paramètres de la première méthode exécutée soit par une action standard, soit par un connect.
Par exemple le code suivant :
require_once 'Pxxo/Widgets.php'; class xxx extends Pxxo_widgets { var $fils = ''; var $trace = ''; function xxx($f = '') { parent::Pxxo_Widgets(array(), __FILE__); $this->setTemplateRaw('defaut', '<?php echo $TRUC, $trace, "\n" ?>'); $this->fils = $f; } function defaut() { if (!empty($this->fils)) { $o = new $this->fils(); $this->putWidget('TRUC', $o); $o->connect('action', &$this, 'action', array()); } return array('x'); } function action($data = array()) { array_push($data, $this->ClassName); $this->trace =$this->ClassName." => ".implode(',', $data); return $data; } } class a extends xxx { function a() { parent::xxx('b'); } } class b extends xxx { function b() { parent::xxx('c'); } } class c extends xxx { function c() { parent::xxx('d'); } } class d extends xxx { function d() { parent::xxx('e'); } } class e extends xxx { function e() { parent::xxx(); } } $_GET['e'] = 'action'; $o = new a(); $o->main(); $o->dump();
affichera :
e => e d => e,d c => e,d,c b => e,d,c,b a => e,d,c,b,a
La trace produite lors de l'activation du mode debug est maintenant beaucoup plus riche. On peut maintenant vraiment bien suivre les différents traitements.
On peut maintenant accéder à l'instance de chaque objet (widget, component) fils à l'aide du tableau $this→Components
De la même manière, on peut accéder à l'instance de chaque ressource à l'aide du tableau $this→Resources
Les fichiers de ressources sont générés dans un répertoire uniquement. Le mécanisme de cache s'applique également aux ressources en évitant de régénérer des fichiers identiques à chaque appel.
Plusieurs erreurs qui étaient tolérées avant ne le sont plus, je pense à l'ajout de fichier de ressource qui n'existe pas, ou à la non définition d'un template pour une méthode.