Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set filters and validators in ZF2 fieldsets using Zend\Form\Factory?

I use Zend\Form\Factory to create forms in 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"
            ),
        ),
    ),
));

You can see that there are filters and validators for field "name". It works. I have the problem if I use fieldsets:

$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"
            ),
        ),
    ), 
));

In this example input filter doesn`t work. I don't know how to set filters and validators to field "name" in fieldset "common"

This example does not work too:

$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"
                        ),
                    ),
                ), 
            ),
        ),
    ),       
));
like image 309
Ildar Avatar asked Apr 26 '13 22:04

Ildar


2 Answers

You need to specify 'type' key in input filter when you used fieldset.

$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());
}
like image 83
Malkesh Avatar answered Nov 15 '22 09:11

Malkesh


If you want to add dynamic validators in the Action (for example validators that are required only when some other fields have a specific value), it is quite a puzzle to apply this when using form collection.

In order to achieve this you should grab the validator chain from the specific element. For each fieldset however, you should first hook in it's own input filter. I would like to share this, because this took me 2 hours to understand ;)

Let's say you have a base form, the base form has a fieldset, and the fieldset has x-elements. The code to add a validator to one of the x-elements requires following chain:

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

The 2 getInputFilter() can give you an headache.

like image 2
Nykac Avatar answered Nov 15 '22 07:11

Nykac