可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am making an application using Zend Framework 2. I am validating input using it's InputFilter. Is it possible, to make some Inputs required conditionally? I mean I have code like that:
$filter = new \Zend\InputFilter\InputFilter(); $factory = new \Zend\InputFilter\Factory(); $filter->add($factory->createInput(array( 'name' => 'type', 'required' => true ))); $filter->add($factory->createInput(array( 'name' => 'smth', 'required' => true )));
I want the field something, to be required, ONLY when type is equal 1. Is there a built-in way to do that? Or should I just create custom validator?
回答1:
First of all, you may want to enable validation on empty/null values as of Empty values passed to Zend framework 2 validators
You can use a callback input filter as in following example:
$filter = new \Zend\InputFilter\InputFilter(); $type = new \Zend\InputFilter\Input('type'); $smth = new \Zend\InputFilter\Input('smth'); $smth ->getValidatorChain() ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) ->attach(new \Zend\Validator\Callback(function ($value) use ($type) { return $value || (1 != $type->getValue()); })); $filter->add($type); $filter->add($smth);
This will basically work when the value smth is an empty string and the value for type is not 1. If the value for type is 1, then smth has to be different from an empty string.
回答2:
I couldn't quite get the example by Ocramius to work, as $type->getValue was always NULL. I changed the code slightly to use $context and this did the trick for me:
$filter = new \Zend\InputFilter\InputFilter(); $type = new \Zend\InputFilter\Input('type'); $smth = new \Zend\InputFilter\Input('smth'); $smth ->getValidatorChain() ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) ->attach(new \Zend\Validator\Callback(function ($value, $context){ return $value || (1 != $context['type']); })); $filter->add($type); $filter->add($smth);
回答3:
Unfortunately you'd have to set the required option based on your conditions like so:
$filter->add($factory->createInput(array( 'name' => 'smth', 'required' => (isset($_POST['type']) && $_POST['type'] == '1'), )));