3

嗨,我想验证 zf2 表单中的日期字段。我设置了“格式”选项以获得我需要的格式。但是每次我验证它时都会出错。验证器如下所示:

            $inputFilter->add($factory->createInput(array(
            'name' => 'user_data_birth',
            'required' => false,
            'validators' => array(
                array(
                'name' => 'Date',
                'options' => array(
                    'format' => 'd.m.Y',
                    'locale' => 'de',
                    'messages' => array(
                        \Zend\Validator\Date::INVALID => 'Das scheint kein gültiges Datum zu sein.',
                        \Zend\Validator\Date::INVALID_DATE => 'Das scheint kein gültiges Datum zu sein. (Invalid Date)',
                        \Zend\Validator\Date::FALSEFORMAT => 'Das Datum ist nicht im richtigen Format.',
                        ),
                    ),
                ),
                array(
                    'name' => 'NotEmpty',
                    'options' => array(
                    'messages' => array(
                        \Zend\Validator\NotEmpty::IS_EMPTY => 'Bitte geben Sie das Datum an'
                        ),
                    ),
                )
            ),
        )));

但是每次我都会收到日期格式错误的错误消息。

4

4 回答 4

14

你可以解决,开始日期应该小于结束日期验证的问题,使用回调函数如下:

          $inputFilter->add($factory->createInput(array(
                'name' => 'end_date',
                'required' => true,                 
                'filters' => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name' => 'Callback',
                        'options' => array(
                            'messages' => array(
                                    \Zend\Validator\Callback::INVALID_VALUE => 'The end date should be greater than start date',
                            ),
                            'callback' => function($value, $context = array()) {                                    
                                $startDate = \DateTime::createFromFormat('d-m-Y', $context['start_date']);
                                $endDate = \DateTime::createFromFormat('d-m-Y', $value);
                                return $endDate >= $startDate;
                            },
                        ),
                    ),                          
                ),
        )));

使用上面的代码,我已经解决了我的问题。我希望这有帮助。

于 2013-10-09T04:17:57.787 回答
1

需要更改日期元素中的验证器。如果你将格式传递给元素,你会没事的。您也可以从元素中获取验证器。

$date = new Element\DateTime('test');
$date->setFormat('d.m.Y');

或者

$validators = $date->getValidators()
// apply you changes
于 2016-10-27T12:23:03.287 回答
0

如果我们只需要以一种形式使用回调函数,那么回调函数是一种非常方便的方式。大多数时候,我们需要在不止一个地方使用它。我做了一些研究并编写了这个自定义验证器。这个验证器比较两个字符串;我添加了另一个技巧,看看我们是否需要这些字符串不同或相同。

如果我们要更改密码;那么旧密码和新密码同时不同,我们需要新密码验证与新密码相同。只需将不同的参数更改为“true”或“false”,此验证器即可用于这两种情况。

Form Fields
user_password
new_user_password
new_user_password_verify

在 Application\src\Application\Validator 中创建一个新的验证器 StringCompare.php

<?php

namespace Application\Validator;

class StringCompare extends \Zend\Validator\AbstractValidator {

    const SAME = 'same';
    const DIFFERENT = 'different';

    protected $messageTemplates = array(
        self::SAME => "Both the words are the same",
        self::DIFFERENT => "Both the words are different",
    );

    protected $messageVariables = array(
        'compareWith' => array( 'options' => 'compareWith' ),
        'different' => array( 'options' => 'different' ),
    );

    protected $options = array(
        'compareWith' => "",
        'different' => true,
        'encoding' => 'UTF-8',
    );

    public function __construct( $options = array( ) ) {
        parent::__construct( $options );
    }

    public function getCompareWith( ) {
        return $this->options[ 'compareWith' ];
    }

    public function getDifferent( ) {
        return $this->options[ 'different' ];
    }

    public function isValid( $value, $context=array( ) ) {

        $compareWith = $this->getCompareWith( );
        $different = $this->getDifferent( );

        $returnValue =  $value == $context[$compareWith];
        if ( $different ) {
            $returnValue = !$returnValue;
       if ( !$returnValue ) {
          $this->error( self::SAME );
           }
        } else {
        if ( !$returnValue ) {
        $this->error( self::DIFFERENT );
        }
    }
        return $returnValue;


    }

}

将以下内容添加到表单过滤器

$this->add ( array (
    'name'  => 'new_user_password',
    'required' => true,
    'filters' => array (
        array ( 
            'name' => 'StringTrim',
        ),
    ),
    'validators' => array (
        array (
            'name' => 'StringLength',
            'options' => array (
                'min' => 8,
                'max' => 20,
            )
        ),
        array (
            'name' => 'Application\Validator\StringCompare',
            'options' => array (
                'compareWith' => 'user_password',
                'different' => true,
            ),
        ),
    )
) );

在您的控制器中执行表单验证,我们就完成了。如果我们使用 different = 'true' 验证例程确保两个值不同,如果我们使用 'false',则它确保字符串相同。

于 2014-05-17T08:54:26.490 回答
0

您是否尝试过另一种格式,例如基本格式:'Ymd'?结果是什么?

于 2013-03-30T19:22:38.570 回答