Ergebnis 1 bis 19 von 19

Thema: Zend_Validate_Between mit Datum

  1. #1
    Erfahrener Benutzer Avatar von itsame69
    Registriert seit
    21.09.2009
    Beiträge
    1.147
    Thanks
    0
    Thanked 4 Times in 4 Posts

    Ausrufezeichen Zend_Validate_Between mit Datum

    Hallo,

    warum funktioniert folgender Validator nicht, bzw. wirft immer TRUE?

    Code:
    $when = new Zend_Dojo_Form_Element_DateTextBox('when', array(
                'size' => 32, 10, 'label' => 'dept_when', 
                'value' => '2009-10-10'
            ));
    
    $when->addValidator(new Zend_Validate_Between(new Zend_Date('2000-01-01'), new Zend_Date('2009-12-20')), true);
    Folgender Code funkt tadellos:
    Code:
    $xxx = new Zend_Date('2009-12-20');
    $v = new Zend_Validate_Between(new Zend_Date('2000-01-01'), new Zend_Date('2009-12-19'));
    Zend_Debug::dump($v->isValid($xxx));
    Ich steh im Moment schon am Schlauch...

    lg
    Christian

  2. #2
    Moderator Avatar von thomas
    Registriert seit
    16.12.2006
    Beiträge
    1.350
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Könnte daran liegen das Zend_Validate_Between lt. Dokumentation keine Objekte verarbeiten kann.
    Mfg
    Thomas Weidner
    I18N Team Leader, Zend Framework
    Wir schwarzen Schafe sind die heimlichen Herrscher der Welt... unser schwarzer Humor ist unsere beste Waffe
    www.thomasweidner.com

  3. #3
    Erfahrener Benutzer Avatar von itsame69
    Registriert seit
    21.09.2009
    Beiträge
    1.147
    Thanks
    0
    Thanked 4 Times in 4 Posts

    Standard

    Hallo Thomas,

    ja - kann durchaus so sein. Aber wieso funktioniert dann

    $xxx = new Zend_Date('2009-12-20');
    $v = new Zend_Validate_Between(new Zend_Date('2000-01-01'), new Zend_Date('2009-12-19'));
    Zend_Debug::dump($v->isValid($xxx));
    Ich hab das mit ein paar Testfällen durchgespielt und das hier funktioniert (scheint zumindest zu funktionieren).

    lg
    Christian

  4. #4
    Erfahrener Benutzer Avatar von itsame69
    Registriert seit
    21.09.2009
    Beiträge
    1.147
    Thanks
    0
    Thanked 4 Times in 4 Posts

    Standard

    noch ein PS:

    Code:
    $a = new Zend_Date('2000-10-10');
    $b = new Zend_Date('1999-10-10');
    
    Zend_Debug::dump($a < $b);
    Zend_Debug::dump($a > $b);
    liefert korrekt bool(false) und bool(true).

    Die isValid Methode der Zend_Validate_Between Klasse ist wie folgt implementiert (auszugsweise):

    Code:
        public function isValid($value)
        {
    [...]
                if ($this->_min > $value || $value > $this->_max) {
                    $this->_error(self::NOT_BETWEEN);
                    return false;
                }
    [...]
            return true;
        }
    Dementsprechend sollte mein Source (erster Post) ja eigentlich funktionieren.

    lg
    Christian

  5. #5
    Moderator Avatar von thomas
    Registriert seit
    16.12.2006
    Beiträge
    1.350
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Und welche Ausgabe liefert dein Dojo-Objekt ?

    Ich tippe mal auf den Text "2009-12-16" und nicht, so wie Zend_Date einen Timestamp.
    Mfg
    Thomas Weidner
    I18N Team Leader, Zend Framework
    Wir schwarzen Schafe sind die heimlichen Herrscher der Welt... unser schwarzer Humor ist unsere beste Waffe
    www.thomasweidner.com

  6. #6
    Erfahrener Benutzer Avatar von itsame69
    Registriert seit
    21.09.2009
    Beiträge
    1.147
    Thanks
    0
    Thanked 4 Times in 4 Posts

    Standard

    hmm.... ich schau mir das gleich morgen an, bin schon zu k.o. heute ;-)

  7. #7
    Erfahrener Benutzer Avatar von itsame69
    Registriert seit
    21.09.2009
    Beiträge
    1.147
    Thanks
    0
    Thanked 4 Times in 4 Posts

    Standard

    Hallo Thomas,

    genau das war das Problem. Danke! Zend_Dojo_Form_Element_DateTextBox liefert hier einen String "2009-12-20" und kein Zend_Date. Dementsprechend funktioniert dann natürlich der Vergleich nicht mehr.

    Ich habs jetzt mal so gelöst, dass ich mir einen Validator von Zend_Validate_Between ableite. Hier meine Lösung (schmutzig weil praktisch keine Fehlerüberprüfung erfolgt, bzw. nur auf ein bestimmtest Datumsformat geprüft wird. Kommentare hab ich gelöscht).

    Die Klasse leistet also genau das gleiche wie Zend_Validate_Between, nur das - falls möglich - ein String "2009-10-10" in ein Zend_Date umgewandelt wird...

    Code:
    class Careengine_Validate_Between extends Zend_Validate_Between
    {
        public function isValid($value)
        {
            if (Zend_Date::isDate($value, 'YYYY-MM-DD')) {
                $value = new Zend_Date($value);
            } 
            
            return parent::isValid($value);
        }
    }
    lg
    Christian

  8. #8
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.097
    Thanks
    2
    Thanked 321 Times in 252 Posts

    Standard

    Zitat Zitat von itsame69
    Ich habs jetzt mal so gelöst, dass ich mir einen Validator von Zend_Validate_Between ableite. Hier meine Lösung (schmutzig weil praktisch keine Fehlerüberprüfung erfolgt, bzw. nur auf ein bestimmtest Datumsformat geprüft wird. Kommentare hab ich gelöscht).

    Die Klasse leistet also genau das gleiche wie Zend_Validate_Between, nur das - falls möglich - ein String "2009-10-10" in ein Zend_Date umgewandelt wird...
    Wende doch einfach einen Filter an, denn diese werden vor der Prüfung ausgeführt. „Zend_Filter_Callback“ wäre eine Möglichkeit.

  9. #9
    Erfahrener Benutzer Avatar von itsame69
    Registriert seit
    21.09.2009
    Beiträge
    1.147
    Thanks
    0
    Thanked 4 Times in 4 Posts

    Standard

    Hallo Kaiuwe, ja - wäre natürlich auch eine Möglichkeit. Ich möchte aber eben, dass Mein_Between genau das gleiche wie Zend_Validate_Between tut. Also auch für z.B. INTs funktioniert. Deshalb mein Ansatz "versuch $value in ein Datum umzuwandeln und wenn das nicht geht, verwende $value as-is" lg Christian

  10. #10
    Erfahrener Benutzer
    Registriert seit
    28.12.2006
    Beiträge
    9.966
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Kaiuwes Ansatz war eher, dass du nicht dafür sorgen brauchst, dass dein Filter auch für Ints funktionieren muss, wenn du vorher sicher stellst, dass es kein Int ist. Die Lösung ist eigentlich angenehmer, weil diese Annahme (Int oder nicht?) muss dann auch eine Anwendung nicht mehr prüfen.

  11. #11
    Erfahrener Benutzer Avatar von itsame69
    Registriert seit
    21.09.2009
    Beiträge
    1.147
    Thanks
    0
    Thanked 4 Times in 4 Posts

    Standard

    Ich glaub, ich steh auf dem Schlauch - oder reden wir einfach nur aneinander vorbei .

    Ich verwende ja eben keinen Filter. Unter anderem darum, weil ich die Funktionalität von Zend_Validate_Between ja eben nicht beschneiden, sondern einfach nur erweitern wollte.

    Oder versteh ich da was ganz falsch? Will ich auch nicht ausschließen

    lg
    Christian

  12. #12
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.097
    Thanks
    2
    Thanked 321 Times in 252 Posts

    Standard

    Zitat Zitat von itsame69
    Ich glaub, ich steh auf dem Schlauch - oder reden wir einfach nur aneinander vorbei .

    Ich verwende ja eben keinen Filter. Unter anderem darum, weil ich die Funktionalität von Zend_Validate_Between ja eben nicht beschneiden, sondern einfach nur erweitern wollte.
    Mit einem Filter könntest du den Wert deines „DateTextBox“-Elementes in einen Timestamp umwandeln und dann läuft die Prüfung auch ohne Probleme mit „Zend_Validate_Between“ und der Übergabe der „Zend_Date“-Objekte.

  13. #13
    Erfahrener Benutzer Avatar von itsame69
    Registriert seit
    21.09.2009
    Beiträge
    1.147
    Thanks
    0
    Thanked 4 Times in 4 Posts

    Standard

    Okay, jetzt versteh ich, was du meinst ;-). Ich bleib trotzdem lieber bei meiner Lösung und überlasse das dem Validator.

    Danke trotzdem für den Input.

    Grüße
    Christian

  14. #14
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.097
    Thanks
    2
    Thanked 321 Times in 252 Posts

    Standard

    Zitat Zitat von itsame69
    Ich bleib trotzdem lieber bei meiner Lösung und überlasse das dem Validator.
    Da du keine Begründung für deine Wahl gebracht hast, werde ich dies mal für meinen Vorschlag tun:
    Wenn man nach den Namen und den Definitionen der Prüfungsroutinen geht, dann nehmen diese nur Werte entgegen und prüfen diese gegen bestimmte Vorgaben. Was diese Routinen nicht leisten, ist das Umwandeln von Werten, denn das ist schon die Aufgabe der Filter. Die Filter-Komponente stellt genau für deine Anforderung die passenden Methoden zur Verfügung, denn für Umwandlungen und Wertanpassungen sind sie gedacht. Zusätzlich lässt sich der Filter auch noch einzeln verwenden.

    Auch zum Nachlesen in der Doku:

  15. #15
    Erfahrener Benutzer Avatar von itsame69
    Registriert seit
    21.09.2009
    Beiträge
    1.147
    Thanks
    0
    Thanked 4 Times in 4 Posts

    Standard

    Hallo,

    du bist sicher wesentlich fitter im ZF als ich. Trotzdem versuch ich mal, meinen Ansatz zu verteidigen.

    Ich hab ein Formular, welches aus bestimmten Elementen besteht. Was ich jetzt eben nicht will, ist den Wert im Formular zu filtern - oder genauer, ich möchte den Anwender meines Validators nicht dazu "zwingen", dass tun zu müssen um ein korrektes Resultat für Zend_Date Werte zu erhalten.

    Stattdessen, versucht der Validator hier einfach nur eine "korrekte" Typumwandlung herzustellen. Wenn das gelingt, wird Zend_Date als Inputwert (bzw. eben der gecastete Wert) verwendet, ansonsten der Originalwert (nicht gecastet).

    Meine Lösung ist aber natürlich (noch) naiv. Sauberer wäre z.B., nur dann eine Typumwandlung (String) "2009-12-12" auf Zend_Date durchzuführen, wenn auch MIN und MAX vom Typ Zend_Date sind.

    Grüße
    Christian

  16. #16
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.097
    Thanks
    2
    Thanked 321 Times in 252 Posts

    Standard

    Zitat Zitat von itsame69
    Ich hab ein Formular, welches aus bestimmten Elementen besteht. Was ich jetzt eben nicht will, ist den Wert im Formular zu filtern - oder genauer, ich möchte den Anwender meines Validators nicht dazu "zwingen", dass tun zu müssen um ein korrektes Resultat für Zend_Date Werte zu erhalten.
    Der Anwender musst doch rein gar nichts tun?!

    Mir fällt gerade ein: Prüf doch mal, ob das Dojo-Element nicht Timestamp schon setzen kann. Dann fällt doch das Umwandeln weg und es läuft sofort mit dem „Between“-Prüfer.
    Zitat Zitat von itsame69
    Meine Lösung ist aber natürlich (noch) naiv. Sauberer wäre z.B., nur dann eine Typumwandlung (String) "2009-12-12" auf Zend_Date durchzuführen, wenn auch MIN und MAX vom Typ Zend_Date sind.
    Der Minimal- und Maximalwert ist aber im Validator kein Objekt vom Typ „Zend_Date“ mehr, sondern ein Timestamp!

  17. #17
    Erfahrener Benutzer Avatar von itsame69
    Registriert seit
    21.09.2009
    Beiträge
    1.147
    Thanks
    0
    Thanked 4 Times in 4 Posts

    Standard

    Der Anwender musst doch rein gar nichts tun?!
    Mit "Anwender meines Validators" meinte ich natürlich den Programmierer und nicht den User, der vor dem Firefox sitzt

    Der Minimal- und Maximalwert ist aber im Validator kein Objekt vom Typ „Zend_Date“ mehr, sondern ein Timestamp!
    hmmm... also

    Code:
    Zend_Debug::dump($this->_min);
    Zend_Debug::dump($this->_max);
    in der isValid() Methode liefert zumindest noch zweimal Zend_Date als Typ.

    lg
    Christian

  18. #18
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.097
    Thanks
    2
    Thanked 321 Times in 252 Posts

    Standard

    Zitat Zitat von itsame69
    in der isValid() Methode liefert zumindest noch zweimal Zend_Date als Typ.
    Ich war noch ein Stück weiter:
    PHP-Code:
    if ($this->_min $value || $value $this->_max) {...} 
    Hast du mal nachgeschaut:
    Zitat Zitat von itsame69
    Prüf doch mal, ob das Dojo-Element nicht Timestamp schon setzen kann. Dann fällt doch das Umwandeln weg und es läuft sofort mit dem „Between“-Prüfer.

  19. #19
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.097
    Thanks
    2
    Thanked 321 Times in 252 Posts

    Standard

    Hatte gerade die Idee:
    • Validate
      • Date
        • Is
        • Between
        • GreaterThan
        • LessThan

    Aber dann fiel mir es wieder ein: das kennst du irgendwo her und da war es!
    Und von Thomas kommt: „Zend_Filter_Date“.

Ähnliche Themen

  1. Datum umwandeln
    Von hans47 im Forum PHP X-Talk
    Antworten: 6
    Letzter Beitrag: 21.07.2009, 11:16
  2. Ermitteln wie lange her ein Datum ist?
    Von garten im Forum Lokalisierung & Internationalisierung
    Antworten: 4
    Letzter Beitrag: 05.06.2009, 21:23
  3. textelemtn mit Datum formatieren
    Von struggle82 im Forum Formulare
    Antworten: 2
    Letzter Beitrag: 09.04.2009, 11:59
  4. Datum auf Gültigkeit prüfen
    Von regex im Forum Formulare
    Antworten: 1
    Letzter Beitrag: 09.02.2009, 19:31
  5. Datum aus Tabelle lesen
    Von rapsli im Forum DB
    Antworten: 5
    Letzter Beitrag: 17.07.2007, 01:58

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •