Примечание: Пожалуйста, смотрите ответ Джереми, так как мой основан на его.
Спасибо за ваш ответ, Джереми.В вашем коде было несколько проблем, поэтому я решил опубликовать свое реализованное решение, объясняющее, что я сделал по-другому.
1.Переопределение doBind ()
При переопределении doBind () возникла проблема, из-за которой было бы выброшено неперехваченное sfValidatorError, если родительское значение не возвращало clean из средства проверки.Я обернул его в 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. NEW STEP Переопределить updateObjectEmbeddedForms ()
Поскольку я отключил проверку некоторых или всех моих встроенных форм, у нас теперь есть некоторые неочищенные данные в массиве $ values.Я не хочу, чтобы эти данные передавались объектам моей модели во встроенных формах, поэтому я переопределил 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);
}
3.Переопределить saveEmbeddedForms ()
И, наконец, мне не понравилось, что мне пришлось скопировать и вставить весь базовый метод 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);
}
Еще раз спасибо за ответ, Джереми, я понял, что это работает для моего варианта использования.