【问题标题】:Yii2 date comparison not working inside rules()Yii2 日期比较在规则中不起作用()
【发布时间】:2016-05-18 07:04:44
【问题描述】:

我有一个表格,用户必须输入开始日期和结束日期。

我在 rules 方法中使用了 compare 属性,因为用户无法输入在开始日期之前的结束日期。

这是我在表单模型中的规则方法:

['dateFinTR', 'date', 'format' => 'php: d/m/Y'],
['dateFinTR', 'compare', 'compareAttribute' => 'dateDebutTR', 'operator' => '>=', 'skipOnEmpty' => true,]

问题是如果用户输入的开始日期为 2016-05-18,结束日期为 2016-04-17,则会显示错误消息并且用户无法提交表单。但是如果用户输入 2016-05-18 的开始日期和 2016-04-23 的结束日期,则没有错误,用户无法提交表单。 事实上,只有这一天与此规则进行比较。

编辑 根据此链接:Yii2 Date compare validation,我创建了一个自定义验证方法,但我使用的是欧洲格式,所以我认为 strtotime 方法不是很好。 这是我的 validateDates 方法:

public function validateDates()
{
    if (strtotime($this->dateFinTR) <= strtotime($this->dateDebutTR))
    {
        $this->addError('dateFinTR', 'Veuillez saisir une date de fin se trouvant avant la date de début');
    }
}

这里是这个方法的调用:

['dateFinTR', 'validateDates', 'skipOnEmpty' => true],

【问题讨论】:

    标签: php yii2 yii2-basic-app yii2-model yii2-validation


    【解决方案1】:

    这是一个常见的日期格式/转换问题,并不是 Yii 特有的。

    您可以简单地尝试使用DateTime::createFromFormat(),例如:

    public function validateDates()
    {
        $date1 = \DateTime::createFromFormat('d/m/Y', $this->dateDebutTR);
        $date2 = \DateTime::createFromFormat('d/m/Y', $this->dateFinTR);
        if ($date2<=$date1) {
            $this->addError('dateFinTR', 'error message');
        }
    }
    

    但在大多数情况下,最好以正确的格式将日期存储在数据库中(例如,DATE 使用 MySQL),然后只转换它们以供显示。

    【讨论】:

    • 我所有的日期都以日期格式存储在数据库中,但是当用户使用 datepicker 添加日期时,它们都是欧洲格式。
    【解决方案2】:

    考虑将日期检查改成以下:

    if (strtotime($this->dateFinTR) > strtotime($this->dateDebutTR))
    

    活动结束日期应大于开始日期。

    【讨论】:

    • 是的,但如果条件正常,则会显示错误,因此我们要检查事件开始日期是否大于事件结束日期^^
    • 也许你应该加上 if ($this->hasErrors()) { return; } 在 $this->addError 调用之前?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多