0

在一个Fieldset我有一个Element\Radio fooElement\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

4

1 回答 1

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当它不是时,将输入标记为无效。

于 2016-11-10T12:38:26.643 回答