Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Hello à tous je suis en train de regarder les décorators pour que les formulaires soient présentables
J'aimerais votre avis pour savoir s'il faut vraiment les utiliser ou non. Personnellement ce que je comprends mal car le que le concept du MVC est de séparer les différentes / couches, traitements.
Et là on se retrouve à bourrer tout dans le modèle et dans la la vue à avoir genre une seule ligne du style :
<?php echo $this->form ;?>
( au lieu d'avoir une répartition du code dans les deux fichiers )
1) Quel est l'avantage majeur de surcharger le modèle avec les décorators ? De pas devoir re-coder les champs dans la vue j'imagine.
2) De devoir faire des gros volumes de code à chaque fois ça devient pas un peu pénible ? (genre ci-dessous pour chaque champ)
$element->setDecorators(array( 'ViewHelper', 'Description', 'Errors', array('HtmlTag', array('tag' => 'dd')), array('Label', array('tag' => 'dt')), ));
3) Je comprends mal le choix du standard des dd/dt, c'est pas vraiment le standard le mieux reconnu par tous les naviguateurs. (mais y a certainement une raison )
Ouch je suis un peu pénible mais j'aime comprendre la raison des choix et que je fasse moi aussi le bon choix au départ de l'application (après c'est toujours un peu la misère quand il faut faire marche arrière).
A première vue selon moi, les décorators c'est pratique si on fait quelque chose de simple, sinon ca devient ingérable et limite illisible. (Je vais me faire taper )
Dernière modification par m1b (05-01-2010 16:02:08)
Hors ligne
En fait après un petit tour sur le web, je constate que l'on est un peu obligé d'utiliser les décorators (ce que je vais faire).
Actuellement dans le standard on a ceci :
$elements->setDecorators(array('ViewHelper'), array('Errors'), array('Description', array('tag' => 'p', 'class' => 'description')), array('HtmlTag', array('tag' => 'dd')), array('Label', array('tag' => 'dt')), );
Et imaginons que dans le standard je décide d'utiliser utiliser ça
$elementDecorators = array(array('ViewHelper'), array('Errors'), array('decorator'=>array('1er'=>'HtmlTag'),'options'=>array('tag'=>'td')), array('label',array('tag' => 'td')), array('decorator'=>array('2eme'=>'HtmlTag'),'options'=>array('tag'=>'tr'))); http://framework.zend.com/manual/fr/zend.form.decorators.html
Le but serait bien sur de ne pas avoir besoin de déclarer ça à chaque champ (logique ) et que si tout à coup un champ doit être différent alors à ce moment là on va utiliser un décorator.
Comment faut-il procéder, il faut créer un décorator personnalisé (qui concatène les balises comme on veut en faisant genre :
'<label>'.$monlabel.'</label><div>'.......
Ou bien est-ce qu'il faut modifier quelque part les valeur par défaut du décorator ?
Dernière modification par m1b (05-01-2010 11:31:27)
Hors ligne
Etend au choix ton formulaire, ton élement ou ton décorateur.
Ca fait gagner du temps, et ca permet d'uniformiser le design du site
Hors ligne
Re,
J'ai procédé donc de la manière suivante en créant mon fichier standard.php (décorator) afin de caster les éléments dans des "div".
sous le répertoire suivant :
---application ------forms ---------decorators ------------standard.php
Contenu du fichier standard.php (basé sur la doc de zend)
<?php class Default_Form_Decorator_Standard extends Zend_Form_Decorator_Abstract { public function buildLabel() { $element = $this->getElement(); $label = $element->getLabel(); if ($translator = $element->getTranslator()) { $label = $translator->translate($label); } if ($element->isRequired()) { $label .= '*'; } $label .= ':'; return $element->getView()->formLabel($element->getName(), $label); } public function buildInput() { $element = $this->getElement(); $helper = $element->helper; return $element->getView()->$helper( $element->getName(), $element->getValue(), $element->getAttribs(), $element->options ); } public function buildErrors() { $element = $this->getElement(); $messages = $element->getMessages(); if (empty($messages)) { return ''; } return '<div class="errors">' . $element->getView()->formErrors($messages) . '</div>'; } public function buildDescription() { $element = $this->getElement(); $desc = $element->getDescription(); if (empty($desc)) { return ''; } return '<div class="description">' . $desc . '</div>'; } public function render($content) { $element = $this->getElement(); if (!$element instanceof Zend_Form_Element) { return $content; } if (null === $element->getView()) { return $content; } $separator = $this->getSeparator(); $placement = $this->getPlacement(); $label = $this->buildLabel(); $input = $this->buildInput(); $errors = $this->buildErrors(); $desc = $this->buildDescription(); $output = '<div class="form_element">' . '<div class="form_label">'.$label.'</div>' . '<div class="form_input">'.$input.'</div>' . $errors . $desc . '</div>'; switch($placement) { case (self::PREPEND): return $output . $separator . $content; case (self::APPEND): default: return $content . $separator . $output; } } }
Appel du décorator dans le formulaire
$form->addElementPrefixPath('Default_Form_Decorator',APPLICATION_PATH.'/forms/decorators','decorator');
Puis sur le champ concerné
->setDecorators(array('Standard'));
NB : si APPLICATION_PATH n'est pas défini ajoutez dans l'index.php
define('APPLICATION_PATH',realpath(dirname(__FILE__) . '/application'));
Voilà je crois que j'ai tout dis merci
Hors ligne
Est-ce que si l'on applique un décorateur à l'élément est-ce qu'on peut faire ajouter des tags en plus de celui défini ?
->setDecorators(array('Standard',array(tag=>mon_tag_que_jajoute));
Hors ligne