在Fieldset
我有一个Element\Radio
foo
和Element\Text
bar
。
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
的所选选项?
答案 0 :(得分:0)
所选选项与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
当它是不,标记输入无效。