如果验证失败,则带有字段集的ZF2表单集合将保持在旧状态


ZF2 Form Collection with fieldset stays in old state if validation fails

我有一个带有以下集合元素的表单对象:

$languageSkills = new Collection('languageSkills');
$languageSkills->allowAdd();
$languageSkills->allowRemove();
$languageSkills->setLabel('LANGUAGES_SKILLS_QUESTION');
$languageSkills->setCount(0);
$languageSkills->setShouldCreateTemplate(true);
/* @var $fieldset LanguageSkillFieldset */
$fieldset = new LanguageSkillFieldset();
$fieldset->setMasterDataService($masterDataService);
$fieldset->init();
$languageSkills->setTargetElement($fieldset);
$this->add($languageSkills);

字段集本身包含一个隐藏字段和一个选择框。现在,如果我更改字段集中的值或动态添加/删除字段集(使用js),发送表单,但某些内容无效,则集合将显示为旧/以前的状态(没有任何更改)。所有其他元素都具有正确的值。

我做错了什么?

这里的控制器部分:

$form = $this->getSkillForm();
$prg = $this->prg($this->url()->fromRoute('langroute/freelancer/profile/skills/save', array(), array(), true), true);
// check PRG plugin for redirect to send
if ($prg instanceof Response) {
    return $prg;
} elseif ($prg !== false) {
    $flashMessenger = $this->flashMessenger();
    // if none is selected, there is no entry in array
    if (empty($prg['driversLicenses'])) {
        $prg['driversLicenses'] = array();
    }
    if (empty($prg['languageSkills'])) {
        $prg['languageSkills'] = array();
    }
    $form->setData($prg);
    $form->bind($this->getFreelancer());
    try {
        $this->getFreelancerService()->updateFreelancer($form->getValidatedObject());
        return new JsonModel(array('success' => 1));
    } catch (Exception $ex) {
        $flashMessenger->addErrorMessage($ex->getMessage());
    }
}
$model = $this->getSkillsEditViewModel();
$model->setVariable('form', $form);
return $model;

->在getValidatedObject()方法中(我的类AbstractForm扩展了Form):

if(!$this->isValid()) {
    throw new ValidationException($message, $this->getInputFilter());
}
return $this->getObject();

过了一段时间,我找到了这个问题的修复方法。在绑定对象之前,请小心验证表单!在验证之后,在诸如持久化之类的进一步处理之前,将其绑定到。这就是重点,无论如何都要感谢。。。