注:请看杰里米的答案,因为我的答案是基于他的。
谢谢你的回答,杰里米。你的代码有一些问题,所以我想我应该发布我实现的解决方案来解释我的不同之处。
doBind()的重写有一个问题,如果父值没有从验证器返回clean,则会抛出未捕获的sfValidatorError。我把它包在一个try/catch里来抑制它。
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
新步骤
重写updateObjectEmbeddedForms()
updateObjectEmbeddedForms()
删除与未验证的嵌入窗体相关的任何数据。
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);
}
最后,我不喜欢我必须复制和粘贴整个基地
saveEmbeddedForms()
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);
}