1 pièce(s) jointe(s)
Formulaire et EmbedForm a plusieurs niveaux et ajax.
Bonjour,
Alors j'espère que quelqu'un aura une réponse a m'apporter sur un formulaire assez complexe que je dois mettre en oeuvre...
Bon pour résumer et comprendre ma situation :
Je dois mettre en oeuvre un formulaire d'inscription assez complexe... (désolé pas possible de le changer, on me le demande ainsi... :cry:)
Donc quand j'entre une compagnie, la personne peux rajouter des bureaux, et dans chaque bureau, la personne peux rajouter divers informations (url, contact...etc...).
Niveau formulaire j'ai cela :
compagnie -> [array embed] bureaux -> [array embed] urls|contacts|...
A la validation, j'ai bien mes bureaux (même ceux rajouté a la volé avec mon overload de la méthode bind et un add des forms a la volé en fonction des values). Parcontre pour chaque bureau, je n'ai plus mes champs rajouté a la volé....
Voici les différents portions de codes:
!! CompagnieForm.class.php
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
public function addBureau($num) {
$b = new CompagnieBureau();
$b->setCompagnie($this->getObject());
$bf = new CompagnieBureauForm($b);
$this->embeddedForms['bureaux']->embedForm($num, $bf);
$this->embedForm('bureaux', $this->embeddedForms['bureaux']);
}
public function bind(array $values = null, array $files = null) {
foreach ($values['bureaux'] as $k=>$b) {
if (!isset($this['bureaux'][$k])) {
$this->addBureau($k);
}
// ici je force le binding dans chaque sous formulaire pour générer les sous champs a la volé
$this->embeddedForms['bureaux']->embeddedForms[$k]->bind($values['bureaux'][$k]);
}
return parent::bind($values, $files);
} |
// Dans CompagnieBureauxForm.class.php
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
// Methode permettant de rajouter un form (embed) de manière générique...
public function addForm($modelName, $n) {
$classname = 'CompagnieBureau'.ucfirst($modelName);
$formname = $classname.'Form';
$o = new $classname();
$o->setCompagnieBureau($this->getObject());
$m = 'get'.ucfirst($modelName).'s';
$objs = $this->getObject()->$m();
$objs->add($o);
$m = 'set'.ucfirst($modelName).'s';
$this->getObject()->$m($objs);
$of = new $formname($o);
$this->embeddedForms[$modelName.'s']->embedForm($n, $of);
$this->embedForm($modelName.'s', $this->embeddedForms[$modelName.'s']);
}
// Methode permettant de rajouter un form a la volé (ça passe pas...)
protected function bindForm($modelName, array $values = null, array $files = null) {
foreach ($values[$modelName.'s'] as $k=>$o) {
if (!isset($this[$modelName.'s'][$k])){
$this->addForm($modelName, $k);
}
}
}
public function bind(array $values = null, array $files = null) {
$this->bindForm('url', $values, $files);
$this->bindForm('contact', $values, $files);
$this->bindForm('telephone', $values, $files);
$this->bindForm('fondateur', $values, $files);
$this->bindForm('dirigeant', $values, $files);
foreach ($this->embeddedForms as $name=>$form) {
if (isset($values[$name]))
$this->embeddedForms[$name]->bind($values[$name]);
}
$output = parent::bind($values, $files);
return $output;
} |
Donc mes binds sont bien passé dans les sous formulaires et les sous-sous formulaires... Parcontre lors du render je n'ai qu'un champs... Les autres (meme si le bind et que le rajout a été effectué) ne sont pas du tout là!. De plus ça me génére une erreur, mais aucun output (pourtant en environnement de dev avec tout qui est actif...).
PS: le binding générique et la génération a la volé des forms marchent aux embedForm de 1er niveau, parcontre ça coince a plus bas...
Bref, ça fais 3 jours que je suis dessus, mais impossible de savoir... Quelqu'un aurait une idée?