| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.form.advanced">
- <title>Fortgeschrittene Verwendung von Zend_Form</title>
- <para>
- <classname>Zend_Form</classname> 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.
- </para>
- <sect2 id="zend.form.advanced.arrayNotation">
- <title>Array Schreibweise</title>
- <para>
- Viele 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:
- </para>
- <programlisting language="html"><![CDATA[
- <form>
- <fieldset>
- <legend>Versandadresse</legend>
- <dl>
- <dt><label for="recipient">Versand an:</label></dt>
- <dd><input name="recipient" type="text" value="" /></dd>
- <dt><label for="address">Adresse:</label></dt>
- <dd><input name="address" type="text" value="" /></dd>
- <dt><label for="municipality">Stadt:</label></dt>
- <dd><input name="municipality" type="text" value="" /></dd>
- <dt><label for="province">Bundesland:</label></dt>
- <dd><input name="province" type="text" value="" /></dd>
- <dt><label for="postal">Postleitzahl:</label></dt>
- <dd><input name="postal" type="text" value="" /></dd>
- </dl>
- </fieldset>
- <fieldset>
- <legend>Rechnungsadresse</legend>
- <dl>
- <dt><label for="payer">Rechnung an:</label></dt>
- <dd><input name="payer" type="text" value="" /></dd>
- <dt><label for="address">Adresse:</label></dt>
- <dd><input name="address" type="text" value="" /></dd>
- <dt><label for="municipality">Stadt:</label></dt>
- <dd><input name="municipality" type="text" value="" /></dd>
- <dt><label for="province">Bundesland:</label></dt>
- <dd><input name="province" type="text" value="" /></dd>
- <dt><label for="postal">Postleitzahl:</label></dt>
- <dd><input name="postal" type="text" value="" /></dd>
- </dl>
- </fieldset>
- <dl>
- <dt><label for="terms">Ich stimme den AGBs zu</label></dt>
- <dd><input name="terms" type="checkbox" value="" /></dd>
- <dt></dt>
- <dd><input name="save" type="submit" value="Speichern" /></dd>
- </dl>
- </form>
- ]]></programlisting>
- <para>
- 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:
- </para>
- <programlisting language="html"><![CDATA[
- <form>
- <fieldset>
- <legend>Versandadresse</legend>
- <dl>
- <dt><label for="shipping-recipient">Versand an:</label></dt>
- <dd><input name="shipping[recipient]" id="shipping-recipient"
- type="text" value="" /></dd>
- <dt><label for="shipping-address">Adresse:</label></dt>
- <dd><input name="shipping[address]" id="shipping-address"
- type="text" value="" /></dd>
- <dt><label for="shipping-municipality">Stadt:</label></dt>
- <dd><input name="shipping[municipality]" id="shipping-municipality"
- type="text" value="" /></dd>
- <dt><label for="shipping-province">Bundesland:</label></dt>
- <dd><input name="shipping[province]" id="shipping-province"
- type="text" value="" /></dd>
- <dt><label for="shipping-postal">Postleitzahl:</label></dt>
- <dd><input name="shipping[postal]" id="shipping-postal"
- type="text" value="" /></dd>
- </dl>
- </fieldset>
- <fieldset>
- <legend>Rechnungsadresse</legend>
- <dl>
- <dt><label for="billing-payer">Rechnung an:</label></dt>
- <dd><input name="billing[payer]" id="billing-payer"
- type="text" value="" /></dd>
- <dt><label for="billing-address">Adresse:</label></dt>
- <dd><input name="billing[address]" id="billing-address"
- type="text" value="" /></dd>
- <dt><label for="billing-municipality">Stadt:</label></dt>
- <dd><input name="billing[municipality]" id="billing-municipality"
- type="text" value="" /></dd>
- <dt><label for="billing-province">Bundesland:</label></dt>
- <dd><input name="billing[province]" id="billing-province"
- type="text" value="" /></dd>
- <dt><label for="billing-postal">Postleitzahl:</label></dt>
- <dd><input name="billing[postal]" id="billing-postal"
- type="text" value="" /></dd>
- </dl>
- </fieldset>
- <dl>
- <dt><label for="terms">Ich stimme den AGBs zu</label></dt>
- <dd><input name="terms" type="checkbox" value="" /></dd>
- <dt></dt>
- <dd><input name="save" type="submit" value="Speichern" /></dd>
- </dl>
- </form>
- ]]></programlisting>
- <para>
- 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.
- </para>
- <para>
- <classname>Zend_Form</classname> versucht diesen Prozess mit seinen
- <link linkend="zend.form.forms.subforms">Unterformularen</link> zu automatisieren.
- Standardmäßig werden Unterformulare dargestellt, indem die Array Schreibweise, wie im
- vorherigen <acronym>HTML</acronym> 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
- <classname>Zend_Form</classname> 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.
- </para>
- <para>
- 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:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>Zend_Form::setIsArray($flag)</methodname>: Durch das Setzen dieses
- Flags auf <constant>TRUE</constant>, kann angezeigt werden, dass das komplette
- Formular als Array behandelt werden soll. Standardmäßig wird der Name des
- Formulars als Name des Arrays verwendet, solange
- <methodname>setElementsBelongTo()</methodname> aufgerufen wurde. Wenn das
- Formular keinen Namen spezifiziert hat, oder
- <methodname>setElementsBelongTo()</methodname> nicht gesetzt wurde, wird dieses
- Flag ignoriert (da es kein Arraynamen gibt zu dem die Elemente gehören).
- </para>
- <para>
- Man kann auswählen, ob ein Formular als Array behandelt wird, indem die
- Zugriffsmethode <methodname>isArray()</methodname> verwendet wird.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>Zend_Form::setElementsBelongTo($array)</methodname>: Durch
- Verwendung dieser Methode kann der Name eines Arrays spezifiziert werden dem
- alle Elemente des Formulars angehören. Der Name kann durch Verwendung der
- Zugriffsmethode <methodname>getElementsBelongTo()</methodname> eruiert werden.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Zusätzlich können auf dem Element Level, individuelle Elemente spezifiziert werden die
- bestimmten Arrays angehören indem die
- <methodname>Zend_Form_Element::setBelongsTo()</methodname> Methode verwendet wird. Um
- herauszufinden welcher Wert gesetzt ist -- egal ob dieser explizit gesetzt wurde oder
- implzit über das Formular -- kann die Zugriffsmethode
- <methodname>getBelongsTo()</methodname> verwendet werden.
- </para>
- </sect2>
- <sect2 id="zend.form.advanced.multiPage">
- <title>Mehrseitige Formulare</title>
- <para>
- Aktuell werden mehrseitige Formulare nicht offiziell in <classname>Zend_Form</classname>
- unterstützt; trotzdem ist die meiste Unterstützung für deren Implementierung bereits
- vorhanden und kann mit etwas extra Code angepasst werden.
- </para>
- <para>
- 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.
- </para>
- <example id="zend.form.advanced.multiPage.registration">
- <title>Beispiel: Anmeldeformular</title>
- <para>
- 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.
- </para>
- <para>
- Erstellen wir als erstes unser, eigenes, Formular und definieren in diesem die
- verschiedenen Unterformulare:
- </para>
- <programlisting language="php"><![CDATA[
- class My_Form_Registration extends Zend_Form
- {
- public function init()
- {
- // Erstellt die Benutzer Subform: Benutzername und Passwort
- $user = new Zend_Form_SubForm();
- $user->addElements(array(
- new Zend_Form_Element_Text('username', array(
- 'required' => true,
- 'label' => 'Benutzername:',
- 'filters' => array('StringTrim', 'StringToLower'),
- 'validators' => array(
- 'Alnum',
- array('Regex',
- false,
- array('/^[a-z][a-z0-9]{2,}$/'))
- )
- )),
- new Zend_Form_Element_Password('password', array(
- 'required' => true,
- 'label' => 'Passwort:',
- 'filters' => array('StringTrim'),
- 'validators' => array(
- 'NotEmpty',
- array('StringLength', false, array(6))
- )
- )),
- ));
- // Erstellt die Demographische Subform: Vorname,
- // Familienname und Ort
- $demog = new Zend_Form_SubForm();
- $demog->addElements(array(
- new Zend_Form_Element_Text('givenName', array(
- 'required' => true,
- 'label' => 'Vorname (erster):',
- 'filters' => array('StringTrim'),
- 'validators' => array(
- array('Regex',
- false,
- array('/^[a-z][a-z0-9., \'-]{2,}$/i'))
- )
- )),
- new Zend_Form_Element_Text('familyName', array(
- 'required' => true,
- 'label' => 'Familienname (letzter):',
- 'filters' => array('StringTrim'),
- 'validators' => array(
- array('Regex',
- false,
- array('/^[a-z][a-z0-9., \'-]{2,}$/i'))
- )
- )),
- new Zend_Form_Element_Text('location', array(
- 'required' => true,
- 'label' => 'Der eigene Ort:',
- 'filters' => array('StringTrim'),
- 'validators' => array(
- array('StringLength', false, array(2))
- )
- )),
- ));
- // Erstellt die Mailinglisten Subform
- $listOptions = array(
- 'none' => 'keine Listen bitte',
- 'fw-general' => 'Zend Framework General Liste',
- 'fw-mvc' => 'Zend Framework MVC Liste',
- 'fw-auth' => 'Zend Framework Authentication und ACL Liste',
- 'fw-services' => 'Zend Framework Web Services Liste',
- );
- $lists = new Zend_Form_SubForm();
- $lists->addElements(array(
- new Zend_Form_Element_MultiCheckbox('subscriptions', array(
- 'label' =>
- 'Welche Liste wollen Sie erhalten?',
- 'multiOptions' => $listOptions,
- 'required' => true,
- 'filters' => array('StringTrim'),
- 'validators' => array(
- array('InArray',
- false,
- array(array_keys($listOptions)))
- )
- )),
- ));
- // Die Subformen der Hauptform anhängen
- $this->addSubForms(array(
- 'user' => $user,
- 'demog' => $demog,
- 'lists' => $lists
- ));
- }
- }
- ]]></programlisting>
- <para>
- 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:
- </para>
- <programlisting language="php"><![CDATA[
- class My_Form_Registration extends Zend_Form
- {
- // ...
- /**
- * Eine Subform für die anzeige Vorbereiten
- *
- * @param string|Zend_Form_SubForm $spec
- * @return Zend_Form_SubForm
- */
- public function prepareSubForm($spec)
- {
- if (is_string($spec)) {
- $subForm = $this->{$spec};
- } elseif ($spec instanceof Zend_Form_SubForm) {
- $subForm = $spec;
- } else {
- throw new Exception('Ungültiges Argument an ' .
- __FUNCTION__ . '() übergeben');
- }
- $this->setSubFormDecorators($subForm)
- ->addSubmitButton($subForm)
- ->addSubFormActions($subForm);
- return $subForm;
- }
- /**
- * Form Dekoratore zu einer individuellen Subform hinzufügen
- *
- * @param Zend_Form_SubForm $subForm
- * @return My_Form_Registration
- */
- public function setSubFormDecorators(Zend_Form_SubForm $subForm)
- {
- $subForm->setDecorators(array(
- 'FormElements',
- array('HtmlTag', array('tag' => 'dl',
- 'class' => 'zend_form')),
- 'Form',
- ));
- return $this;
- }
- /**
- * Einen Sendebutton in einer individuellen Subform hinzufügen
- *
- * @param Zend_Form_SubForm $subForm
- * @return My_Form_Registration
- */
- public function addSubmitButton(Zend_Form_SubForm $subForm)
- {
- $subForm->addElement(new Zend_Form_Element_Submit(
- 'save',
- array(
- 'label' => 'Speichern und Fortfahren',
- 'required' => false,
- 'ignore' => true,
- )
- ));
- return $this;
- }
- /**
- * Aktion und Methode der Subform hinzufügen
- *
- * @param Zend_Form_SubForm $subForm
- * @return My_Form_Registration
- */
- public function addSubFormActions(Zend_Form_SubForm $subForm)
- {
- $subForm->setAction('/registration/process')
- ->setMethod('post');
- return $this;
- }
- }
- ]]></programlisting>
- <para>
- 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
- <classname>Zend_Session_Namespace</classname> um Daten zu fixieren, was uns auch
- hilft die Frage zu beantworten welches Formular zu übertragen ist.
- </para>
- <para>
- Erstellen wir also unseren Controller, und fügen eine Methode für den Empfang der
- Formular Instanz hinzu:
- </para>
- <programlisting language="php"><![CDATA[
- class RegistrationController extends Zend_Controller_Action
- {
- protected $_form;
- public function getForm()
- {
- if (null === $this->_form) {
- $this->_form = new My_Form_Registration();
- }
- return $this->_form;
- }
- }
- ]]></programlisting>
- <para>
- 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.
- </para>
- <programlisting language="php"><![CDATA[
- class RegistrationController extends Zend_Controller_Action
- {
- // ...
- protected $_namespace = 'RegistrationController';
- protected $_session;
- /**
- * Den Session Namespace erhalten den wir verwenden
- *
- * @return Zend_Session_Namespace
- */
- public function getSessionNamespace()
- {
- if (null === $this->_session) {
- $this->_session =
- new Zend_Session_Namespace($this->_namespace);
- }
- return $this->_session;
- }
- /**
- * Eine Liste von bereits in der Session gespeicherten Forms erhalten
- *
- * @return array
- */
- public function getStoredForms()
- {
- $stored = array();
- foreach ($this->getSessionNamespace() as $key => $value) {
- $stored[] = $key;
- }
- return $stored;
- }
- /**
- * Eine Liste aller vorhandenen Subforms erhalten
- *
- * @return array
- */
- public function getPotentialForms()
- {
- return array_keys($this->getForm()->getSubForms());
- }
- /**
- * Welche Subform wurde übermittelt?
- *
- * @return false|Zend_Form_SubForm
- */
- public function getCurrentSubForm()
- {
- $request = $this->getRequest();
- if (!$request->isPost()) {
- return false;
- }
- foreach ($this->getPotentialForms() as $name) {
- if ($data = $request->getPost($name, false)) {
- if (is_array($data)) {
- return $this->getForm()->getSubForm($name);
- break;
- }
- }
- }
- return false;
- }
- /**
- * Die nächste Suboform für die Anzeige erhalten
- *
- * @return Zend_Form_SubForm|false
- */
- public function getNextSubForm()
- {
- $storedForms = $this->getStoredForms();
- $potentialForms = $this->getPotentialForms();
- foreach ($potentialForms as $name) {
- if (!in_array($name, $storedForms)) {
- return $this->getForm()->getSubForm($name);
- }
- }
- return false;
- }
- }
- ]]></programlisting>
- <para>
- Die obigen Methoden erlauben uns eine Schreibweise wie
- <command>$subForm = $this->getCurrentSubForm();</command> um das aktuelle
- Unterformular für die Prüfung zu erhalten, oder
- <command>$next = $this->getNextSubForm();</command>, um die nächste anzuzeigen.
- </para>
- <para>
- Sehen wir uns nun an, wie die verschiedenen Unterformulare bearbeitet und angezeigt
- werden können. Wir können <methodname>getCurrentSubForm()</methodname> verwenden um
- herauszufinden ob ein Unterformular übertragen wurde (<constant>FALSE</constant>
- Rückgabewerte zeigen an, dass keine angezeigt oder übertragen wurden) und
- <methodname>getNextSubForm()</methodname> empfängt die Form die angezeigt werden
- soll. Wir können die <methodname>prepareSubForm()</methodname> Methode des
- Formulars verwenden, um sicherzustellen, dass das Formular bereit zur Anzeige ist.
- </para>
- <para>
- 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:
- </para>
- <programlisting language="php"><![CDATA[
- class RegistrationController extends Zend_Form
- {
- // ...
- /**
- * Ist die Form gültig?
- *
- * @param Zend_Form_SubForm $subForm
- * @param array $data
- * @return bool
- */
- public function subFormIsValid(Zend_Form_SubForm $subForm,
- array $data)
- {
- $name = $subForm->getName();
- if ($subForm->isValid($data)) {
- $this->getSessionNamespace()->$name = $subForm->getValues();
- return true;
- }
- return false;
- }
- /**
- * Ist die komplette Form gültig?
- *
- * @return bool
- */
- public function formIsValid()
- {
- $data = array();
- foreach ($this->getSessionNamespace() as $key => $info) {
- $data[$key] = $info;
- }
- return $this->getForm()->isValid($data);
- }
- }
- ]]></programlisting>
- <para>
- 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.
- </para>
- <programlisting language="php"><![CDATA[
- class RegistrationController extends Zend_Controller_Action
- {
- // ...
- public function indexAction()
- {
- // Entweder die aktuelle Seite nochmals anzeigen, oder
- // die nächste "next" (erste) Subform holen
- if (!$form = $this->getCurrentSubForm()) {
- $form = $this->getNextSubForm();
- }
- $this->view->form = $this->getForm()->prepareSubForm($form);
- }
- public function processAction()
- {
- if (!$form = $this->getCurrentSubForm()) {
- return $this->_forward('index');
- }
- if (!$this->subFormIsValid($form,
- $this->getRequest()->getPost())) {
- $this->view->form = $this->getForm()->prepareSubForm($form);
- return $this->render('index');
- }
- if (!$this->formIsValid()) {
- $form = $this->getNextSubForm();
- $this->view->form = $this->getForm()->prepareSubForm($form);
- return $this->render('index');
- }
- // Gültige Form!
- // Information in einer Prüfseite darstellen
- $this->view->info = $this->getSessionNamespace();
- $this->render('verification');
- }
- }
- ]]></programlisting>
- <para>
- 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.
- </para>
- <para>
- Die View Skripte sind sehr einfach:
- </para>
- <programlisting language="php"><![CDATA[
- <?php // registration/index.phtml ?>
- <h2>Registration</h2>
- <?php echo $this->form ?>
- <?php // registration/verification.phtml ?>
- <h2>Danke für die Registrierung!</h2>
- <p>
- Hier sind die angegebenen Informationen:
- </p>
- <?
- // Dieses Konstrukt muß getan werden wegen dem Weg wie Elemente
- // im Session Namespace gespeichert werden
- foreach ($this->info as $info):
- foreach ($info as $form => $data): ?>
- <h4><?php echo ucfirst($form) ?>:</h4>
- <dl>
- <?php foreach ($data as $key => $value): ?>
- <dt><?php echo ucfirst($key) ?></dt>
- <?php if (is_array($value)):
- foreach ($value as $label => $val): ?>
- <dd><?php echo $val ?></dd>
- <?php endforeach;
- else: ?>
- <dd><?php echo $this->escape($value) ?></dd>
- <?php endif;
- endforeach; ?>
- </dl>
- <?php endforeach;
- endforeach ?>
- ]]></programlisting>
- <para>
- 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.
- </para>
- </example>
- </sect2>
- </sect1>
|