Lithium und Validierung komplexer Formulareingaben - wie?

8

Ich habe einige Lithium-Tutorials gemacht (Links unten, falls sie jemand anderem helfen, und auch um zu zeigen, dass ich meine Hausaufgaben gemacht habe :) und ich verstehe die grundlegendsten Teile beim Erstellen von Modellen, Ansichten, Controllern und Verwenden MVC zum Erstellen eines DB-Datensatzes basierend auf Formulareingabe.

Ich bin jedoch neu bei MVC für Webapps und Lithium, und ich bin mir nicht sicher, wie ich meinen Code in komplizierteren Situationen schreiben sollte. Dies ist eine allgemeine Frage, aber zwei spezifische Validierungsfragen, die ich habe, sind:

  • Wie validiere ich Daten aus dem Formular?
  • Wie sollte ich überprüfen, ob die beiden Benutzer-E-Mail-Felder den gleichen Wert haben?

Ich wäre sehr dankbar für jede Hilfe bei diesen Fragen, und konkrete Beispiele wie diese werden mir auch wirklich helfen, zu verstehen, wie man gute MVC-Kodierung auch in anderen Situationen macht!

Datumseingabe - Validierung der Datenaufteilung über mehrere Formulareingaben

Aus Gründen der UI fordert das Anmeldeformular die Benutzer auf, ihr DOB in drei Felder einzugeben:

%Vor%

Was ist der beste Weg, um diese Server-Seite zu validieren? Ich denke, ich sollte die automagische Validierung nutzen, aber ich bin mir nicht sicher, wie das am besten für eine Reihe von Variablen funktioniert, die nicht wirklich Teil des Modells sind. Zum Beispiel:

  • Soll ich $this->request->data in UsersController nachbearbeiten? Z.B. Modifizieren Sie $this->request->data in UsersController , bevor Sie sie an Users::create übergeben.
  • Soll ich die Formularfelder aus $this->request->data herausziehen und einen statischen Aufruf von Validator::isDate in UsersController ?
  • verwenden?
  • Gibt es eine Möglichkeit, eine Validierungsregel im Modell für Kombinationen von Formularvariablen zu schreiben, die nicht Teil des Modells sind?
  • sollte ich Users::create überschreiben und die zusätzliche Validierung und Nachbearbeitung dort durchführen?

All diese Dinge scheinen so zu sein, als könnten sie funktionieren, obwohl einige ein bisschen hässlich wirken und ich nicht weiß, welche für mich in Zukunft größere Probleme verursachen könnten.

[BEARBEITEN: In engem Zusammenhang damit steht das Problem, die drei Formularfelder zu einem einzigen Feld zu kombinieren, das im Modell gespeichert werden soll]

E-Mail-Eintrag - die Überprüfung von zwei Formularfeldern ist identisch, speichert jedoch nur eines

Für den gesunden Menschenverstand / die gängige Praxis fordert das Anmeldeformular die Benutzer auf, ihre E-Mail-Adresse zweimal anzugeben:

%Vor%

Wie kann ich eine Automagic-Validierungsregel schreiben, die diese beiden Formularfelder auf den gleichen Wert prüft, aber nur die E-Mail-Adresse in der Datenbank speichert?

Es fühlt sich an, als wäre es die gleiche Frage wie die obige, weil die Liste der möglichen Antworten, die ich mir vorstellen kann, die gleiche ist - also schicke ich das als eine Frage ein, aber ich würde Ihre Hilfe sehr schätzen beide Teile, da ich denke, dass die Lösung für dieses hier subtil und anders und gleichermaßen erleuchtend sein wird!

[BEARBEITEN: Eng damit verbunden ist das Problem, verify_email_address nicht in meinem Modell und DB zu speichern]

Einige Hintergrundinformationen zu Lithium

Ich habe andere gelesen, aber diese drei Tutorials haben mich dahin gebracht, wo ich mit Benutzern bin und Formulare jetzt anmelde ...

Einige andere StackOverflow-Fragen zu eng verwandten Themen (aber nicht beantwortet und auch nicht Lithium-spezifisch)

  • Eine Antwort auf diese Frage schlägt vor, einen separaten Controller zu erstellen (und Modell und ...?) - es fühlt sich für mich nicht sehr "Lithium" an, und ich bin besorgt, dass es auch zerbrechlich / leicht fehlerhaft sein könnte
  • Diese wunderbare Geschichte überzeugte mich, dass ich Recht hatte besorgt darüber, es in den Controller zu setzen, aber ich bin mir nicht sicher, was für eine gute Lösung wäre
  • Dieser Blick auf Ansichten lässt mich denken, ich sollte es irgendwie in das Modell einfügen, aber ich weiß nicht den besten Weg, dies in Lithium zu tun (siehe meine Aufzählung unter Datum Eintrag oben)
  • Und diese Scribd-Präsentation hat die Frage gestellt, auf die ich hoffe zu antworten auf der letzten Seite ... worauf es aufhörte ohne es zu beantworten!

NB: CakePHP-artige Antworten sind auch in Ordnung. Ich weiß es nicht, aber es ist ähnlich und ich bin mir sicher, dass ich es übersetzen kann, wenn ich es brauche!

    
cfogelberg 29.03.2012, 19:41
quelle

1 Antwort

4

Ich würde empfehlen, dies in Model anstatt in Controller zu tun - so geschieht es, egal wo Sie speichern.

Bei dem Problem mit dem Datumsfeld überschreiben Sie in Ihrem Modell die save() -Methode und behandeln die Konvertierung der mehreren Felder in den Daten in ein Datumsfeld, bevor Sie parent::save aufrufen, um die eigentliche Speicherung durchzuführen. Irgendeine fortgeschrittene Manipulation kann dort passieren.

Die in Ihrem Kommentar beschriebene Technik, ein verstecktes Formularfeld zu verwenden, um Fehlermeldungen zur Anzeige zu bekommen, klingt ziemlich gut.

Um zu vergleichen, dass zwei E-Mail-Felder gleich sind, würde ich empfehlen, einen benutzerdefinierten Validator zu definieren. Sie können dies in Ihrem Bootstrap mit Validator :: add tun.

%Vor%

Dann in Ihrem Modell:

%Vor%

Bearbeiten : In den Kommentaren finden Sie eine Möglichkeit, die Überprüfung von benutzerdefinierten Regeln in einem Controller durchzuführen:

%Vor%

Ein Vorteil des Festlegens der Daten für die Entität besteht darin, dass sie automatisch in Ihrem Formular vorbefüllt wird, wenn ein Validierungsfehler auftritt.

    
rmarscher 03.04.2012, 23:13
quelle