Подтвердить что ты не робот

Как установить фильтры и валидаторы в полях 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"
            ),
        ),
    ),
));

Вы можете видеть, что есть фильтры и валидаторы для поля "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"
                        ),
                    ),
                ), 
            ),
        ),
    ),       
));
4b9b3361

Ответ 1

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

$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'=>'[email protected]','common'=>array('email2'=>'invalid-email')));
if(!$form->isValid()){
    print_r($form->getMessages());
}

Ответ 2

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

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

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

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

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

Ответ 3

У вас неправильный синтаксис, являются обычным явлением, а 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"
        ),
    ),
),
));