我正在使用嵌套Zend\Form\Fieldset
的 s 和Zend\Form\Collection
s,它们提供了一种非常舒适的方式来将复杂的对象结构映射到表单,以便从表单输入中获取完整的对象(准备保存)。
我现在要添加到表单中的元素应该代表可能的协议列表。在数据库中,它是一个带有列的简单表,id
对象name
的结构可以描述为Endpoint has Protocol[]
。我定义了一个MultiCheckbox
(如下),但我不知道如何将此元素绑定到Protocol
原型。对于Fieldset
它通过Fieldset\setObject(...)
.
如何获取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;
}
}
myform.phml
use Zend\Form\View\Helper\FormMultiCheckbox;
echo $this->formMultiCheckbox($myFieldset->get('protocols'), FormMultiCheckbox::LABEL_PREPEND);
更新
我找到了保存新条目的解决方法:我只需手动完成表单提供的对象并根据值创建Protocol
对象。MultiCheckBox
但是,当我将完整对象传递给更新表单(以编辑现有条目)时,我会收到一条通知,并且不会构建复选框:
注意:类 My\DataObject\Protocol 的对象无法在第 202 行的 /var/www/path/to/project/vendor/zendframework/zend-form/src/View/Helper/FormMultiCheckbox.php 中转换为 int
我对此的解释是,MultiCheckBox
期望值作为原始类型(例如int
)的数组。相反,它会获取一个包含对象的数组Protocol
并尝试将其值用于in_array(...)
-- 但这是行不通的。