Как привязать элементы MultiCheckbox к объекту в ZF2?
Я пользуюсь вложенным Zend\Form\Fieldset
с и 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 не удалось преобразовать в int в /var/www/path/to/project/vendor/zendframework/zend-form/src/View/Helper/FormMultiCheckbox.php в строке 202.
Моя интерпретация этого заключается в том, что MultiCheckBox
ожидает массив со значениями в качестве примитивных типов (например, int
). Вместо этого он получает массив с Protocol
объекты и пытается использовать его значения для in_array(...)
- и это не может работать.