验证 Zend\Form\Element\Collection

Posted

技术标签:

【中文标题】验证 Zend\\Form\\Element\\Collection【英文标题】:Validating Zend\Form\Element\Collection验证 Zend\Form\Element\Collection 【发布时间】:2014-01-09 12:58:16 【问题描述】:

我有一个使用 Zend\Form\Element\Collection 动态添加“行”的表单。这工作正常,但我正在努力为这些行添加验证。

到目前为止,我的代码如下所示。我想我需要向 InputFilter\InputFilter::add() 传递一些东西,但我不知道是什么:

<?php

class EditForm extends \Zend\Form\Form

    public function __construct()
    
        parent::__construct('edit');
        $this->setUpFormElements();
        $this->setupInputFilters();
    

    protected function setUpFormElements()
    
        $fieldset = new \Zend\Form\Fieldset;

        $nameElement = new \Zend\Form\Element\Text('name');
        $fieldset->add($nameElement);

        $descriptionElement = new \Zend\Form\Element\Text('description');
        $fieldset->add($description);

        $this->add(
            array(
                'type' => 'Zend\Form\Element\Collection',
                'name' => 'rows',
                'options' => array(
                    'label' => 'Edit Rows',
                    'should_create_template' => true,
                    'allow_add' => true,
                    'target_element' => $fieldset,
                )
            )
        );

        return $this;
    

    public function setupInputFilters()
    
        $filter = new \Zend\InputFilter\InputFilter();

        $filter->add(
            array(
                'name' => 'rows',
                'required' => true,
                'validators' => array(
                    // Not sure what to do here!
                )
            )
        );

        return $this;
    

【问题讨论】:

【参考方案1】:

我认为您需要将输入过滤器添加到您要动态添加的字段集的 getInputFilterSpecification 方法中

class Row extends Fieldset implements InputFilterProviderInterface


        $this->add(array(
            'name' => 'yourFieldset',
            'options' => array(
                'label' => 'One of your fieldset elements'
            ),
            'attributes' => array(
                'required' => 'required'
            )
        ));


        $this->add(array(
            'name' => 'fields',
            'options' => array(
                'label' => 'Another fieldset element'
            ),
            'attributes' => array(
                'required' => 'required'
            )
        ));

        public function getInputFilterSpecification()
        
            return array(
                'yourFieldset' => array(
                    'required' => true,
                  ),
                'fields' => array(
                    'required' => true,
                    'validators' => array(
                         array(
                            'name' => 'Float'
                         )
                    )
                )
            );
            

那么你需要在你的表单中设置验证组

class EditForm extends Form

    public function __construct()
    
        $this->add(
         array(
             'type' => 'Zend\Form\Element\Collection',
             'name' => 'rows',
             'options' => array(
                 'label' => 'Edit Rows',
                 'should_create_template' => true,
                 'allow_add' => true,
                 'target_element' => $fieldset,
             )
             )
        );

        $this->setValidationGroup(array(
            'csrf',
            'row' => array(
                'yourFieldset',
                'fields',
            )
        ));
    

【讨论】:

以上是关于验证 Zend\Form\Element\Collection的主要内容,如果未能解决你的问题,请参考以下文章

tp5.1 验证规则 验证数字

js实现输入手机验证码后点击提交按钮验证手机输入的验证码和发送的验证码是不是一致

原生JavaScript判断是否为邮箱危险字符验证长度验证网址验证小数整数浮点数等常用的验证

Java如何实现验证码验证功能

facebook怎么验证?

[8期]浅谈当代安全验证问题