Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'ai un souci avec mon formulaire.
En effet, celui-ci ne veut pas s'afficher dans ma vue, mais par contre, j'arrive à afficher les éléments individuellements.
Je vous fournis ci joint les différents bouts de code :
L'action index de mon controlleur :
public function indexAction() { // action body $etb_id = $this->_getParam('etb_id'); $formDefinePeriodes = new Application_Form_DefinePeriodes(); $formEtatPeriodes = new Application_Form_EtatPeriodes(); $formNotation = new Application_Form_Notation(); $formDefineLangues = new Application_Form_DefineLangues(array('1234' => 'Anglais', '5678' => 'Allemand')); $this->view->notation = $formNotation; $this->view->definePeriodes = $formDefinePeriodes; $this->view->etatPeriodes = $formEtatPeriodes; $this->view->langues = $formDefineLangues; $this->view->etbid = $etb_id; }
Alors oui, je définis plusieurs formulaire, car ils s'affichent sous forme de tabs dans ma vue.
Alors le formulaire qui me pose problème, c'est $formDefineLangues
Je veux pouvoir lui passer un tableau en paramètre comme vous pouvez le constater.
Je l'ai défini en statique pour le moment pour les tests, mais il sera ensuite dynamique.
Le formulaire maintenant :
class Application_Form_DefineLangues extends Zend_Form { protected $_langues; public function __construct(array $langues) { $this->_langues = $langues; $this->setMethod('post'); $element = new Zend_Form_Element_MultiCheckbox('langues', array( 'label' => 'Sélectionner les matières étant des langues', 'multiOptions' => $langues )); $this->addElement($element); /* $this->addElement('multicheckbox', 'langues', array( 'label' => 'Matières étant des langues', 'multiOptions' => ));*/ $submit = new Zend_Form_Element_Submit('submit'); $submit->setLabel('Valider'); $this->addElement($submit); $this->addElement('hash', 'csrf', array( 'ignore' => true, )); } public function init() { /* Form Elements & Other Definitions Here ... */ } public function printArray() { foreach($this->_langues as $key => $value) { echo 'ID : '.$key.' ; Nom : '.$value."</br>"; } } }
J'ai fait une fonction printArray() histoire de vérifier que ma variable était bien renseigné (c'est le cas, il me ressort bien mon tableau :p
et dans ma vue :
<div id="tabs-3"> <?php $this->langues->setAction($this->url()); echo $this->langues; ?> </div>
Les autres formulaire que j'ai dans mon controlleur eux s'affichent sans problèmes à d'autres endroits de la vue, mais celui là ne s'affichent pas.
Par contre, si je fais echo $this->langues->langues; , mon élément multicheckbox apparait bien.
Et là, je sais pas trop quoi faire.
Je sais pas si il faut que je rajoute quelque chose dans la partie init() ou pas, ou j'en sais rien :p
Je suis sur que pour vous c'est pas grand chose, juste une ou deux lignes qui doit manquer, mais j'arrive pas à trouver moi.
Dernière modification par Wiinner (25-05-2010 11:42:59)
Hors ligne
Hello,
C'est parce que tu étends le constructeur. Utilises la méthode init() pour faire ça, c'est son but.
@+
Hors ligne
A mon avis tu as pas chargé les décorateurs de ton formulaire.
Essaie d'appeler parent::__construct() dans ton constructeur...
Initialiser les éléments dans __construct(), je sais pas ce que Zend en dit mais moi je le fais dans la méthode init() et je passe des options uniquement dans le constructeur.
Hors ligne
Ils sont ou tes décorateurs ??
Si tu redéfinis __construct et que tu n'installes pas de décorateur, tu ne verras rien.
Le __construct de Zend_Form install des décorateurs par défaut pour toi.
Je ne vois nullpart d'appel à parent::__construct ou bien $this->loadDefaultDecorators()
EDIT : a priori, on s'est entreTROISé
Dernière modification par nORKy (25-05-2010 11:34:11)
Hors ligne
Merci à tous, çà marche.
par contre, j'ai préféré garder la surcharge du constructeur, car dès que je passe tout çà dans la fonction init, il me fait des erreurs du style :
Catchable fatal error: Argument 1 passed to Zend_Form_Element_Multi::setMultiOptions() must be an array, null given
Pour info, j'avais mis :
class Application_Form_DefineLangues extends Zend_Form { protected $_langues; /* public function __construct(array $langues) { parent::__construct(); $this->_langues = $langues; }*/ public function init(array $langues) { /* Form Elements & Other Definitions Here ... */ $this->setMethod('post'); $element = new Zend_Form_Element_MultiCheckbox('langues', array( 'label' => 'Sélectionner les matières étant des langues', 'multiOptions' => $langues )); $this->addElement($element); /* $this->addElement('multicheckbox', 'langues', array( 'label' => 'Matières étant des langues', 'multiOptions' => ));*/ $submit = new Zend_Form_Element_Submit('submit'); //$submit->setAttrib('onclick', 'parent.tb_remove();parent.go_reload(true)'); $submit->setLabel('Valider'); $this->addElement($submit); $this->addElement('hash', 'csrf', array( 'ignore' => true, )); }
Y a-t-il donc moyen de passer des paramètres à la fonction init ?
Mais bon, sinon, en faisant la surcharge du constructeur çà marche.
Merci pour le coup des décorateurs.
Pour le moment, j'en avais pas encore eu besoin, car je faisais des formulaires basiques, en passant justement directement par init(), et visiblement, il devait faire appel tout seul dans le constructeur par default l'appel au décorateur :p
Je met en résolu mais par contre, je suis toujours preneur pour savoir comment faire en passant directement par init :p Je trouverais çà plus joli en effet
Hors ligne
Bon bah du coup, je me réponds à moi même :p
Alors en fait, il y a des appels qui se font vers des setters de manières automatiques
http://www.zfforums.com/zend-framework- … -4178.html
Voila d'ou j'ai vu çà.
Donc du coup dans mon controlleur je fais :
$formDefineLangues = new Application_Form_DefineLangues(array('langues' => array('1234' => 'Anglais', '5678' => 'Allemand')));
Donc j'ai un tableau avec pour $key : langues.
Donc ca va automatiquement appeler dans mon form le setter setLangues
Dans mon form j'ai donc :
public function setLangues($array) { $this->_langues = $array; } public function init() { /* Form Elements & Other Definitions Here ... */ $this->setMethod('post'); $element = new Zend_Form_Element_MultiCheckbox('langues', array( 'label' => 'Sélectionner les matières étant des langues', 'multiOptions' => $this->_langues )); $this->addElement($element); /* $this->addElement('multicheckbox', 'langues', array( 'label' => 'Matières étant des langues', 'multiOptions' => ));*/ $submit = new Zend_Form_Element_Submit('submit'); //$submit->setAttrib('onclick', 'parent.tb_remove();parent.go_reload(true)'); $submit->setLabel('Valider'); $this->addElement($submit); $this->addElement('hash', 'csrf', array( 'ignore' => true, )); }
Voila :p
Hors ligne
Hello,
C'est exactement la forme préconisée
@+
Hors ligne