Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
Voilà, j'ai un problème un peu coton, et je ne sais pas trop pourquoi les choses ne vont pas comme je le voudrais.
J'ai créé un formulaire dans lequel je veux que certains champs puissent être répéter lorsque l'utilisateur clique sur un bouton. Il s'agit d'un formulaire de cv, et, par exemple, je veux que l'utilisateur puisse ajouter autant de langues qu'il le souhaite, en cliquant sur le bouton "Ajouter une langue". J'ai déjà pas mal avancé, vu qu'au niveau de l'interface, tout fonctionne comme prévu, le javascript est opérationnel, pas de problème, je reçois bien dans le $_POST les données que je veux.
J'utilise alors ce $_POST à la reception pour régénérer les éléments voulus lors du réaffichage du fomulaire, et je retrouve bien les éléments que je souhaite, sauf que ceux qui peuvent être ajouter ne sont pas rempli. Ce qui m'amène à penser que la fonction isValid ne leur attache pas les valeurs soumises... ce qui posent ensuite tout un tas de problème...
Voici les quelques bouts de codes incriminés:
1. la méthode (du modèle Cv) qui génère le formulaire proprement dit:
public function getEditForm($val2display = null,$val2exclude = null,$valSubmitted = null) { $form = parent::getEditForm($val2display,$val2exclude); $elements[] = $form ->createElement('text','exp') ->setLabel('Expérience'); $languages = new Cwl_Form_AppendableElement($form,'lang'); $languages->elem = $form->createElement('text','language') ->setLabel('Langue') ->setBelongsTo('lang'); $languages->append($valSubmitted['lang']); $languages->appendAddButton(); $elements = array_merge($elements,$languages->elems); foreach ($elements as $element) { $form->addElement($element); } return $form; }
2.le code dans le contrôleur qui appelle le formulaire
function createAction() { $form = Cv::getEditForm(null,array('comment','parent'),$_POST); $this->view->form = $form; $form->addValidateButton(); if ($this->_request->isPost()) { if ($form->isValid($_POST)) { } } }
3.la classe Cwl_Form_AppendableElement utilisée pour gérer les éléments "augmentables":
class Cwl_Form_AppendableElement { public $form; public $array; public $elems = array(); public function Cwl_Form_AppendableElement($form,$array) { $this->form = $form; $this->array = $array; return $this; } public function append($numberOrValSubmitted = 1) { if (is_null($numberOrValSubmitted)) $numberOrValSubmitted = 1; if (is_int($numberOrValSubmitted)) { for ($i=0;$i<=$number;$i++) { $elem = clone $this->elem; $this->currentElemId++; $elem->setLabel($elem->getLabel().' '.$this->currentElemId); $elem->setName($elem->getName().$this->currentElemId); $this->elems[] = $elem; } } if (is_array($numberOrValSubmitted)) { foreach ($numberOrValSubmitted as $key => $val) { $elem = clone $this->elem; $this->currentElemId++; $elem->setLabel($elem->getLabel().' '.$this->currentElemId); $elem->setName($key); $this->elems[] = $elem; } } return $this; } public function appendAddButton($label = null) { $button = $this->form->createElement('button','AddButton'); $button->setLabel('Ajouter')->setBelongsTo($this->array); $receiverId = $this->array.'receiverid'; $button->addDecorator('HtmlTag',array('tag' => 'div','id'=>$receiverId,'placement'=>'prepend')); $elem = clone $this->elem; $elem->setName($elem->getName()."cwlcnt"); $elem->setLabel($elem->getLabel()." cwlcnt"); $html = $elem->__toString(); $html = str_replace('"','"+String.fromCharCode(34)+"',$html); $html = str_replace(CHR(13),"",$html); $html = str_replace(CHR(10),"",$html); $button->setAttrib('onclick','if (document.'.$this->array.'Count){document.'.$this->array.'Count++;}else{document.'.$this->array.'Count='.(count($this->elems)+1).';};t="'.$html.'";while (t.match("cwlcnt")) {t=t.replace("cwlcnt",document.'.$this->array.'Count);};r=document.getElementById("'.$receiverId.'");r.innerHTML = r.innerHTML+t;'); $this->elems[] = $button; } }
L'idée générale est de copier le code html d'un élément de formulaire dans une fonction javascript qui va le reproduire, en incrémentant ce que va bien, lorsqu'elle est appelée par un clic sur le bouton, pour respecter le code qu'aurait produit Zend ; puis, lorsque le formulaire est soumis, d'analyser les données envoyées pour déterminer quels éléments ont été ajoutés par l'utilisateur et le reproduire en éléments de formulaire Zend.
Quelqu'un peut m'aider à résoudre cet épineux problème?
Amicalement,
Stéphane Mourey
Hors ligne