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,而只是在控制器中手动执行对象和/或表单的水合作用。也许是因为这是一件很痛苦的事情。