【问题标题】:Zend 2 - Add validator and filter to custom formZend 2 - 将验证器和过滤器添加到自定义表单
【发布时间】:2013-11-29 05:31:11
【问题描述】:

我要在这里吃香蕉。我创建了一个包含两个字段的简单表单。一个是文本字段,另一个是文本区域。表单看起来不错,但我不会验证 - 无论我尝试什么。

这是我的表单类:

class MyForm extends Form
{

public function __construct()
{

    parent::__construct();

    $this->add(array(
        'name' => 'subject',
        'required' => true,
        'allowEmpty' => false,
        'options' => array(
            'label' => 'Betreff*',
        ),
        'type' => 'Zend\Form\Element\Text',
        'validators' => array(
            // validators for field "name"
            new \Zend\Validator\NotEmpty(),
        ),
        'filters' => array(
            // filters for field "name"
            array('name' => 'Zend\Filter\StringTrim'),
        ),
    ));

    $this->add(array(
        'name' => 'text',
        'required' => true,
        'allowEmpty' => false,
        'options' => array(
            'label' => 'Nachricht*',
        ),
        'type' => 'Zend\Form\Element\Textarea',
    ));

    $this->add(new Element\Csrf('security'));
}
}

valdiatorsfilters 只是我尝试过的众多事情之一......

在我的控制器中,表单始终有效:

    $form = new MyForm();

    $request = $this->getRequest();
    if ($request->isPost()) {

        $form = new MyForm();
        $form->setData($request->getPost());

        echo $form->isValid();

        if($form->isValid()) { ... }

我总是通过if

我想知道:为什么我在设置required=true 时仍然需要验证器?为什么他们在不做任何事情的情况下实现这样的属性?

但仍然:如何验证我的表单?我只想要一个像trim 这样的清理过滤器和一个NotEmpty 验证器。

谢谢!

【问题讨论】:

    标签: php validation zend-framework2 zend-form-element zend-form2


    【解决方案1】:

    在字段上添加 required => true 只是为了美观。

    你说的是哪个“如果”?我只看到你回显了 isValid?

    (抱歉在这里提问,我还不能评论旅游问题,低代表......)

    编辑:

    正如所承诺的,一个“解决方案”。在您说您自己找到了解决方案之后,我开始写这篇文章,所以我将写下我如何创建表单并将我的表单和验证器放在一起。为了清晰起见,我喜欢将验证器放在我的表单旁边,尽管在技术上将验证器放置在它们所服务的实体中会给你在 API 方面的更多灵活性。

    说得够多了,这是我在表单中使用的(非常基本的)字段集的示例:

    (我将 cmets 排除在外,因为所有内容都应该非常不言自明)

    class RaceUserFieldset extends Fieldset implements InputFilterProviderInterface {
    
        public function __construct() {
            parent::__construct('hosts');
    
            $this   ->setHydrator(new \Zend\Stdlib\Hydrator\ClassMethods(false))
                   ->setObject(new RaceUser());
    
            $this->add(array(
                'name' => 'userid',
                'type' => 'hidden',
            ));
            $this->add(array(
                'name' => 'username',
                'type' => 'Text',
            ));
        }
    
        public function getInputFilterSpecification() {
            return array(
                'username' => array(
                    'required' => true,
                ),
            );
        }
    }
    

    这里没问题,实体、水合器、字段(没有过滤器,但这很容易)和验证器。

    以一种形式使用它(简单化):

    class RaceUserForm extends Form
    {
        public function __construct()
        {
            parent::__construct('raceuser');
    
            $this->setAttribute('method', 'post');
    
            $this->add(array(
                'type' => 'YCRFront\Form\EditRaceFieldset',
                'options' => array(
                    'use_as_base_fieldset' => true
                )
            ));
    
            $this->add(array(
                'name' => 'submit',
                'attributes' => array(
                    'type' => 'submit',
                    'value' => 'Send'
                )
            ));
        }
    }
    

    【讨论】:

    • 您能否发布一些代码以使我的验证工作?我真的不在乎其余的:) 谢谢! PS:如果你这样做,我向你保证,下次你有足够的代表;)
    • 我发现了我的一个老问题,其中有一个非常大的类的链接......但如果可能的话,我只想在我现有的代码中添加几行:The answer
    • 我终于明白了!我希望你仍然发布一个不错的解决方案 - 我会接受它:)
    • 另外,我很好奇你做了什么! :-)
    • 基本上只是我链接中的内容......但我想你的解决方案更好。顺便说一句:恭喜您获得新特权 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多