У меня есть форма ZF2, где мне пришлось отключать собственные валидаторы по определенной причине.
Затем, добавляя элементы программно в форму, я также добавляю валидаторы.
Одним из элементов является массив Multiselect.
$form->add( array( 'type' => 'Zend\Form\Element\Select', 'options' => array( ( 'label' => 'few items', 'value_options' => Array ( 'one' => 'one', 'two' => 'two', 'three' => 'three', 'four' => 'four', ) ), 'attributes' => array ( 'multiple' => 'multiple', 'value' => array('two','three'), 'required' => 1, 'id' => 'few_items' ), 'name' => 'few_items' ));
Кроме того, я собираюсь добавить средство проверки InArray:
if($f instanceof \Zend\Form\Element\Select){ $inputFilter->add($factory->createInput(array( 'name' => $f->getName(), 'required' => $f->getAttribute('required') == 1, 'validators' => array( array( 'name' => 'InArray', 'options' => array( 'haystack' => $f->getValueOptions(), 'messages' => array( InArray::NOT_IN_ARRAY => 'Please select an option', ), ), ), ), ))); }
Проблема в том, что валидатор всегда терпит неудачу, потому что в поле POST multiselect вернет массив и фактически ищет внутри валидатора InArray, он использует in_array (…) функцию PHP, которая не подходит для этого – array_intersect сделал бы трюк, но перед тем, как написать свой собственный валидатор, у меня есть ощущение, что это колесо уже было изобретено!
Осмотревшись, я вижу, что был поднят баг с этим эффектом ( http://framework.zend.com/issues/browse/ZF2-413 ), и решение заключалось в том, чтобы ввести Explode validator, но я не уверен, как чтобы добавить его в мой фильтр ввода.
Спасибо за ваши предложения.
На самом деле, следуя ссылке bugfix, я понял, как сделать проверку. Explode validator будет разрушать значение и применять валидатор для каждой части:
if($f instanceof \Zend\Form\Element\Select){ $inputFilter->add($factory->createInput(array( 'name' => $f->getName(), 'required' => $f->getAttribute('required') == 1, 'validators' => array( array( 'name' => 'Explode', 'options' => array( 'validator' => new InArray(array( 'haystack' => $f->getValueOptions(), 'valueDelimeter' => null, 'messages' => array( InArray::NOT_IN_ARRAY => 'Please select an option', ), )) ) ), ), ))); }
Оставив этот вопрос здесь, потому что я не нашел других ответов на это сам, и, надеюсь, это поможет людям в будущем.