У меня есть форма, и пользователь должен ввести дату начала и дату окончания.
Я использую атрибут сравнения внутри метода правил, потому что пользователь не может ввести дату окончания, которая предшествует дате начала.
Вот мой метод правил внутри модели формы:
['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 Проверка даты сравнения, Я создал собственный метод проверки, но я использую европейский формат, поэтому я считаю, что метод 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],
Это распространенная проблема форматирования / преобразования дат, которая не является специфической для 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, например), и только конвертировать их для отображения.
Подумайте, чтобы исправить ваши даты, проверьте следующее:
if (strtotime($this->dateFinTR) > strtotime($this->dateDebutTR))
Дата окончания события должна быть больше даты начала.