Fortgeschrittene Verwendung von Zend_FormZend_Form hat eine Vielzahl an Funktionalitäten, von denen viele auf fortgeschrittene Entwickler zugeschnitten sind. Dieses Kapitel beschreibt einige dieser Funktionalitäten mit Beispielen und Usecases. Array SchreibweiseViele fortgeschrittene Entwickler gruppieren zusammengehörige Formularelemente durch Verwendung einer Array Schreibweise in den Namen der Elemente. Zum Beispiel, wenn man zwei Adressen hat die geholt werden sollen, eine Versand- und eine Rechnungsadresse, hat man identische Elemente; durch deren Gruppierung in einem Array, kann sichergestellt werden, dass sie separat geholt werden. Nehmen wir die folgende Form als Beispiel an:
In diesem Beispiel enthalten die Rechnungs- und Versanadresse einige identische Felder, was bedeueten würde, dass sie sich gegenseitig überschreiben. Wir können das durch die Verwendung der Array Schreibweise lösen:
In dem obigen Beispiel erhalten wir jetzt separate Adressen. In der übermittelten Form haben wir jetzt zwei Elemente, 'shipping' und 'billing', jedes mit Schlüsseln für deren verschiedene Elemente. Zend_Form versucht diesen Prozess mit seinen Unterformularen zu automatisieren. Standardmäßig werden Unterformulare dargestellt, indem die Array Schreibweise, wie im vorherigen HTML Form Code gezeigt, komplett mit Ids, verwendet wird. Der Arrayname basiert auf dem Namen des Unterformulars, mit den Schlüsseln basierend auf den Elementen, die im Unterformualr enthalten sind. Unterformulare können beliebig tief verschachtelt sein, und das erzeugt verschachtelte Arrays um die Struktur zu reflektieren. Zusätzlich beachten die verschiedenen Prüfroutinen in Zend_Form die Arraystruktur, und stellen sicher, dass die form korrekt überprüft wird, egal wie tief verschachtelt die Unterformulare sind. Es muss nichts getan werden, um davon zu profitieren; dieses Verhalten ist standardmäßig aktiviert. Zusätzlich gibt es Möglichkeiten, die es erlauben die Array Schreibweise fallweise zu aktivieren, wie auch die Spezifikation eines speziellen Array zu welchem ein Element oder eine Sammlung gehört:
Zusätzlich können auf dem Element Level, individuelle Elemente spezifiziert werden die bestimmten Arrays angehören indem die Zend_Form_Element::setBelongsTo() Methode verwendet wird. Um herauszufinden welcher Wert gesetzt ist -- egal ob dieser explizit gesetzt wurde oder implzit über das Formular -- kann die Zugriffsmethode getBelongsTo() verwendet werden. Mehrseitige FormulareAktuell werden mehrseitige Formulare nicht offiziell in Zend_Form unterstützt; trotzdem ist die meiste Unterstützung für deren Implementierung bereits vorhanden und kann mit etwas extra Code angepasst werden. Der Schlüssel in der Erstellung von mehrseitigen Formularen, ist die Anpassung von Unterformularen, aber der Anzeige, von nur einem Unterformular pro Seite. Das erlaubt es, ein einzelnes Unterformular auf einmal zu übertragen und diese zu prüfen, aber das Formular nicht zu bearbeiten bis alle weiteren Unterformulare komplett sind. Example #1 Beispiel: Anmeldeformular Verwenden wir also ein Anmeldeformular als Beispiel. Für unsere Zwecke wollen wir auf der ersten Seite einen gewünschten Benutzernamen und Passwort holen, dann die Metadaten des Benutzers -- das heißt Vorname, Familienname und Wohnort -- und letztendlich die Auswahl welcher Mailingliste, wenn überhaupt, der Benutzer angehören will. Erstellen wir als erstes unser, eigenes, Formular und definieren in diesem die verschiedenen Unterformulare:
Es ist zu beachten, dass es keinen 'Abschicken' Button gibt, und, dass wir nichts mit den Dekoratoren des Unterformulars gemacht haben -- was bedeutet, dass Sie standardmäßig als Fieldsets angezeigt werden. Wir müssen das Überladen wenn wir jedes individuelle Unterformular anzeigen wollen und einen 'Abschicken' Button hinzufügen, damit wir sie dann bearbeiten können -- was auch Aktions- und Methodeneigenschaften benötigt. Füllen wir unsere Klasse ein wenig und bieten diese Information:
Als nächstes benötigen wir das Grundgerüst für unseren Action Controller, und wir haben verschiedene Entscheidungen zu treffen. Zuerst müssen wir sicherstellen, dass die Formulardaten zwischen den Anfragen fixiert werden, sodass wir feststellen können wann abgebrochen wird. Zweitens wird etwas Logik benötigt, um festzustellen welche Formularteile bereits übermittelt wurden und welches Unterformular, basierend auf dieser Information, angezeigt werden soll. Wir verwenden Zend_Session_Namespace um Daten zu fixieren, was uns auch hilft die Frage zu beantworten welches Formular zu übertragen ist. Erstellen wir also unseren Controller, und fügen eine Methode für den Empfang der Formular Instanz hinzu: Füllen wir unseren Controller nun um die Funktionalität, zu erkennen, welches Formular angezeigt werden soll. Grundsätzlich müssen wir, bis das komplette Formular als gültig angenommen wird, die Darstellung der Formularabschnitte weiterführen. Zusätzlich müssen wir sicherstellen, dass sie in einer bestimmten Reihenfolge sind: Benutzer, Zusätze und dann Listen. Wir können feststellen, ob Daten übertragen wurden, indem wir im Namensraum der Session nach speziellen Schlüssen suchen, die jedes Unterformular repräsentieren.
Die obigen Methoden erlauben uns eine Schreibweise wie $subForm = $this->getCurrentSubForm(); um das aktuelle Unterformular für die Prüfung zu erhalten, oder $next = $this->getNextSubForm();, um die nächste anzuzeigen. Sehen wir uns nun an, wie die verschiedenen Unterformulare bearbeitet und angezeigt werden können. Wir können getCurrentSubForm() verwenden um herauszufinden ob ein Unterformular übertragen wurde (FALSE Rückgabewerte zeigen an, dass keine angezeigt oder übertragen wurden) und getNextSubForm() empfängt die Form die angezeigt werden soll. Wir können die prepareSubForm() Methode des Formulars verwenden, um sicherzustellen, dass das Formular bereit zur Anzeige ist. Wenn ein Formular übertragen wird, kann das Unterformular bestätigt werden, und dann kann geprüft werden, ob das komplette Formular gültig ist. Um diese Arbeiten durchzuführen werden zusätzliche Methoden benötigt die sicherstellen, dass die übermittelten Daten der Session hinzugefügt werden, und, dass, wenn das komplette Formular geprüft wird, die Prüfung gegen alle Teile der Session durchgeführt wird:
Jetzt, da die Kleinarbeiten aus dem Weg sind, können die Aktionen für diesen Controller erstellt werden. Es wird eine Grundseite für das Formular und dann eine 'process' (Bearbeiten) Aktion für die Bearbeitung des Formulars benötigt.
Wie festzustellen ist, ist der aktuelle Code für die Bearbeitung des Formulars relativ einfach. Wir prüfen, um zu sehen ob wir eine aktuelle Übertragung eines Unterformulars haben, oder nicht, und wir versuchen sie zu prüfen, und sie nochmals darzustellen wenn es fehlschlägt. Wenn das Unterformular gültig ist, muss anschließend geprüft werden, ob das Formular gültig ist, was dann bedeuten würde, dass wir fertig sind; wen nicht muss das nächste Formularsegment angezeigt werden. Letztendlich wird eine Prüfseite mit dem Inhalt der Session angezeigt. Die View Skripte sind sehr einfach:
Kommende Releases des Zend Frameworks werden Komponenten enthalten die mehrseitige Formulare einfacher machen - durch die Abstraktion der Session und der Reihungslogik. In der Zwischenzeit sollte das obige Beispiel als angemessene Grundlage dienen, wie diese Aufgabe für eigene Seiten realisiert werden kann.
|
|