Как привязать элементы 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(...) - и это не может работать.

0 ответов

Другие вопросы по тегам