Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 08-02-2010 10:02:05

brokenclock
Nouveau membre
Date d'inscription: 08-02-2010
Messages: 1

Difficultés dans la mise en oeuvre d'un formulaire dynamique

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:

Code:

  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

Code:

  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":

Code:

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

 

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