[ZF] Décorateur et chemin du fichier

ViPHP
xTG
ViPHP | 7331 Messages

23 déc. 2011, 21:26

Bonsoir à toutes et à tous.

M'étant mis à Zend ce matin j'en viens à tenter de comprendre le mécanisme des décorateurs.
Dans mon cas je tente d'appliquer un décorateur à un élément de formulaire.
Sauf que je dois pas avoir bien compris le fonctionnement de l'auto-loader ou bien je cherche à côté de la plaque...

J'ai ma class nommée Application_Forms_Decorators_Quaptcha se trouvant au chemin application/forms/decorators/Quaptcha.php
Je l'appelle ainsi :
$this->getElement('submit')->addDecorator('Application_Forms_Decorators_Quaptcha');
$this étant une instance d'un objet Zend_Form.

Mais tout est dans le retour...
Warning: Exception caught by form: Plugin by name 'Application_Forms_Decorators_Quaptcha' was not found in the registry; used paths: Zend_Form_Decorator_: Zend/Form/Decorator/
Il semble chercher obligatoirement dans le dossier de la librairie, ce que je ne veux pas vu qu'il s'agit d'un décorateur perso...

L'include path ne référence que le chemin de la lib Zend et le dossier library de mon projet.
Faut-il que je mette une ligne dans le .zfproject.xml pour qu'il puisse la trouver ? Je n'ai rien trouvé dans l'outil en ligne de commande en relation avec les Décorateurs... Et rien non plus dans la documentation.

ViPHP
xTG
ViPHP | 7331 Messages

23 déc. 2011, 21:50

Evidement c'est toujours peu après avoir posté qu'on fini par trouver la réponse...

J'ai trouvé cela pour charger en mémoire le path :
$this->getElement('submit')->addPrefixPath('Application_Forms_Decorators', '../application/forms/decorators/', 'decorator');
$this->getElement('submit')->addDecorator('Quaptcha');

devlop78
Invité n'ayant pas de compte PHPfrance

25 déc. 2011, 05:07

Pour les décorateurs, vu qu'ils sont partageables par plusieurs applications, tu peux les mettre dans la library :

/library/Xtg/...

Tout ce qui se trouve dans la librairie sera normalement (dans le sens de normal) trouvé et inclus par le Zend Loader avec un appel de classe tel que "new Xtg_Form_Decorator_Captcha".

Par contre la convention indique que les namespaces doivent commencer par une majuscule, donc les dossiers aussi. Et pour que le tout fonctionne, il faut que tu enregistres, par exemple dans ton bootstrap si tu es en Application Zend, auprès de Zend Loader, ta bibliothèque Xtg. Toute l'arborescence derrière n'a pas besoin d'être précisée, sauf dans le cas d'utilisation de classe sous forme de chaine de caractères, comme certaines utilisations des helpers de vues et d'aide, les décorateurs, éléments de formulaires, etc.

Il en est de même pour ton application, où tu peux enregistrer des répertoires, par exemple :

/application
/models
/Table
Toto.php
/Row
Toto.php

Tu peux lui indiquer que App_Model correspond au dossier /application/models et tu pourras ensuite appeler normalement App_Model_Table_Toto ... Mais ce n'est pas le même Loader que pour les bibliothèques. C'est un peu déroutant ...

ViPHP
xTG
ViPHP | 7331 Messages

25 déc. 2011, 10:09

Cela m'a pas mal dérouté l'histoire de minuscules, majuscules...
Les dossiers de base de Zend ne prennent pas de majuscules mais les noms de class en prennent.
Et quand on veut faire la même chose avec nos propres modules il va chercher des noms de dossier avec majuscule. :/

devlop78
Invité n'ayant pas de compte PHPfrance

20 janv. 2012, 03:33

Les dossiers de la library de Zend contiennent toujours des majuscules, et il en doit être de même pour les tiens. Pour ce qui est des dossiers de l'application, leur chargement est géré par Zend et ce ne sont pas des classes vraiment comme les autres (voire pas de classes pour tout ce qui est vue). Perso, j'ai un dossier models que j'indique à Zend pour App_Model_X, X étant une suite de mots toujours en majuscules

Par exemple

/models
/Table
Users.php
Articles.php
/Row
User.php
...

La convention indique bien une notation CamelCase pour les classes, donc aussi pour les dossiers et noms de fichier. Seuls les controlleurs à peu de choses près ne sont pas concernés.

Pour les décorateurs, que ce soit en library ou en application, je te conseille le respect de la convention, car Zend lui-même l'appliquera.