Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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:
... public function indexAction() { // Test form $testForm = new App_Form_Test_Test(); $this->view->form = $testForm; } ...
Formulaire:
... 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
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
+1
Hors ligne
Bonjour,
En ce qui me concerner j'utilise la methode "setMultiOptions($valeurs)" :
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.
Hors ligne
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:
... 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
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 ...
Hors ligne
Regarde le constructeur de Zend_Form . 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
ah ben voilà ca fonctionne
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
Pages: 1