Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 15-07-2008 09:51:56

Ochi
Nouveau membre
Date d'inscription: 15-07-2008
Messages: 5

[Résolu][zend_form] et template : comment faire ?

Bonjour,

Est il possible d'utiliser un template pour un formulaire ?

Je voudrais par exemple définir un template unique de formulaire et dans ce template indiquer où il faut placer tel champs et tel autre, où mettre le bouton submit et comment afficher les div/tableaux, les labels des champs etc. Ceci afin d'éviter ces satanés setdecoration pas du tout fluide dans un moteur de template...

Dans la doc de zend, il y a bien un 'viewscript' qui me donne une idée de comment faire : http://framework.zend.com/manual/en/zen … ators.html

Mais celà ne fonctionne pas.


Voici mon code en exemple que j'ai pensé être bon :

   

Code:

        $form->setDecorators(array(
            array('ViewScript', 
            array('script' => 'templates/formulaire.tpl'))

Et le code du formulaire.tpl :

   

Code:

<h4>Inscription</h4>
<form action="<?= $this->escape($this->form->getAction() ?>"
      method="<?= $this->escape($this->form->getMethod() ?>">

        <?= $this->form->firstname ?>
        <?= $this->form->lastname ?>
        <?= $this->form->email ?>
        <?= $this->form->address1 ?>
        <?= $this->form->address2 ?>
        <?= $this->form->city ?>
        <?= $this->form->state ?>
        <?= $this->form->postal ?>
        <?= $this->form->phone ?>


    <?= $this->form->submit ?>
    </form>

J'ai essayé de rajouter un setScriptPath au form, mais rien n'y fait.
J'ai toujours ce foutu message d'erreur : Warning: No view script registered with ViewScript decorator in /var/partage/doc/local/www/lib/Zend/Form.php on line 2223

sad

Merci par avance pour les réponses qui m'aideront sans nul doute wink

Edit : modification du titre du sujet pour être plus explicite.

Dernière modification par Ochi (17-07-2008 18:14:08)

Hors ligne

 

#2 15-07-2008 10:05:41

Ochi
Nouveau membre
Date d'inscription: 15-07-2008
Messages: 5

Re: [Résolu][zend_form] et template : comment faire ?

bon, pour plus de précision :


       

Code:

$form->viewScript =('private/application/admin/views/scripts');

donne :

Code:

exception 'Zend_Form_Exception' with message 'Only form elements and groups may be overloaded; variable of type "string" provided' in /var/partage/doc/local/www/lib/Zend/Form.php:2380

Hors ligne

 

#3 15-07-2008 13:36:05

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Résolu][zend_form] et template : comment faire ?

si ça peut t'aider
http://sekaijin.ovh.org/?p=13

Hors ligne

 

#4 15-07-2008 14:09:31

Ochi
Nouveau membre
Date d'inscription: 15-07-2008
Messages: 5

Re: [Résolu][zend_form] et template : comment faire ?

En moteur de template j'utilise Smarty.

Le problème, c'est que la génération des formulaires n'est pas très pratique à mon gout

Hors ligne

 

#5 15-07-2008 17:09:52

Ochi
Nouveau membre
Date d'inscription: 15-07-2008
Messages: 5

Re: [Résolu][zend_form] et template : comment faire ?

Problème partiellement résolu (il me faut toujours user des decorators) :

Code:

$text = new Zend_Form_Element_Text('km', array(
            'label'    => 'Nombre de km :',
            'value'    => array($bonhomme, 'setKm', 'getKm'),
            'class' => 'disabled',
            'disabled' => 'disabled'
        ));
        $text->addDecorators(array(
            array('ViewHelper'),
            array('Errors'),
            array('HtmlTag', array('tag' => 'div', 'class' => 'ligne')),
            array('Label', array('tag' => null)),
        ));
        $formulaire['infoKms'] = $text;

Et dans mon code je fais juste un appel à $formulaire.nbRencontre par exemple.

Je ne met en forme que les éléments un par un et n'utilise donc plus le zend_form...

Hors ligne

 

#6 17-07-2008 18:13:30

Ochi
Nouveau membre
Date d'inscription: 15-07-2008
Messages: 5

Re: [Résolu][zend_form] et template : comment faire ?

résolu.

Et voici la solution en n'utilisant plus du tout les decorators (permet d'utiliser uniquement le template". Plus de code html dans le php.

Et voici la démarche si d'autres cherchent une solution au même problème.

J'ai horreur des posts qui se finisse par un "c'est bon, merci." et rien d'autre... Ils ne servent qu'à l'auteur et non à un internaute qui pourrait avoir le même problème.

construction du formulaire :

Code:

    public function getFormUtilisateur(Utilisateur $utilisateur) {
        $form = new Zend_Form('utilisateur');

        $form->addElement('text', 'numero', array(
            'label'    => 'Numéro de compte',
            'value'    => array($utilisateur, 'setNumero', 'getNumero'),
        ));
        $form->addElement('text', 'email', array(
            'label'    => 'E-Mail',
            'value'    => array($utilisateur, 'setEmail', 'getEmail'),
        ));
        $form->addElement('text', 'motDePasse', array(
            'label'    => 'Mot de passe',
            'value'    => array($utilisateur, 'setPassword', 'getPassword'),
        ));

        $form->addElement('submit', 'Enregistrer', array(
            'onclick' => 'javascript:poster()'
        ));

        return $form;
    }

création d'un tableau

Code:

    /**
     * Retourne un tableau des éléments du formulaire en mode modification
     * 
     * @param Zend_Form $form
     * @return array
     */
    public function getFormModeWrite(Zend_Form $form) {
        $array = array();
        $array['action'] = $form->getAction();
        $array['method'] = $form->getMethod();
        foreach ( $form->getElements() as $element ) {
            $element->removeDecorator('HtmlTag');
            $element->removeDecorator('Label');
            $array[$element->getName()]['label'] = $element->getLabel();
            $array[$element->getName()]['element'] = $element;
        }
        return $array;
    }

Passage des infos au template :

Code:

                $form = $this->model->getFormUtilisateur($utilisateur, true);
                $form->populate($this->_getAllParams());
                $this->view->formulaire = $this->model->getFormModeWrite($form);

affichage :

Code:

<form id="utilisateur" enctype="application/x-www-form-urlencoded" method="post" action="{h str=$formUtilisateur}">
    <div class="encart_fiche_haut">
        <div class="form_titre">{t str="Informations sur l'utilisateur"}</div>
        <div class="form_elements">
            <div class="ligne_fiche">
                    <div class="label_ligne_informations">
                        {t str=$formulaire.email.label} : 
                    </div>
                    <div class="element_ligne_informations">
                    {h str=$formulaire.email.element}
                    </div>
            </div>

etc etc

Dernière modification par Ochi (17-07-2008 18:16:10)

Hors ligne

 

#7 27-08-2008 18:04:41

elkolonel
Administrateur
Lieu: Grasse
Date d'inscription: 18-12-2007
Messages: 299
Site web

Re: [Résolu][zend_form] et template : comment faire ?

Merci Ochi, je pense que cela va me servir. J'étais justement en train de me creuser les neurones sur un problème similaire. :-)

Hors ligne

 

#8 01-09-2008 16:25:28

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: [Résolu][zend_form] et template : comment faire ?

Géniallissime cette technique !
Je crois que beaucoup de mes formulaires vont avoir besoin d'un petit lifting smile
Ton astuce est simplement parfait quand ont créé des formulaires très design,  avec du texte par si par là

J'ai transformé ta fonction getFormModeWrite en helper d'action comme ça je peux l'utiliser n'importe où.

merci beaucoup !

Hors ligne

 

#9 16-10-2008 14:20:17

elkolonel
Administrateur
Lieu: Grasse
Date d'inscription: 18-12-2007
Messages: 299
Site web

Re: [Résolu][zend_form] et template : comment faire ?

Alors je reviens sur ce sujet, car en fait à l'époque je n'avais pas eu le temps de creuser plus que cela. Mais j'y reviens aujourd'hui et ai bien pour intention de percer le "mystère" de la génération de formulaire libéré du design wink

Mais pour cela j'aurai si cela est possible besoin de quelques explications de texte supplémentaire.
Ochi, est ce qu'il t'es possible de préciser pour chaque extrait de code où il est censé trouver sa place dans le MCV, j'avoue être un peu perdu de prime abord...

Entre autre chose, à quoi servent setNumero, getNumero ci-dessous. J'ai sans doute mal cherché dans la doc mais je n'ai pas trouvé de référence sur ce type de construction. S'agit il d'appel à une fonction ?

Code:

        $form->addElement('text', 'numero', array(
            'label'    => 'Numéro de compte',
            'value'    => array($utilisateur, 'setNumero', 'getNumero'),
        ));

Merci de bien vouloir éclairer ma lanterne.

Cordialement,

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