Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Salut,
J'utilise exceptionnellement Zend_Form avec les décorateurs pour un mini-projet dont le dév. doit être très rapide.
J'ai créé vite fait un décorateur personnalisé histoire d'avoir des label et input réunis dans un même div, mais je rencontre un petit soucis avec le préfixe des labels pour les champs requis.
voilà le code en question :
public function buildLabel() { $element = $this->getElement(); $label = $element->getLabel(); if ($translator = $element->getTranslator()) { $label = $translator->translate($label); } if ($element->isRequired()) { $element->setDecorators(array( 'Label', array( 'requiredPrefix' => ' <span class="required">*</span>', 'escape' => false )) ); } //$label .= ':'; return $element->getView() ->formLabel($element->getName(), $label); }
Je bidouille parce que j'ai pas l'habitude d'utiliser ces fonctionnalités. Mon requiredPrefix n'est tout simplement pas pris en compte. Je me doute que c'est parce que mon décorateur n'est pas pris en compte, mais je vois qu'un helper de vue est utilisé pour rendre l'élément, ça devrait donc fonctionner (logiquement).
Je passe par ça parce que si je met le html directement dans ma variable $label, il serait évidemment échappé.
Pour l'instant, je n'obtiens aucun préfixe.
Si un de vous a déjà l'habitude de ces choses là et peut m'apporter une réponse, ça me ferait gagner du temps.
Merci beaucoup.
A+ benjamin.
Hors ligne
Salut, juste pour savoir, est ce que ce code est celui de ton décorateur personnalisé? Si oui, ça me parait bizarre de voir un "setdecorators" (oublis tous les décorateurs puis met ceux que je t'indique) à l'intérieur. Ca n'est pas au décorateur de décider si on a le droit d'en mettre d'autres. Si en plus ce code est appelé par la fonction "render" du décorateur alors c'est trop tard, ceux qui étaient présent avant ont déjà été traité pour créer l'affichage.
Quelques questions complémentaires :
- C'est quoi le nom complet de ton décorateur?
- Est ce que tu as déclaré le préfixe de ton décorateur maison avant de le rajouter à l'élément du formulaire? (si c'est pas fait avant, alors c'est le décorateur du framework qui sera utilisé)
Pour enlever toute ambigüité, normalement tu peux utiliser le nom complet du décorateur au lieux de la forme réduite. (pas testé personnellement) Par exemple tu peux mettre "Mon_Decorateur_Label" au lieux d'un simple "label".
Si ça ne marche pas, alors que ton préfixe de décorateur est déclaré, tu as aussi la syntaxe "addDecorator( $objetDecorateur)" avec $objetDecorateur initialisé par un "new monDecorateur()". Ca évite toute la partie "recherche parmi les répertoires de décorateurs déclaré" mais au prix de plus de code maison.
Autre détail de syntaxe à connaitre, si tu veux mettre deux exemplaires d'un même décorateur avec un "addDecorators" si tu précises un libellé pour le décorateur. Le premier paramètre du "addDecorator" se présente alors sous la forme d'un tableau "array('unnom' => 'decorator')" au lieux du simple nom du décorateur.
Hors ligne
Bonjour,
à la fin la méthode retourne une chaine produite par le helper de vue "formLabel"
ce helper de vue n'utilise aucunement l'objet $element. En simplifiant le code (j'enlève tout ce qui ne sert à rien) cela donne ça :
public function buildLabel() { $element = $this->getElement(); $label = $element->getLabel(); return $element->getView() ->formLabel($element->getName(), $label); }
les décorateurs entrent en scène quand on appelle la méthode "render" sur les objets Zend_Form_Element (ce qui est fait quand on fait un render d'un Zend_Form), comme illustré dans le snippet ci dessous.
Centurion_Form_ElementWithCustomDecorator extends Zend_Form_Element { public function init() { $this->setDecorators(array( 'ViewHelper', array( 'decorator' => 'Label', 'options' => array( 'requiredPrefix' => ' <span class="required">*</span>', 'escape' => false ) ) ); } } $monElement = new Centurion_Form_ElementWithCustomDecorator('Mon Element'); $monElement->setRequired(true); $monElement->setLabel('<strong>Mon super label</strong>'); $monElement->render();
Suivant le design pattern "decorator", le resultat d'un décorateur sera passé en paramètre au suivant qui complètera ce résultat et le passera au suivant, et ainsi de suite.
dans Zend, le fait que label et le input ne soit pas dans le même div, viens du fait que les décorateurs par défaut sépare ces éléments (en insérant d'autres décorateurs entre les deux), mais il n'est pas forcément besoin de faire un décorateur personnalisé, il peut suffire de changer l'ordre et/ou le nombre des décorateurs (comme ce qui est fait ci dessus)
Hors ligne
Hello,
Ok j'ai regardé un peu mieux et j'ai pu voir un peu comment les décorateurs fonctionnent. Je ne les utilise pour ainsi dire jamais et sur ce coup là j'avais pas trop le temps de m'attarder sur leur fonctionnement. Effectivement c'est sur le render que les décorateurs sont invoqués les uns à la suite des autres, donc forcément comme vous me le faites très bien remarquer, le décorateur sur le label ne peut pas fonctionner
@omega2 :
Mon décorateur fonctionne bien, je n'ai pas de problème de chargements de classe.
@mdesloges :
J'ai fait un décorateur personnalisé pour ne pas perdre du temps avec les décorateurs de base pour arriver à mes fins et tout rendre d'un coup comme je le souhaite. Tout simplement parce que je ne les utilise pas et ne compte pas les utiliser autant que faire se peut, c'était surtout pour le gain de temps apporté dans notre rush par Zend_Form avec le render du form et des erreurs. J'ai même failli tout laissé par défaut pour dire
Au final, mon intégrateur s'est débrouillé avec les formulaires (vraiment trop pressés :p).
En tout cas merci pour votre aide à tous les deux.
A+ benjamin.
Dernière modification par Delprog (23-09-2010 09:40:05)
Hors ligne
Pages: 1