ZF2不验证集合中的元素

时间:2018-02-14 20:22:11

标签: zend-framework2

我在使用Collection,

类型的元素验证表单时遇到问题

首先,我创建一个“Collection”类型元素,然后添加几个文本类型元素。

表单是否正确呈现,问题是表单始终有效。

我如何验证集合类型元素?

表格类:

contour3d

}

控制器类:

class TestForm extends Form {

private $inputFilter;

public function __construct($name = null) {

    parent::__construct($name);

    $this->add(array(
        'name' => 'submit',
        'type' => 'Zend\Form\Element\Submit',
        'options' => array(
            'label' => 'Submit',
        ),
        'attributes' => array(
            'class' => 'form-control',
            'value' => 'submit'
        ),
    ));

    $docs = array(
        array('name' => "doc A"),
        array('name' => "doc B")
    );

    // add collection of docs.

    $collection = new \Zend\Form\Element\Collection();
    $collection->setName('docs');

    foreach ($docs as $key => $doc) {

        $element = new \Zend\Form\Element\Text($key);

        $element->setOptions(array(
            'label' => $doc['name'],
        ));

        $element->setAttributes(array(
            'class' => 'form-control input-sm',
        ));

        $collection->add($element);
    }

    $this->add($collection);
}

public function getInputFilter() {

    $this->inputFilter = new InputFilter();

    $this->inputFilter->add(array(
        'name' => "docs",
        'required' => true,
        'filters' => array(
            array('name' => 'StripTags'),
            array('name' => 'StringTrim'),
        ),
    ));

    return $this->inputFilter;
}

查看课程:

class IndexController extends AppController {

public function indexAction() {

    $form = new \Application\Model\Form\TestForm();

    $request = $this->getRequest();

    if ($request->isPost()) {

        $data = $this->params()->fromPost();
        $form->setData($data);
        $form->setInputFilter($form->getInputFilter());

        if ($form->isValid()) {
            pr("is valid");
        } else {
            pr($form->getMessages());
        }
    }


    return new ViewModel(array(
        'form' => $form
    ));
}

1 个答案:

答案 0 :(得分:1)

您的收藏集始终有效,因为它包含字段。你不能这样做。

您应该考虑将验证码添加到DocADocB字段。这将按以下方式设置正确的输入过滤器:

$form->getInputFilter()->get('docs')->get('DocA')->getValidatoChain()->attachByName('YourValidatorName');

用于自定义验证器。

或者:

$form->getInputFilter()->get('docs')->get('DocA')->setRequired(true);
$form->getInputFilter()->get('docs')->get('DocA')->setAllowEmpty(false);

您还可以向他们添加Zend验证器。

$form->getInputFilter()->get('docs')->get('DocA')->getValidatorChain()->attach(new NotEmpty([with params look docs for that])

如果您不使用ServiceManager检索验证器,请务必将转换器设置为选项。

不要忘记正确设置validationGroup,或者不指定使用VALIDATE_ALL。

与验证器相同,您还可以按以下方式添加过滤器:

$form->getInputFilter()->get('docs')->get('DocA')->getFilterChain()->getFilters()->insert(new StripTags())->insert(new StringTrim())