Zend framework2 如何将MultiCheckbox的元素绑定到ZF2中的对象?
我使用的是嵌套的和,它提供了一种非常舒适的方式将复杂的对象结构映射到表单,以便从表单输入中获得完整的对象(准备保存) 我现在要添加到表单中的元素应该表示可能的协议列表。在数据库中,它是一个简单的表,列为Zend framework2 如何将MultiCheckbox的元素绑定到ZF2中的对象?,zend-framework2,zend-form,checkboxlist,zend-form2,zend-form-collection,Zend Framework2,Zend Form,Checkboxlist,Zend Form2,Zend Form Collection,我使用的是嵌套的和,它提供了一种非常舒适的方式将复杂的对象结构映射到表单,以便从表单输入中获得完整的对象(准备保存) 我现在要添加到表单中的元素应该表示可能的协议列表。在数据库中,它是一个简单的表,列为id和name,对象的结构可以描述为endpointhas Protocol[]。我定义了一个MultiCheckbox(见下文),但我不知道如何将此元素绑定到协议原型。对于字段集,它通过以下方式工作 如何获取Zend\form从复选框创建对象的表单处理机制? 到目前为止的代码: Endpoin
id
和name
,对象的结构可以描述为endpointhas Protocol[]
。我定义了一个MultiCheckbox
(见下文),但我不知道如何将此元素绑定到协议
原型。对于字段集
,它通过以下方式工作
如何获取Zend\form
从复选框创建对象的表单处理机制?
到目前为止的代码:
EndpointFieldset.php
// namespace ...;
// use ....;
class EndpointFieldset extends Fieldset
{
// ...
public function init()
{
parent::init();
$this->add(
[
'type' => 'multi_checkbox',
'name' => 'protocols',
'options' => [
'label' => _('protocols'),
'label_attributes' => [
'class' => 'col-md-1 protocol-field'
],
'value_options' => $this->getValueOptions(),
'selected' => static::PROTOCOLS_DUMMY_VALUE
]
]
);
}
// ...
protected function getValueOptions()
{
$valueOptions = [];
foreach (Protocol::PROTOCOLS as $key => $value) {
$valueOptions[] = [
'value' => $key,
'label' => $value
];
}
return $valueOptions;
}
}
use Zend\Form\View\Helper\FormMultiCheckbox;
echo $this->formMultiCheckbox($myFieldset->get('protocols'), FormMultiCheckbox::LABEL_PREPEND);
myform.phml
// namespace ...;
// use ....;
class EndpointFieldset extends Fieldset
{
// ...
public function init()
{
parent::init();
$this->add(
[
'type' => 'multi_checkbox',
'name' => 'protocols',
'options' => [
'label' => _('protocols'),
'label_attributes' => [
'class' => 'col-md-1 protocol-field'
],
'value_options' => $this->getValueOptions(),
'selected' => static::PROTOCOLS_DUMMY_VALUE
]
]
);
}
// ...
protected function getValueOptions()
{
$valueOptions = [];
foreach (Protocol::PROTOCOLS as $key => $value) {
$valueOptions[] = [
'value' => $key,
'label' => $value
];
}
return $valueOptions;
}
}
use Zend\Form\View\Helper\FormMultiCheckbox;
echo $this->formMultiCheckbox($myFieldset->get('protocols'), FormMultiCheckbox::LABEL_PREPEND);
更新 我找到了一个保存新条目的解决方法:我只需手动完成表单提供的对象,并从
MultiCheckBox
值中创建Protocol
对象。但是,当我将complete对象传递到更新表单时(为了编辑现有条目),我会收到一个通知,并且不会生成复选框:
注意:在第202行的/var/www/path/to/project/vendor/zendframework/zend form/src/View/Helper/FormMultiCheckbox.php中,类My\DataObject\Protocol的对象无法转换为int
我对此的解释是,
MultiCheckBox
需要一个以值为基本类型的数组(例如int
)。相反,它会获取一个包含协议
对象的数组,并尝试在_array(…)中为使用其值,但这无法工作 我在ZF3的Doctrine2中看到了同样的错误。通过单步遍历所有内容,操作员将MultiCheckbox(而不是value_选项)上的“value”属性设置为my实体数组。不确定我做错了什么,但我知道有些人建议不要使用bind,而只是在控制器中手动执行对象和/或表单的水合作用。也许是因为这是一件很痛苦的事情。