ZF2 Как проверить поля внутри набора полей?

У меня есть поле в такой форме:

    $this -> add(array(
        'type' => 'field-set',
        'name' => 'meta_properties',
        'options' => array(
            'label' => "Meta Properties",
        ),
        'elements' => array(

        )
    ));

    $meta_fieldSet = $this -> get('meta_properties');

    $meta_fieldSet->add(array(
        'name' => 'meta_title',
        'attributes' => array(
            'type'  => 'text',
        ),
        'options' => array(
            'label' => 'Title',
        ),
    ));   

    $meta_fieldSet->add(array(
        'name' => 'meta_description',
        'attributes' => array(
            'type'  => 'text',
        ),
        'options' => array(
            'label' => 'Description',
        ),
    ));

    $meta_fieldSet->add(array(
        'name' => 'meta_keywords',
        'attributes' => array(
            'type'  => 'text',
        ),
        'options' => array(
            'label' => 'Keywords',
        )
    ));

И в моем классе входного фильтра у меня есть

     $inputFilter -> add($factory -> createInput(array(
            'name' => 'meta_title',
            'required' => false,
            'filters' => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name' => 'StringLength',
                    'options' => array(
                        'encoding' => 'UTF-8',
                        'min' => 5,
                        'max' => 150,
                    ),
                ),
            ),
        )));

        $inputFilter -> add($factory -> createInput(array(
            'name' => 'meta_description',
            'required' => false,
            'filters' => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name' => 'StringLength',
                    'options' => array(
                        'encoding' => 'UTF-8',
                        'min' => 5,
                        'max' => 150,
                    ),
                ),
            ),
        )));

        $inputFilter -> add($factory -> createInput(array(
            'name' => 'meta_keywords',
            'required' => false,
            'filters' => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name' => 'StringLength',
                    'options' => array(
                        'encoding' => 'UTF-8',
                        'min' => 5,
                        'max' => 150,
                    ),
                ),
            ),
        )));

Это не проверка. Как проверить InputFilter?


person mrN    schedule 01.05.2014    source источник


Ответы (1)


При создании наборов полей вам необходимо расширить \Zend\Form\Fieldset. Попробуйте создать набор полей следующим образом:

<?php
/**
 * Fieldset Example
 */
namespace Module\Form;

use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\Stdlib\Hydrator\ClassMethods as ClassMethodsHydrator;

class NewFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct()
    {
        // we want to ignore the name passed and give it our own
        parent::__construct('appointment');

        // Use the model you are associating with your fieldset here
        $this->setHydrator(new ClassMethodsHydrator(false))
             ->setObject(new MyModel)
             ->setLabel('My Model');

        $this->add(array(
            'name' => 'fieldset_item_1',
            'type' => 'Select',
            'options' => array(
                'label' => 'FieldSet Item 1',
            )
        ));

        $this->add(array(
            'name' => 'fieldset_item_2',
            'type' => 'Select',
            'options' => array(
                'label' => 'FieldSet Item 2',
            )
        ));
    }

    /**
     * Sets up the input filter specification and returns it
     */
    public function getInputFilterSpecification()
    {
        return array(
            'fieldset_item_1' => array(
                'required' => false,
                'filters'  => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name'    => 'StringLength',
                        'options' => array(
                            'encoding' => 'UTF-8',
                            'min'      => 1,
                            'max'      => 100,
                        ),
                    ),
                ),
            ),
            'fieldset_item_2' => array(
                'required' => false,
                'filters'  => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name'    => 'StringLength',
                        'options' => array(
                            'encoding' => 'UTF-8',
                            'min'      => 1,
                            'max'      => 100,
                        ),
                    ),
                ),
            ),
        );
    }
}

Затем вы можете использовать его в своей форме следующим образом:

$this->add(array(
    'type' => 'Zend\Form\Element\Collection',
    'name' => 'fieldset',
    'options' => array(
        'label' => '',
        'count' => 1,
        'should_create_template' => true,
        'allow_add' => true,
        'use_as_base_fieldset' => false,
        'create_new_objects' => true,
        'target_element' => array('type' => 'Module\Form\NewFieldset')
    ),
));

Теперь, когда вы выполняете $form->isValid() в контроллере, он проверяет набор полей. Кроме того, теперь вы можете написать какой-нибудь причудливый интерфейсный код для динамического добавления и удаления наборов полей из формы, и все они будут проверены.

person Curtis Kelsey    schedule 02.05.2014