Note: S'il vous plaît voir la réponse de jeremy que la mienne est basée sur le sien.
Merci pour votre réponse jeremy. Votre code comportait quelques problèmes et j'ai donc décidé de poster ma solution implémentée en expliquant ce que je faisais différemment.
1. Remplacer doBind()
La substitution de doBind() a eu un problème où une sfValidatorError uncaught serait levée si la valeur mère ne revenait pas propre du validateur. Je l'ai enveloppé dans un essai/attraper pour supprimer ceci. Je l'ai également modifié pour travailler avec plusieurs formes incorporées, pas seulement les deux que j'ai spécifiées.
protected $selectedTemplate;
public function getTemplateToEmbeddedFormKeyMap()
{
// An array of template values to embedded forms
return array(
'template1' => 'templateform1',
'template2' => 'templateform2',
'template3' => 'templateform3',
'templateN' => 'templateformN'
);
}
protected function doBind(array $values)
{
// Clean the "template" value
try
{
$this->selectedTemplate = $this->validatorSchema['template']->clean(array_key_exists('template', $values) ? $values['template'] : NULL);
}
catch(sfValidatorError $e) {}
// For each template embedded form
foreach($this->getTemplateToEmbeddedFormKeyMap() as $template => $form_key)
{
// If there is no selected template or the embedded form is not for the selected template
if ($this->selectedTemplate == NULL || $this->selectedTemplate != $template)
{
// Don't validate it
$this->validatorSchema[$form_key] = new sfValidatorPass();
}
}
// Parent
parent::doBind($values);
}
2. NOUVEAU PAS Remplacer updateObjectEmbeddedForms()
Parce que j'ai validation désactivé sur une partie ou l'ensemble de mes formes embarquées, nous avons maintenant des données non nettoyés dans le tableau de valeurs de $. Je ne souhaite pas que ces données soient transmises à mes objets de modèle dans les formulaires incorporés. J'ai donc remplacé updateObjectEmbeddedForms()
pour supprimer toutes les données relatives à un formulaire incorporé qui n'est pas validé.
public function updateObjectEmbeddedForms($values, $forms = null)
{
// For each template embedded form
foreach($this->getTemplateToEmbeddedFormKeyMap() as $template => $form_key)
{
// If there is no selected template or the embedded form is not for the selected template
if ($this->selectedTemplate == NULL || $this->selectedTemplate != $template)
{
// Remove the data
unset($values[$form_key]);
}
}
// Parent
parent::updateObjectEmbeddedForms($values, $forms);
}
3. Remplacer saveEmbeddedForms()
Et enfin, je ne suis pas que je devais copier et coller l'ensemble de la méthode de base saveEmbeddedForms()
puis le modifier, donc je refactorisé pour enlever la Je ne veux pas sauvegarder les formes incorporées avant de les transmettre au parent.
public function saveEmbeddedForms($con = null, $forms = null)
{
// Get the embedded forms
if ($forms === NULL)
{
$forms = $this->getEmbeddedForms();
}
// For each template embedded form
foreach($this->getTemplateToEmbeddedFormKeyMap() as $template => $form_key)
{
// If there is no selected template or the embedded form is not for the selected template
if ($this->selectedTemplate == NULL || $this->selectedTemplate != $template)
{
// Remove the form so it isn't saved
unset($forms[$form_key]);
}
}
// Parent
parent::saveEmbeddedForms($con, $forms);
}
Merci encore pour la réponse jeremy, cela m'a permis d'obtenir ce qui fonctionne pour mon cas d'utilisation.
Merci pour votre réponse. J'ai trouvé quelques problèmes et je l'ai prolongé un peu, mais c'était une base solide pour ce que je voulais faire. J'ai posté ma solution si vous voulez faire un commentaire. Bravo encore! –
J'ai nettoyé mon. Vous avez raison de vouloir ignorer updateObjectEmbeddedForms. –