Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-09-2010 13:25:54

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

[Zend_Form]Décorateur personnalisé et requiredPrefix

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 :

Code:

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.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#2 21-09-2010 19:07:54

omega2
Membre
Lieu: Boisbriand, quebec, canada
Date d'inscription: 01-04-2009
Messages: 85
Site web

Re: [Zend_Form]Décorateur personnalisé et requiredPrefix

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

 

#3 22-09-2010 01:13:44

mdesloges
Nouveau membre
Date d'inscription: 08-09-2010
Messages: 8

Re: [Zend_Form]Décorateur personnalisé et requiredPrefix

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 :

Code:

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.

Code:

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)


Core Developer Centurion
http://www.centurion-project.org - Flexible PHP5 Content Management Framework
http://centurion-project.org/articles - Demo, Updates, Developer Tips

Hors ligne

 

#4 23-09-2010 09:39:30

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Zend_Form]Décorateur personnalisé et requiredPrefix

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 smile

@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 smile

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)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages