Zend Framework 2 - 注释表单 - 绑定不起作用

时间:2012-12-24 09:05:44

标签: php doctrine-orm zend-form zend-framework2

我正在使用AnnotationForms,我在教程中修改了标准编辑操作,以使用注释而非标准表单。

$form->bind()未填写值外,一切正常。表单字段保持空白。

我检查了应该绑定的变量,并且设置好了。

这是我的行动:

    $id = (int)$this->getEvent()->getRouteMatch()->getParam('id');
    if (!$id) {
        return $this->redirect()->toRoute('album', array('action'=>'add'));
    }
    $album = $this->getEntityManager()->find('Album\Entity\Album', $id);

    $builder = new AnnotationBuilder();
    $form    = $builder->createForm(new \Album\Entity\Album());
    $form->add(new \MyVendor\Form\MyFieldset());
    $form->setBindOnValidate(false);
    $form->bind($album);

2 个答案:

答案 0 :(得分:2)

好吧,这很简单!

诀窍是将对象转换为数组并使用setData()而不是绑定。

我找到了解决方案提示here

您仍然需要bind()来保存更改。如果你把它留下来,不会发生错误,但它也不会保存。

 $album = $this->getEntityManager()->find('Album\Entity\Album', $id);
 ...
 $form->bind($album);
 $form->setData($album->getArrayCopy());

答案 1 :(得分:2)

ClassMethods水箱确实可以处理绑定,但表单元素名称需要匹配小写 - 下划线格式(例如:对象属性$moduleDisplayNameClassMethods和{{ 1}} hydrator expect表单元素名称ObjectProperty

默认情况下,module_display_name会生成一个名为Zend\Form\Annotation的表单元素。因此,将对象提取到表单不起作用。

解决方案1:将moduleDisplayName注释添加到属性以使@Name生效。

示例:

ClassMethods

解决方案2:将可选参数/** * @Form\Name("module_display_name") protected $moduleDisplayName 设置为ClassMethods(默认值为underScoreSeperatedKeys)或使用false实例化true水印器。然后ClassMethods::setUnderScoreSeperatedKeys(false)的行为就像任何其他保湿器一样。

ClassMethods水合器仅适用于声明为ObjectProperty的属性。但命名与public相同(即属性ArraySerializable,表单元素名称$moduleDisplayName)。

moduleDisplayName保湿器适用于所有属性。命名与Reflection相同。

结论:ArraySerializable是四个水化器中的一个,它需要不同的表单元素命名方案。不太酷。