Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 25-04-2008 20:18:07

dryzer
Nouveau membre
Date d'inscription: 24-04-2008
Messages: 5

[Zend_Form][1.5.1] Element Decorator

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 :

Code:

<?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 :

Code:

<?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:

Code:

$obj->getRequired();

devient

Code:

$obj->getAttribs('__required');

Dernière modification par dryzer (25-04-2008 20:19:40)

Hors ligne

 

#2 26-04-2008 13:51:59

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: [Zend_Form][1.5.1] Element Decorator

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

 

#3 28-04-2008 09:56:07

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Zend_Form][1.5.1] Element Decorator

Perso, j'utilise les CSS pour ca :

Code:

label.required:before {
  content: '*';
  color: red;
  font-size: 50%;
}

Place une étoile rouge devant le texte


----
Gruiiik !

Hors ligne

 

#4 29-04-2008 20:21:26

dryzer
Nouveau membre
Date d'inscription: 24-04-2008
Messages: 5

Re: [Zend_Form][1.5.1] Element Decorator

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

 

#5 29-04-2008 20:35:54

dryzer
Nouveau membre
Date d'inscription: 24-04-2008
Messages: 5

Re: [Zend_Form][1.5.1] Element Decorator

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

 

#6 30-04-2008 07:14:01

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: [Zend_Form][1.5.1] Element Decorator

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

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

Code:

<?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)

Code:

        $this->addPrefixPath('Formulaires_Decorators','formulaires/decorators','decorator');
        $this->addElementPrefixPath('Formulaires_Decorators','formulaires/decorators','decorator');

.

Dans l'élément j'ajoute le code suivant :

Code:

           $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

 

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