我正在使用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);
答案 0 :(得分:2)
好吧,这很简单!
诀窍是将对象转换为数组并使用setData()
而不是绑定。
我找到了解决方案提示here。
您仍然需要bind()
来保存更改。如果你把它留下来,不会发生错误,但它也不会保存。
$album = $this->getEntityManager()->find('Album\Entity\Album', $id);
...
$form->bind($album);
$form->setData($album->getArrayCopy());
答案 1 :(得分:2)
ClassMethods
水箱确实可以处理绑定,但表单元素名称需要匹配小写 - 下划线格式(例如:对象属性$moduleDisplayName
,ClassMethods
和{{ 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
是四个水化器中的一个,它需要不同的表单元素命名方案。不太酷。