我有一个表单,用户必须输入开始日期和结束日期。
我在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],
答案 0 :(得分:4)
这是一个常见的日期格式/转换问题,并非真正特定于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');
}
}
但在大多数情况下,应该更好地以正确的格式(例如,使用MySQL DATE
)在数据库中存储日期,并且只将它们转换为显示。
答案 1 :(得分:0)
考虑将日期检查修复为以下内容:
if (strtotime($this->dateFinTR) > strtotime($this->dateDebutTR))
活动结束日期应该大于开始日期。