【问题标题】:date validation rules in yiiyii 中的日期验证规则
【发布时间】:2014-04-10 06:42:49
【问题描述】:

我在验证日期规则时遇到问题,当我输入无效日期(如“xxxx”)时,验证器无法运行,但它会为其他需要验证器的字段运行。

表格

?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'post-form',
    'enableAjaxValidation'=>false,
    'enableClientValidation'=>true,
)); ?>

....

<div class="row">
        <?php echo $form->labelEx($model,'fromDate'); ?>
        <?php echo $form->textField($model,'fromDate'); ?>
        <?php echo $form->error($model,'fromDate'); ?>
    </div>

    <div class="row">
        <?php echo $form->labelEx($model,'toDate'); ?>
        <?php echo $form->textField($model,'toDate'); ?>
        <?php echo $form->error($model,'toDate'); ?>
    </div>

后期模型中的规则

public function rules()
    {
    return array(
    array('fromDate, toDate', 'date', 'format'=>'dd-mm-yyyy H:m:s', 'allowEmpty'=>false),
            array('subject', 'required'),
                    );
...

    }

提前感谢您的帮助

【问题讨论】:

    标签: php validation yii


    【解决方案1】:

    我觉得 Yii 的 CDateValidator 不是特别灵活,我通常会走创建自定义验证规则的路线:

    将此添加到您的模型中:

    public function isValidDate($attribute, $params)
    {
        if(!strtotime($this->$attribute))
        {
            $this->addError($attribute, $attribute . ' was not a valid date');
        }
    }
    

    然后将自定义验证器分配给 rules() 数组中的属性:

    array('fromDate, toDate', 'isValidDate'),
    

    您可以对此进行扩展,以确保日期在合理的时间范围内,并且 toDatefromDate 等之后。

    【讨论】:

    • 我不知道为什么 isValidDate 什么都不做! @JamesG
    • 糟糕 - 错过了 ! 否定断言。一个角色能带来多大的改变……现在编辑我的帖子。
    【解决方案2】:

    你可以使用 Yii 小部件

       <div class="row">
        <?php
        echo $form->labelEx($model, 'fromDate');
    
        $this->widget('CJuiDateTimePicker', array(
            'model' => $model, //Model object
            'attribute' => 'fromDate', //attribute name
            'mode' => 'date', //use "time","date" or "datetime" (default)
            'options' => array(
                'dateFormat' => "dd/mm/yy",
                'defaultDate' => "new Date()",
            ), // jquery plugin options
            'htmlOptions' => array(
                'id' => 'fromDate',
            ),
        ));
        ?>
    
    </div>
    

    在行动中:

     if ($model->fromDate != '') {
         $temp = strtotime(str_replace('/', '-', $model->fromDate));
         $temp = date('Y-m-d', $temp);
         $model->fromDate = $temp;
         }
    

    【讨论】:

    • 模式选项显然在 CJuiDateTimePicker @Rishabh 中不存在
    • 您可以在 CJuiDateTimePicker.php 中添加 public $mode='datetime';
    【解决方案3】:

    验证规则在 CDateTimeParse.php 中解释

     * Pattern |      Description
     * ----------------------------------------------------
     * d       | Day of month 1 to 31, no padding
     * dd      | Day of month 01 to 31, zero leading
     * M       | Month digit 1 to 12, no padding
     * MM      | Month digit 01 to 12, zero leading
     * MMM     | Abbreviation representation of month (available since 1.1.11; locale aware since 1.1.13)
     * MMMM    | Full name representation (available since 1.1.13; locale aware)
     * y       | 4 year digit, e.g., 2005 (available since 1.1.16)
     * yy      | 2 year digit, e.g., 96, 05
     * yyyy    | 4 year digit, e.g., 2005
     * h       | Hour in 0 to 12, no padding
     * hh      | Hour in 00 to 12, zero leading
     * H       | Hour in 0 to 23, no padding
     * HH      | Hour in 00 to 23, zero leading
     * m       | Minutes in 0 to 59, no padding
     * mm      | Minutes in 00 to 59, zero leading
     * s       | Seconds in 0 to 59, no padding
     * ss      | Seconds in 00 to 59, zero leading
     * a       | AM or PM, case-insensitive (since version 1.1.5)
     * ?       | matches any character (wildcard) (since version 1.1.11)
    
     * For example, to parse a date string '21/10/2008', use the following:
     * $timestamp=CDateTimeParser::parse('21/10/2008','dd/MM/yyyy');
    

    【讨论】:

      猜你喜欢
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多