2016-05-18 8 views
0

Ich habe ein Formular, und ein Benutzer muss ein Datum des Beginns und ein Datum des Endes eingeben.Yii2 Datumsvergleich funktioniert nicht in Regeln()

Ich verwende das compare-Attribut in der Methode rules, weil der Benutzer kein Enddatum eingeben kann, das vor dem Anfangsdatum liegt.

Hier ist meine Regeln Methode innerhalb des Modells Form:

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

Das Problem ist, wenn ein Benutzer ein Datum von Anfang an als 2016.05.18 und ein Datum der Beendigung der 2016.04.17 geben, ein Fehlermeldung wird angezeigt und der Benutzer kann das Formular nicht senden. Wenn der Benutzer jedoch ein Datum vom Anfang 2016-05-18 und ein Datum vom Ende 2016-04-23 eingibt, tritt kein Fehler auf und der Benutzer kann das Formular nicht senden. Tatsächlich wird nur der Tag mit dieser Regel verglichen.

EDIT Nach diesem Link: Yii2 Date compare validation, ich habe eine benutzerdefinierte Validierungsmethode erstellt, aber ich bin mit europäischem Format, damit ich die strtotime Methode denke, nicht gut ist wirking. Hier ist meine validateDates Methode:

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'); 
    } 
} 

Und hier ist der Aufruf dieser Methode:

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

Antwort

3

Es ist ein häufiges Datum Formatierung/Konvertierung Problem, nicht wirklich spezifisch für Yii.

Sie könnten einfach versuchen, DateTime::createFromFormat(), z. :

in den meisten Fällen besser sein, speichern Daten in Ihrer Datenbank mit dem richtigen Format ( DATE mit MySQL zum Beispiel), und sie nur für die Anzeige umwandeln
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'); 
    } 
} 

Aber es soll.

+0

Alle meine Daten werden in der Datenbank mit Datumsformaten gespeichert, aber wenn Benutzer ein Datum mit Datumsauswahl hinzufügen, sind sie im europäischen Format. –

0

Betrachten Sie Ihre Reisedaten ein, um die Prüfung zu beheben folgende:

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

Ereignis Enddatum sein sollte größer als Startdatum.

+0

Ja, aber wenn die Bedingung in Ordnung ist, wird ein Fehler in der Bedingung angezeigt, dass wir überprüfen möchten, ob das Startdatum des Ereignisses größer als das Ereignisenddatum ist ^^ –

+0

Vielleicht sollten Sie hinzufügen if ($ this-> hasErrors()) { Rückkehr; } vor $ this-> addError call? – Taras