Как получить выбранную опцию элемента кнопки радиона в Zend Framework 2?

В Fieldset у меня есть Element\Radiofoo а также Element\Textbar,

public function init()
{
    $this->add(
        [
            'type' => 'radio',
            'name' => 'foo',
            'options' => [
                'label' => _('foo'),
                'value_options' => [
                    [
                        'value' => 'a',
                        'label' => 'a',
                        'selected' => true
                    ],
                    [
                        'value' => 'b',
                        'label' => 'b'
                    ]
                ]
            ]
            ...
        ]);

    $this->add(
        [
            'name' => 'bar',
            'type' => 'text',
            'options' => [
                'label' => 'bar',
                ...
            ],
            ...
        ]);
}

Проверка поля bar в зависимости от выбранного foo вариант. Это легко реализовать, если я могу получить выбранное значение foo:

public function getInputFilterSpecification()
{
    return [
        'bar' => [
            'required' => $this->get('foo')->getCheckedValue() === 'a',
            ...
        ],
    ];
}

Но нет никакого метода Radio#getCheckedValue(), Ну, я могу перебрать $this->get('foo')->getOptions()['value_options'], но разве это единственный путь?

Как получить (в Fieldset#getInputFilterSpecification()) выбранный вариант Zend\Form\Element\Radio?

1 ответ

Выбранная опция отправляется на сервер вместе со всем остальным из HTML-формы, и все это доступно в валидаторах через $context массив. Вы можете создать условно обязательное поле с помощью средства проверки обратного вызова и $context массив, как это:

public function getInputFilterSpecification() {
    return [
        'bar' => [
            'required' => false,
            'allow_empty' => true,
            'continue_if_empty' => true,
            'required' => true,
            'validators' => [
                [
                    'name' => 'Callback',
                    'options' => [
                        'callback' => function ($value, $context) {
                            return $context['foo'] === 'a'
                        },
                        'messages' => [
                            \Zend\Validator\Callback::INVALID_VALUE => 'This value is required when selecting "a".'
                        ]
                    ]
                ]
            ]
        ],
    ];
}

Это проверило бы, равняется ли 'foo' 'a', то есть выбрана ли опция 'a', и возвращает true когда это так, что помечает ввод как действительный, и false когда это не так, помечая ввод как недействительный.

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