Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 25-08-2010 20:25:41

MichaelB
Membre
Date d'inscription: 27-06-2010
Messages: 21

Comment pré-remplir un formulaire (select) avec des données de la db

Bonjour,

Après plusieurs heures de recherches sans succès j'aurais voulu savoir quelle est la meilleure technique pour pré-compléter un formulaire.. je m'explique...

Exemple:

Une page avec un formulaire "Choix du pays" avec une liste déroulante et un bouton.
Les données de la liste déroulante doivent provenir de la base de données (un modèle) et
dépendent d'un paramètre que je dois pouvoir récupérer ($this->getRequest()->getParam('XXX')).

J'ai donc mon controller, vue, un formulaire qui étend Zend_Form...

Controller:

Code:

...

public function indexAction()
{
        // Test form
        $testForm = new App_Form_Test_Test();

               $this->view->form = $testForm;
}

...

Formulaire:

Code:

...

public function init()
{
                $this->setMethod('post');

        $pays = new Zend_Form_Element_Select('pays_select');
        $pays->setLabel('Pays')
             ->setRequired(true);

                $this->addElement($pays);

                ...
}

...

Est-ce le formulaire qui doit appeler le modèle ou le controller ? (pour pré-remplir une liste déroulante par exemple)

Si c'est le formulaire qui appelle le modèle, comment récupérer un paramètre que j'ai setter auparavant avec $request->setParam..  ?


Merci d'avance pour votre aide!

Hors ligne

 

#2 25-08-2010 23:59:58

vg33
Membre
Date d'inscription: 30-07-2008
Messages: 46

Re: Comment pré-remplir un formulaire (select) avec des données de la db

Pour moi, c'est le controller qui appelle le modèle. Tu n'as donc pas de problèmes pour récupérer ta requête.
Ensuite, je passe les données au formulaire.
J'ai pour cela étendu Zend_Form en rajoutant (notamment) le paramètre $data dans le constructeur. Je stocke ces données, puis j'y accède dans init() avec un simple $this->_data.

Hors ligne

 

#3 26-08-2010 02:34:15

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: Comment pré-remplir un formulaire (select) avec des données de la db

+1

Hors ligne

 

#4 26-08-2010 06:22:37

Dede
Membre
Date d'inscription: 26-06-2009
Messages: 99

Re: Comment pré-remplir un formulaire (select) avec des données de la db

Bonjour,

En ce qui me concerner j'utilise la methode "setMultiOptions($valeurs)" :

Code:

public function indexAction()
{
     ...
     $monForm = new Form_Monformulaire();
     
     $param = $this->_request()->getParam('xxx');
     $db = new Model_Db_MaTable();
     $donneesSelect = $db->fetchAll('param = '.$param);
     $select = array();
     foreach ($donneesSelect as $value){
                $select[$value['valeur_du_selecteur']] = $value['text_a_afficher'];
     }
     $form->getElement('id_du_selecteur')->setMultiOptions($select);
     .....

}

La methode getElement() est très pratique pour modifier les valeur par défaut des élément du formulaire (setValue(), setAttrib(), ...etc) à partir du controlleur.


« Il ne faut pas lier un navire à une seule ancre, ni une vie à un seul espoir. »
Epictète
http://www.noumcreation.com

Hors ligne

 

#5 26-08-2010 10:26:26

MichaelB
Membre
Date d'inscription: 27-06-2010
Messages: 21

Re: Comment pré-remplir un formulaire (select) avec des données de la db

Merci !

Ces 2 techniques me paraissent intéressantes.. Je vais étudier laquelle est la plus adaptée dans mon cas.

@vg33 J'avais essayé la technique que tu utilises mais j'avais un soucis pour passer les datas du constructeur à la fonction init()

Formulaire qui étend Zend_Form:

Code:

        ...
    private $_paysSelectData;

    public function __construct($options = null, $datas)
    {
        parent::__construct($options);

        $this->_paysSelectData = $datas['pays_select'];
    }

    
    public function init()
    {
        $this->setMethod('post');

        $pays = new Zend_Form_Element_Select('pays_select');
        $pays->setLabel('Choix du pays')
             ->setRequired(true);

        foreach ($this->_paysSelectData as $c)
        {
           $pays->addMultiOption($c->getPaysId(), $c->getName());
        }

        $this->addElement($pays);


        $this->addElement('submit', 'submit', array(
            'ignore'   => true,
            'label'    => 'Save',
            ));
    }
        ...

Je suis censé pouvoir accéder à ma variable $this->_paysSelectData partout dans cette classe car elle est settée dans le constructeur mais apparemment elle est vide dans la méthode init(). Je dois faire quelque chose de faux..  Ca fonctionne si je met tout dans le constructeur, alors à quoi sert la méthode init() ? Dois-je obligatoirement l'utiliser dans mon cas ?


Merci de votre aide!

Hors ligne

 

#6 26-08-2010 12:26:55

Dede
Membre
Date d'inscription: 26-06-2009
Messages: 99

Re: Comment pré-remplir un formulaire (select) avec des données de la db

Concernant ton erreur je ne vois pas d'où ça vient.
En ce qui me concerne, j'utilisais, au départ, cette méthode. Après avoir entendu dire que la surcharge du constructeur n'étais pas forcement bon pour les performances, j'ai opter pour l'autre méthode ...


« Il ne faut pas lier un navire à une seule ancre, ni une vie à un seul espoir. »
Epictète
http://www.noumcreation.com

Hors ligne

 

#7 26-08-2010 19:06:34

vg33
Membre
Date d'inscription: 30-07-2008
Messages: 46

Re: Comment pré-remplir un formulaire (select) avec des données de la db

Regarde le constructeur de Zend_Form smile . Il appelle en dernier init().
Donc, dans ton code, il faut affecter $this->_paysSelectData avant d'appeler parent::__construct($options). Sinon tes données ne sont en effet pas disponibles dans init().

Hors ligne

 

#8 27-08-2010 11:16:26

MichaelB
Membre
Date d'inscription: 27-06-2010
Messages: 21

Re: Comment pré-remplir un formulaire (select) avec des données de la db

ah ben voilà ca fonctionne smile

Merci à tous pour votre aide précieuse, je vais pouvoir maintenant étudier ces deux techniques et en choisir une...

Dernière modification par MichaelB (27-08-2010 11:16:40)

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