Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-01-2010 17:20:08

m1b
Membre
Date d'inscription: 04-05-2009
Messages: 44

[RESOLU] Les décorators faut-il les utiliser ? (oui)

Hello à tous je suis en train de regarder les décorators pour que les formulaires soient présentables smile

J'aimerais votre avis pour savoir s'il faut vraiment les utiliser ou non. Personnellement ce que je comprends mal car le que le concept du MVC est de séparer les différentes / couches, traitements.

Et là on se retrouve à bourrer tout dans le modèle et dans la la vue à avoir genre une seule ligne du style :

Code:

<?php echo $this->form ;?>

( au lieu d'avoir une répartition du code dans les deux fichiers )

1) Quel est l'avantage majeur de surcharger le modèle avec les décorators ? De pas devoir re-coder les champs dans la vue j'imagine.
2) De devoir faire des gros volumes de code à chaque fois ça devient pas un peu pénible ? (genre ci-dessous pour chaque champ)

Code:

$element->setDecorators(array(
    'ViewHelper',
    'Description',
    'Errors',
    array('HtmlTag', array('tag' => 'dd')),
    array('Label', array('tag' => 'dt')),
));

3) Je comprends mal le choix du standard des dd/dt, c'est pas vraiment le standard le mieux reconnu par tous les naviguateurs. (mais y a certainement une raison smile )

Ouch je suis un peu pénible mais j'aime comprendre la raison des choix et que je fasse moi aussi le bon choix au départ de l'application (après c'est toujours un peu la misère quand il faut faire marche arrière).

A première vue selon moi, les décorators c'est pratique si on fait quelque chose de simple, sinon ca devient ingérable et limite illisible. (Je vais me faire taper tongue)

Dernière modification par m1b (05-01-2010 16:02:08)

Hors ligne

 

#2 05-01-2010 11:30:03

m1b
Membre
Date d'inscription: 04-05-2009
Messages: 44

Re: [RESOLU] Les décorators faut-il les utiliser ? (oui)

En fait après un petit tour sur le web, je constate que l'on est un peu obligé d'utiliser les décorators (ce que je vais faire).

Actuellement dans le standard on a ceci :

Code:

$elements->setDecorators(array('ViewHelper'),
                         array('Errors'),
                         array('Description', array('tag' => 'p', 'class' => 'description')),
                         array('HtmlTag', array('tag' => 'dd')),
                         array('Label', array('tag' => 'dt')),
                         );

Et imaginons que dans le standard je décide d'utiliser utiliser ça

Code:

$elementDecorators = array(array('ViewHelper'),
                           array('Errors'),
                           array('decorator'=>array('1er'=>'HtmlTag'),'options'=>array('tag'=>'td')),
                           array('label',array('tag' => 'td')),
                           array('decorator'=>array('2eme'=>'HtmlTag'),'options'=>array('tag'=>'tr')));

http://framework.zend.com/manual/fr/zend.form.decorators.html

Le but serait bien sur de ne pas avoir besoin de déclarer ça à chaque champ (logique smile ) et que si tout à coup un champ doit être différent alors à ce moment là on va utiliser un décorator.
Comment faut-il procéder, il faut créer un décorator personnalisé (qui concatène les balises comme on veut en faisant genre :

Code:

'<label>'.$monlabel.'</label><div>'.......

Ou bien est-ce qu'il faut modifier quelque part les valeur par défaut du décorator ?

Dernière modification par m1b (05-01-2010 11:31:27)

Hors ligne

 

#3 05-01-2010 11:48:20

Ph
Membre
Date d'inscription: 02-01-2010
Messages: 40

Re: [RESOLU] Les décorators faut-il les utiliser ? (oui)

Etend au choix ton formulaire, ton élement ou ton décorateur.

Ca fait gagner du temps, et ca permet d'uniformiser le design du site

Hors ligne

 

#4 05-01-2010 16:00:12

m1b
Membre
Date d'inscription: 04-05-2009
Messages: 44

Re: [RESOLU] Les décorators faut-il les utiliser ? (oui)

Re,

J'ai procédé donc de la manière suivante en créant mon fichier standard.php (décorator) afin de caster les éléments dans des "div".

sous le répertoire suivant :

Code:

---application
------forms
---------decorators
------------standard.php

Contenu du fichier standard.php (basé sur la doc de zend)

Code:

<?php
class Default_Form_Decorator_Standard extends Zend_Form_Decorator_Abstract
{
    public function buildLabel()
    {
        $element = $this->getElement();
        $label = $element->getLabel();
        if ($translator = $element->getTranslator()) {
            $label = $translator->translate($label);
        }
        if ($element->isRequired()) {
            $label .= '*';
        }
        $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="errors">' .
               $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 = '<div class="form_element">'
                . '<div class="form_label">'.$label.'</div>'
                . '<div class="form_input">'.$input.'</div>'
                . $errors
                . $desc
                . '</div>';

        switch($placement) {
            case (self::PREPEND):
                return $output . $separator . $content;
            case (self::APPEND):
            default:
                return $content . $separator . $output;
        }
    }
}

Appel du décorator dans le formulaire

Code:

$form->addElementPrefixPath('Default_Form_Decorator',APPLICATION_PATH.'/forms/decorators','decorator');

Puis sur le champ concerné

Code:

->setDecorators(array('Standard'));

NB : si APPLICATION_PATH n'est pas défini ajoutez dans l'index.php

Code:

define('APPLICATION_PATH',realpath(dirname(__FILE__) . '/application'));

Voilà je crois que j'ai tout dis smile merci

Hors ligne

 

#5 08-01-2010 17:49:08

m1b
Membre
Date d'inscription: 04-05-2009
Messages: 44

Re: [RESOLU] Les décorators faut-il les utiliser ? (oui)

Est-ce que si l'on applique un décorateur à l'élément est-ce qu'on peut faire ajouter des tags en plus de celui défini ?

Code:

->setDecorators(array('Standard',array(tag=>mon_tag_que_jajoute));

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