Как установить фильтры и валидаторы в полях ZF2 с помощью Zend \ Form \ Factory?

Я использую Zend \ Form \ Factory для создания форм в zend framework2

$factory = new Zend\Form\Factory(); $factory->createForm(array( 'elements' => array( array( 'spec' => array( 'name' => 'name', ), ), ), 'input_filter' => array( 'name' => array( 'validators' => array( // validators for field "name" ), 'filters' => array( // filters for field "name" ), ), ), )); 

Вы можете видеть, что есть фильтры и валидаторы для поля «имя». Оно работает. У меня проблема, если я использую поля:

 $factory->createForm(array( 'fieldsets' => array( array( 'spec' => array( 'name' => 'common', 'elements' => array( array( 'spec' => array( 'name' => 'name', ), ), ), ), ), ), 'input_filter' => array( 'name' => array( 'validators' => array( // validators for field "name" ), 'filters' => array( // filters for field "name" ), ), ), )); 

В этом примере входной фильтр не работает. Я не знаю, как установить фильтры и валидаторы в поле «имя» в поле «общий»,

Этот пример тоже не работает:

 $factory->createForm(array( 'fieldsets' => array( array( 'spec' => array( 'name' => 'common', 'elements' => array( array( 'spec' => array( 'name' => 'name', ), ), ), 'input_filter' => array( 'name' => array( 'validators' => array( // validators for field "name" ), 'filters' => array( // filters for field "name" ), ), ), ), ), ), )); 

Solutions Collecting From Web of "Как установить фильтры и валидаторы в полях ZF2 с помощью Zend \ Form \ Factory?"

Вам нужно указать «тип» в входном фильтре, когда вы использовали набор полей.

 $factory = new \Zend\Form\Factory(); $form = $factory->createForm(array( 'hydrator' => 'Zend\Stdlib\Hydrator\ArraySerializable', 'elements' => array( array( 'spec' => array( 'name' => 'email1', ), ), ), 'fieldsets' => array( array( 'spec' => array( 'name' => 'common', 'elements' => array( array( 'spec' => array( 'name' => 'email2', ), ), ), ), ), ), 'input_filter' => array( 'email1' => array( 'validators' => array( // validators for field "name" new \Zend\Validator\EmailAddress(), ), 'filters' => array( // filters for field "name" array('name' => 'Zend\Filter\StringTrim'), ), ), 'common' => array( 'email2' => array( 'validators' => array( // validators for field "name" new \Zend\Validator\EmailAddress(), ), 'filters' => array( // filters for field "name" array('name' => 'Zend\Filter\StringTrim'), ), ), 'type' => 'Zend\InputFilter\InputFilter', ) ), )); $form->setData(array('email1'=>'test@gmail.com','common'=>array('email2'=>'invalid-email'))); if(!$form->isValid()){ print_r($form->getMessages()); } 

Если вы хотите добавить динамические валидаторы в Action (например, валидаторы, которые требуются только тогда, когда некоторые другие поля имеют определенное значение), это довольно загадка для применения этого при использовании коллекции форм.

Чтобы достичь этого, вы должны захватить цепочку валидатора из определенного элемента. Однако для каждого набора полей вы должны сначала подключить его собственный входной фильтр. Я хотел бы поделиться этим, потому что это заняло у меня 2 часа, чтобы понять;)

Допустим, у вас есть базовая форма, базовая форма имеет набор полей, а набор полей имеет x-элементы. Код для добавления валидатора к одному из x-элементов требует следующей цепочки:

 $form->getInputFilter() ->get('base-form') ->get('fieldset-form') ->getInputFilter() ->get('element') ->getValidatorChain() ->addValidator($validator); 

2 getInputFilter() может дать вам головную боль.

У вас неправильный синтаксис, являются обычным явлением, а spec должен быть вложенными полями или чем-то еще? Не уверен, что вы там делаете … Попробуйте удалить часть спецификации

 $factory = new Factory(); $form = $factory->createForm(array( 'fieldsets' => array( array( 'name' => 'details', /** * Elements for the "details" form */ 'elements' => array( array( 'name' => 'name', 'type' => 'Text', 'options' => array( 'label' => 'Full name', ), ), array( 'type' => 'Zend\Form\Element\Email', 'name' => 'email', 'options' => array( 'label' => 'Email address', ), ), ), ), array( 'name' => 'extra', 'elements' => array( array( 'name' => 'address', 'type' => 'Text', 'options' => array( 'label' => 'Address', ), ), array( 'name' => 'notes', 'type' => 'Zend\Form\Element\Textarea', 'options' => array( 'label' => 'Notes', ), ), ), ), ), /** * Elements on the form itself, not in the fieldsset */ 'elements' => array( array( 'type' => 'Zend\Form\Element\Captcha', 'name' => 'captcha', 'options' => array( 'captcha' => array( 'class' => 'Dumb', ), ), ), array( 'type' => 'Zend\Form\Element\Csrf', 'name' => 'security', ), array( 'name' => 'send', 'type' => 'Submit', 'attributes' => array( 'value' => 'Submit', ), ), ), /*/ * Input Filters Spec here */ 'input_filter' => array( 'name' => array( 'validators' => array( // validators for field "name" ), 'filters' => array( // filters for field "name" ), ), ), ));