Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonsoir,
Dans un formulaire, je souhaiterai que tous les labels, dont le champ est obligatoire, aient une petite étoile en plus (sans l'avoir ajouté avec un setLabel()).
J'y arrive grâce au décorator, mais le problème c'est que les input (les champs texte) n'apparaissent plus.
Voici mon code source pour le formulaire :
<?php class forms_AddMemberForm extends Zend_Form { public function __construct($options = null) { parent::__construct($options); $this->setName('addmember'); $this->addElementPrefixPath('decorators', 'decorators/', 'decorator'); $login = new Zend_Form_Element_Text('login'); $login->setLabel('Utilisateur') ->setRequired(true) ->addValidator('NotEmpty') ->addDecorator(new decorators_Label()); $submit = new Zend_Form_Element_Submit('submit'); $submit->setLabel('save'); $this->addElements(array($login,$submit)); } } ?>
Je me suis inspiré de l'intervention de "fetard" : http://www.z-f.fr/forum/viewtopic.php?id=1133
Et mon code source pour le decorator :
<?php class decorators_Label extends Zend_Form_Decorator_Abstract { public function render($content) { $element = $this->getElement(); $label = $element->getLabel(); if ($translator = $element->getTranslator()) { $label = $translator->translate($label); } if ($element->getAttribs('__required')) { $label .= ' *'; } return $element->getView()->formLabel($element->getName(), $label); } } ?>
Je suppose qu'on peut récupérer le champ disparu avec $element mais je n'ai pas trouvé la méthode à appeler.
Pour info si vous passez de la version 1.5.0 à la version 1.5.1:
$obj->getRequired();
devient
$obj->getAttribs('__required');
Dernière modification par dryzer (25-04-2008 20:19:40)
Hors ligne
Sans tester, ton return ne me parait pas clair. Pour être sur que tu retourne la chaine de caractère que tu attends, remplace le return par un echo "" et ajoute un exit();.
Regarde le décorateur d'exemple à cette page : http://framework.zend.com/manual/fr/zen … tors.html.
Merci pour le required, je suis encore à la 1.5.0, j'ai de plus en plus peur avant le passage à là 5.1.
Hors ligne
Perso, j'utilise les CSS pour ca :
label.required:before { content: '*'; color: red; font-size: 50%; }
Place une étoile rouge devant le texte
Hors ligne
whitespirit a écrit:
Sans tester, ton return ne me parait pas clair. Pour être sur que tu retourne la chaine de caractère que tu attends, remplace le return par un echo "" et ajoute un exit();.
Regarde le décorateur d'exemple à cette page : http://framework.zend.com/manual/fr/zen … tors.html.
Merci pour le required, je suis encore à la 1.5.0, j'ai de plus en plus peur avant le passage à là 5.1.
Merci pour ton aide whitespirit, ce n'est pas à la hauteur de ce que j'attendais mais c'est déjà un bon début.
Le lien que tu indiques n'est pas valide (il ne faut pas mettre de point après une url dans ton message sinon il est compté comme faisant partie de l'url), c'est plutôt : http://framework.zend.com/manual/fr/zen … ors.custom
Merci encore et bonne continuation.
Hors ligne
C'est en effet une bonne idée le coup du css, nORKy. C'est ce que je vais utiliser pour l'instant.
Mais je préfère quand même passer par le renderer html. Dès que j'ai le temps, je me replonge dedans et si je trouve, je vous en fais part dans la suite de cette "discussion" (pour les intéressés).
Merci à toi en tout cas.
Hors ligne
Encore une fois (désolé), je ne vais pas répondre directement à ta question car si j'ai bien compris, tu veux ajouter au décorateur déjà existant un paramétre permettant de suffixer d'une * les champs obligatoire. C'est ce que j'ai mais pour cela j'ai du créer mon propre décorateur (le lien auquel il y'a un '.' final .
Je te donne le code de mon décorateur qui le fait. Si tu veux garder la même syntaxe que te fournit les décorateurs de Zend, c'est dans le render qu'il faut placer le code <dt><dd> que tu souhaite obtenir. Sinon ça marche nickel
<?php class Formulaires_Decorators_Composite extends Zend_Form_Decorator_Abstract { /** * C'est dans le label que j'ajoute le '*' devant les champs obligatoires */ public function buildLabel() { $element = $this->getElement(); $label = $element->getLabel(); if ($translator = $element->getTranslator()) { $label = $translator->translate($label); } if ($element->isRequired()) { $label .= '*'; } return $element->getView()->formLabel($element->getName(), $label); } // fabrique le Input public function buildInput() { $element = $this->getElement(); $helper = $element->helper; return $element->getView()->$helper( $element->getName(), $element->getValue(), $element->getAttribs(), $element->options ); } // fabrique les messages d'erreurs public function buildErrors() { $element = $this->getElement(); $messages = $element->getMessages(); if (empty($messages)) { return ''; } return '<div class="errors">' . $element->getView()->formErrors($messages) . '</div>'; } // fabrique la description public function buildDescription() { $element = $this->getElement(); $desc = $element->getDescription(); if (empty($desc)) { return ''; } return '<div class="description">' . $desc . '</div>'; } // c'est ici que je fabrique le html que je veux voir apparaitre pour l'ensemble de l'éléments 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(); //--> Ici, tu peux mettre le html dans lequel tu veux voir tes éléments apparaitre. $output = '<tr><td class="titre_rub">'.$label.'</td>' . '<td class="input">'.$input . $errors. $desc .'</td></tr>'; //<---------------------------------------- return $output; // switch ($placement) { // case (self::PREPEND): // return $output . $separator . $content; // case (self::APPEND): // default: // return $content . $separator . $output; // } } } ?>
Maintenant si tu veux que ton décorateur soit reconnu par la forme, tu dois ajouter le code suivant dans la form (à mettre le chemin ou se trouvera tes décorateurs)
$this->addPrefixPath('Formulaires_Decorators','formulaires/decorators','decorator'); $this->addElementPrefixPath('Formulaires_Decorators','formulaires/decorators','decorator');
.
Dans l'élément j'ajoute le code suivant :
$this->addPrefixPath('Formulaires_Decorators', 'formulaires/decorators','decorator'); // dans le doute, je donne encore une fois le chemin du décorateur $this->setDisableLoadDefaultDecorators(false); // je désactive tous les décorateurs par défaut de ZF $this->addDecorator('Composite'); // j'appel mon décorateur à la rescousse
Voilà, j'espère ne pas t'avoir ennuyé avec ce code, mais théoriquement, si tu fais un copier-coller, ça fonctionnera
Dernière modification par whitespirit (30-04-2008 07:16:36)
Hors ligne