Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Plongé dans les sites, tutos et docs, je n'arrive pas à m'en sortir avec les décorations.
Même avec ce genre de site :
- http://devzone.zend.com/article/3450-De … -Zend_Form
- http://julien-pauli.developpez.com/tuto … sentation/
Avez-d'autres ressources SVP ?
Un exemple parmi tant d'autres, je veux ajouter une une class au td du label ?
$elementDecorators = array(array('ViewHelper'),
array('Errors'),
array('decorator'=>array('1er'=>'HtmlTag'), 'options'=>array('tag'=>'td')),
array('label', array('tag'=>'td')),
array('decorator'=>array('2e'=>'HtmlTag'), 'options'=>array('tag'=>'tr')));
Autre cas, je veux ajouter 3 select dans le même td pour créer un champ date.
Ajouter une ligne avec du texte au milieu du tableau sans que ce soit un composant.
Etc...
Merci
Hors ligne
Bonsoir,
Le sujet sur l'alignement de 3 selects pour former un champ date a déjà été traité plusieurs fois sur le forum.
Tu peux jouer sur l'utilisation d'un DisplayGroup pour grouper tes 3 selects, ou bien insérer un champ avec un petit calendrier JavaScript (DatePicker), c'est qui est quand même beaucoup plus ergonomique !
Hors ligne
Bien plus qu'une simple réponse, j'ai véritablement besoin de comprendre le fonctionnement des decorators.
Parce que sinon je vais être rendu ici toutes les 3 lignes de code.
Exemple, qui peut me répondre à une question pour un besoin aussi bête que ça ?
http://www.z-f.fr/forum/viewtopic.php?id=2725
Donc au final, avez-vous une ressource, un vrai tuto (en FR ?), qui présente les principes, les fonctions, les options possibles, etc.
Merci
Hors ligne
Tu ne peux pas ajouter une classe au td de ton décorateur Label car il utilise en interne un décorateur HtmlTag et on ne peut pas passer d'options à ce dernier.
Dans ton cas, je pense que le plus simple ce serait d'écrire ton propre décorateur : http://framework.zend.com/manual/fr/zen … ators.html
C'est pas bien compliqué, il suffit d'écrire une méthode render. Tu peux t'inspirer de l'exemple My_Decorator_Composite.
Mais bon sinon, c'est vrai que les décorateurs c'est intéressant comme concept, mais aussi super lourd.
Hors ligne
Si malheureusement c'est compliqué
Hors ligne
Je suis bien incapable d'expliquer ce que sont et comment fonctionnent les décorateurs de Zend_Form. Un decorateur étant un "patron de conception" qui ajoute des fonctionnalités à une classe sans passer par l'héritage.
Pour comprendre mieux, je peux te conseiller d'explorer directement le code source. C'est ce que j'ai fait.
Et je me permets de répondre si tard à ta question pour également en poser une car je suis moi-même terriblement perplexe face aux décorateurs. J'ai l'impression que c'est la manière la moins fluide et pratique de créer un formulaire. Et pourtant j'ai eu un vague aperçu de la puissance que ça peut avoir quand on désire gérer des formulaires identiques sur l'ensemble d'un site.
Bref, vous en pensez quoi vous des décorateurs ? Vous les utilisez ? Ou vous avez abandonné ?
Hors ligne
Pour ma part, plus je les utilise et plus je les aime. En fait c'est la documentation qui n'est pas très claire et qui manque d'exemples.
Hors ligne
Bonjour, fêtons mon premier post sur ce forum....
Je suis en cour d'apprentissage sur ce framework, et j'en suis au décorateurs....
j'ai suivit cette méthode, clair qui m'ai enlever la première épine du pied:
http://wiip.fr/content/zend-form-config … -et-les-dd
mais ce que j'aimerais maintenant c'est configurer les erreurs car de listes dans des tables ça fait desordre et surtout pas très élégant.
Mais impossible de trouver comment faire.
J'ai bien lu et relu cette doc :
http://framework.zend.com/manual/fr/zen … ators.html
mais je ne sais pas comment l'appliquer,
- le nom du fichier de la classe?
- Où le mettre ?
- D'où l'appeler ?
j'ai essayer ceci :
Application/
/config
/controllers
/views
/modeles
/form
/Myform.php
/decorateur
/Decorateur.php
Dans le fichier "Myform.php";
class Default_Form_Myform extends Zend_Form { public function init() { $this->addPrefixPath('My_Decorator', '/decorateur/', 'decorator'); $this->setMethod('post'); $this->addElement('text', 'firstname', array('decorators' => array('Composite'), 'label' => 'Votre nom:', 'required' => true, 'filters' => array('StringTrim') )); $this->addElement('text', 'lastname', array('decorators' => array('Composite'), 'label' => 'Votre Prénom:', 'required' => true, 'filters' => array('StringTrim') )); $this->addElement('submit', 'submit', array('decorators' => array('ViewHelper', array(array('td' => 'HtmlTag'), array('tag' => 'td', 'colspan' => 2)), array(array('tr' => 'HtmlTag'), array('tag' => 'tr')) 'ignore' => true, 'label' => 'Ajouter', )); $this->addElement('hash', 'csrf', array('ignore' => true)); $this->setDecorators(array('FormElements', array('HtmlTag', array('tag' => 'table', 'class'=>'users')), 'Form' )); } }
et bien sur ca ne marche pas. je précise que le code du fichier Decorateur.php et celui de la doc Zend.
Si quelqu'un à une idée elle est la bienvenue.
Merci d'avance
Hors ligne
Bon avec un peu de bonne volonté, j'ai répondu à mes question :
- placer le decorateur dans la librairie :
Library/
Zend/
My/
Decorateur/
Composite.php (pour la classe proposer ici : http://framework.zend.com/manual/fr/zen … ors.custom)
l'appelle depuis le fichier du formulaire (application/forms/Myform.php) :
$this->addPrefixPath('My_Decorato', 'My/Decorateur/', 'decorator'); //puis dans chaque éléments : $this->addElement('text', 'firstname', array('decorators' => array('Composite'), 'label' => 'Votre nom:'));
C'étais la partie simple de la chose... Maintenant j'aimerais savoir comment remplacer les <ul><li>Errors</li></ul> de erreurs, si je fait clearDecorators() ou removeDecorators() il me retir tout le message?
help please !!!
Dernière modification par Dede (04-07-2009 20:45:30)
Hors ligne
Dede a écrit:
mais ce que j'aimerais maintenant c'est configurer les erreurs car de listes dans des tables ça fait desordre et surtout pas très élégant.
Je vois pas où est le problème avec une liste ul/li. Tu veux les remplacer par quoi ?
Hors ligne
J'aimerais les mettre simplement dans des div ou p.
J'ai suivi ton tuto pour remettre le formulaire dans une table et lorsqu'une erreur survient la table prend une forme très original.
C'est vrai je pourrais faire du CSS pour rectifier cela mais je cherchais un moyen plus "simple" donc div ou p serait bien, mais, c'est vrai, pas utile?
Je travaille sur chaque éléments un par un pour pouvoir ensuite construire mes application avec ce FW je cherche donc à savoir jusqu'où je peut aller?
Mes questions sont donc,
- quelle sont les modifications possible sur les Errors
- est-ce possible de les mettre (toutes les erreurs) dans une même div même en liste ?
Merci pour tes contribution car elle m'ont été très utile.
Dede
Dernière modification par Dede (05-07-2009 20:50:42)
Hors ligne
Non, inclure ceci dans la librairie n'est vraiment pas une bonne idée.
Moi j'essaye de relier mon decorator mais j'ai ce problème:
Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'General' was not found in the registry; used paths: Default_Form_Decorator_: forms/decorator/ Zend_Form_Decorator_: Zend/Form/Decorator/'
Voici ce que j'esseye de faire dans la classe de mon formulaire, bien sur $this est mon formulaire:
$this->addPrefixPath('Default_Form_Decorator', 'forms/decorator', 'decorator'); $this->addElementPrefixPath('Default_Form_Decorator', 'forms/decorator', 'decorator'); $this->setDecorators(array('General'));
Mon arbo:
application/
--forms/
----Form.php
----decorator/
------General.php
Je suis presque sur qu'il faut définir le dossier des décorateurs quelques part...
Hors ligne
Un petit up ?
Hors ligne
Salut,
je pense qu'il faudrait dans ton bootstrap ajouter le type de resource que tu veux pour que tu puisses y accéder.
Je pense que ton autoload doit être de ce genre là:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { public function _initAutoload() { $autoloader = new Zend_Application_Module_Autoloader( array( 'namespace' => 'Default', 'basePath' => dirname(__FILE__) ) ); return $autoloader; } }
Rajoutes ceci:
$autoloader->addResourceType('formDecorator', 'forms/decorators', 'Form_Decorator');
Je pense que ça devrait suffire pour lancer tes décorateurs.
A++
Hors ligne
Hum...toujours la même erreur, pourtant, j'ai essayé plusieurs possibilités:
L'erreur semble vraiment indiqué que le chemin vers le decorator n'est pas bon
Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'General' was not found in the registry; used paths: Default_Form_Decorator_: forms/decorators/
Pourtant, je fais l'autoloader dans le bootstrap:
$autoloader = new Zend_Application_Module_Autoloader(array( 'namespace' => 'Default_', 'basePath' => dirname(__FILE__), )); $autoloader->addResourceType('Default_Form_Decorator', 'forms/decorators', 'decorator'); return $autoloader;
Je relis évidement dans mon formulaire:
$this->addPrefixPath('Default_Form_Decorator', 'forms/decorators', 'decorator'); $this->setDecorators(array('General'));
Mon decorateur se nomme comme ceci:
class Default_Form_Decorator_General extends Zend_Form_Decorator_Abstract
Et un rappel de mon arbo:
Mon arbo:
application/
--forms/
----Form.php
----decorators/ <--- Je viens de rajouter un "s"
------General.php
Hors ligne
Salut,
il y a une erreur dans ton addResourceType.
Les paramètres que tu indiques sont inversés. tu indiques le namespace, le path puis le type de la ressource alors que c'est le type de la ressource, le path et le namespace.
De plus, n'indiques pas le préfix dans le namespace, l'autoloader l'ajoute automatiquement.
Donc, le code que tu as à placer dans ton bootstrap est bien celui que je t'avais fournis au-dessus:
$autoloader->addResourceType('decorator', 'forms/decorators', 'Form_Decorator');
A++
Hors ligne
Hum...en effet, c'était la première chose que j'avais essayer (ton code) mais sans succès.
Je sais que l'on peut intégrer des ressources également avec le application.ini, est-ce que cela serait possible ?
L'erreur a un lien avec Zend_loader_Plugin, j'ai comme l'impression que ce code dans le bootstrap est inutile ou n'est pas bien placé.
J'ai même esssayer un truc du genre mais sans succès...:
protected function _initAutoloadPlugin() { $loader = new Zend_Loader_PluginLoader(); $loader->addPrefixPath('decorator', 'forms/decorators', 'Form_Decorator'); //$loader->addElementPrefixPath('Default_Form_Decorator', 'forms/decorators/', 'decorator'); return $loader; }
De plus, la documentation indique qu'il est seulement nécessaire de relier dans le script du formulaire. Pourtant, j'ai essayé de reprodurie exactement l'example avec le Composite decorator mais sans succès non plus. Ces decorators me font rager. Je passe quelques heures à chaque jour à trouver une solution mais mon projet ne peut attendre et pour celui-ci, mes formulaires seront fait directement dans mes vues parce que ces decorators sont trop complexes et peu flexible.
Hors ligne
Salut,
Je me suis un peu cassé la tête aussi sur les decorators (et à mon avis ce n'est pas encore fini). Donc pour ce que tu veut faire concernant les "errors" il existe une aide de vue que l'ont peut modifier comme suit :
// Dans la vue de rendu du formulaire $formErrors = $this->getHelper('formErrors'); $formErrors->setElementStart("<div class='errors'>") ->setElementSeparator('</br>') ->setElementEnd('</div>'); echo $this->form ;
Ici http://framework.zend.com/manual/fr/zen … lpers.html pour la doc officielle avec ce passage qui devrait t'aider :
# formErrors($errors, $options) : génère une liste non ordonnée XHTML pour montrer des erreurs. $errors peut être une chaîne de caractères ou un tableau de chaînes ; $options peut être tout attribut que vous pourriez vouloir placer dans la balise ouvrante de la liste. Vous pouvez spécifier des éléments ouvrants, fermants et des séparateurs de contenu alternatifs lors du rendu des erreurs en appelant les différentes méthodes suivantes de l'aide : * setElementStart($string) ; par défaut vaut "<ul class="errors"%s"><li>", où %s est remplacé avec les attributs spécifiés dans $options. * setElementSeparator($string) ; par défaut vaut "</li><li>". * setElementEnd($string) ; par défaut vaut "</li></ul>".
Et pour aligner les éléments, ce lien m'a été utile : http://zendgeek.blogspot.com/2009/07/ze … ators.html
Bon courage, les décorateurs n'auront pas notre peau !
Hors ligne
Salut,
Merci pour ta solution, ce n'est pas vraiment ce que je cherchais, on ne peut toujours pas loader une classe decorator mais je crois que je vais revenir à ta solution jusqu'au jour où je décide de retourner me battre contre ces foutus decorators.
Hors ligne
Quelqu'un a réussis à faire fonctionner le custom decorator de l'example suivant ?
http://framework.zend.com/manual/fr/zen … ators.html
Plugin by name 'Composite' was not found in the registry; used paths: Composite_: /forms/Decorator/ Default_Form_Decorator
Hors ligne
C'est moi, ou je vois des postes en double ???
Oui, mais j'ai fait fonctionner des décorateurs perso sur le meme principe d'arbo
Qaund je l'ai dit dans l'autre posts, vérifie tes chemins et non de namespace
Hors ligne
Merci mille fois itecman, c'est exactement ce que je cherchais depuis un bon bout de temps !
Hors ligne
Pages: 1