IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Form PHP Discussion :

Zend Form Decorator MultiCheckBox [ZF 1.7]


Sujet :

Zend_Form PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut Zend Form Decorator MultiCheckBox
    Bonjour,

    Je n'arrive à personnaliser un multiCheckbox avec zend

    Voici ce qu'il m'affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <ul>
    <div class="multicheckbox">
     
    <ul><li><label for="foo"/><label style="white-space: nowrap;"><input type="checkbox" helper="formMultiCheckbox" value="foo" id="foo-foo" name="foo[]"/>Foo Option</label><br/>
    <label style="white-space: nowrap;"><input type="checkbox" helper="formMultiCheckbox" checked="checked" value="bar" id="foo-bar" name="foo[]"/>Bar Option</label><br/>
    <label style="white-space: nowrap;"><input type="checkbox" helper="formMultiCheckbox" value="baz" id="foo-baz" name="foo[]"/>Baz Option</label><br/>
    <label style="white-space: nowrap;"><input type="checkbox" helper="formMultiCheckbox" checked="checked" value="bat" id="foo-bat" name="foo[]"/>Bat Option</label></li></ul>
    	</div>
    Comme vous voyez, ça insert un <br /> entre chaque label, or, je voudrais plutot un </li><li>

  2. #2
    Membre expérimenté Avatar de Alshten
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 157
    Par défaut
    Tu peux mettre le code source de ton Form ?

  3. #3
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    Bien sûr ^-^

    Mon décorateur personnalisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    <?php
    class My_Decorator_MultiCheckbox extends Zend_Form_Decorator_Abstract
    {
        public function buildLabel()
        {
            $element = $this->getElement();
            $label = $element->getLabel();
            if ($translator = $element->getTranslator()) {
                $label = $translator->translate($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="error">'
            		.$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 = $errors .'<ul>'    
                    . '<li>'.$label.$input.'</li>'
                    . '</ul>'. $desc;
     
            switch ($placement) {
                case (self::PREPEND):
                    return $output . $separator . $content;
                case (self::APPEND):
                default:
                    return $content . $separator . $output;
            }
        }
    }
    ?>
    Dans mon controleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    $form->addElementPrefixPath('My_Decorator',
                                		'My/Decorator/',
                                		'decorator');
     
    $element = new Zend_Form_Element_MultiCheckbox('foo', array(
        'multiOptions' => array(
            'foo' => 'Foo Option',
            'bar' => 'Bar Option',
            'baz' => 'Baz Option',
            'bat' => 'Bat Option',
        )
    ));
    $element->setValue(array('bar', 'bat'));
    $element->setDecorators(array('multiCheckbox'));
    $this->addElement($element);
    A savoir que j'utilise déjà un autre decorator pour les champs texte qui fonctionne bien mais là je suis dans les choux!

  4. #4
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    Bon j'ai trouvé une solumagouille, mais ça me plait moyen...
    En fait j'ai viré le décorateur personnalisé, j'ai abandonné les listes (ça fait beaucoup déjà!) et j'ai ajouté ceci à mon élément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    //....//
    $element->setSeparator(''); // retire la balise <br />
    $element->addDecorators(array(
        array('ViewHelper'),
        array('HtmlTag', array('tag' => 'div')),
        array('Label', array('tag' => '')),
    ));
    ?>
    M'enfin si quelqu'un a la solution miracle je suis preneur!

  5. #5
    Membre expérimenté Avatar de Alshten
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 157
    Par défaut
    Le problème dans ton décorateur personnalisé, c'est que tu traite l'élément comme si c'était un Form Element simple alors qu'il s'agit d'un Form Element de type "Multi", je veux dire par là qu'il y a plusieurs éléments dans ton Form Element.
    Ton Zend_Form_Element_MultiCheckbox est en fait un élément qui contient plusieurs Zend_Form_Element_Checkbox or là tu le traite comme si c'était un élément simple.

    Du coup ta fonction buildLabel par exemple ne retourne rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $label = $element->getLabel();
    Ici $label est nul vu que ton $element est le Zend_Form_Element_MultiCheckbox et non une des options. Il te retourne le label du Zend_Form_Element_MultiCheckbox et comme tu n'en as défini aucun, cela fait nul.

    Bref au final quand tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $output = $errors .'<ul>'    
                    . '<li>'.$label.$input.'</li>'
                    . '</ul>'. $desc;
    $label est nul, $desc est nul et $errors aussi normalement donc cela fait juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $output = '<ul><li>'.$input.'</li></ul>';
    Et pour construire le $input tu as juste fait appel au helper de vue Zend_View_Helper_FormMultiCheckbox dans ta fonction buildInput (c'est le helper retourné par $helper = $element->helper; ) et il te construit juste un Form Element basique avec les décorateurs par défaut et vu que '<br/> est le séparateur par défaut du FormMultiCheckbox, le résultat que tu obtient est normal en fait.

    Je sais pas si j'ai bien expliqué mais en gros, si tu veux obtenir un résultat avec tes <ul> et <li> correctement je te conseille d'utiliser la fonction getMultiOptions() de l'élément Zend_Form_Element_MultiCheckbox pour récupérer un tableau avec chaque option que tu as donné à ton élément puis de construire ton élément avec une boucle en utilisant le helper Zend_View_Helper_FormCheckbox.

    J'éspère que j'ai été clair, si tu as besoin de plus d'explications hésite pas.

  6. #6
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    J'ai peur de ne pas comprendre en effet.
    Si j'envoi un tableau dans un multicheckbox et qu'ensuite je récupère à nouveau un tableau pour ensuite construire des simple checkbox via une boucle, ce n'est pas plus simple de directement créer des simples checkbox sans passer par le Multicheckbox?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Zend Form decorator, problème de balises
    Par keaton7 dans le forum Zend_Form
    Réponses: 2
    Dernier message: 02/05/2012, 14h30
  2. [ZF1.9.2]Zend form et decorator
    Par vince29 dans le forum Zend Framework
    Réponses: 2
    Dernier message: 14/03/2011, 12h48
  3. Zend Form Decorator
    Par Romain_marine dans le forum Zend_Form
    Réponses: 2
    Dernier message: 29/03/2010, 08h59
  4. Réponses: 2
    Dernier message: 16/12/2009, 16h07
  5. Zend Form MultiCheckbox
    Par d4d4++ dans le forum Zend_Form
    Réponses: 1
    Dernier message: 07/11/2008, 12h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo