PEAR-Handbuch | ||
---|---|---|
Zurück | Nach vorne |
Das Package implementiert einen PageController-Design-Pattern, was grundsätzlich bedeutet, dass eine einzelne Seite verschiedene Requests und Aktionen verarbeitet abhängig von den Parametern die per GET- oder Post-Request übermittelt wurden. Das Pattern wird ausführlich auf Martin Fowler's Website und der WACT-Projekt-Webseite beschrieben.
Was bedeutet das in Hinblick auf QuickForm: wir haben ein einzelnes Skript, das verschiedene Formulare darstellt und validieren kann, abhängig von den Daten der Parameter des Request. Damit können Sie leicht komplexe Formulare aufbauen, die aus verschiedenen Seiten bestehen, wie z.B. Wizards.
Die typische Implementierung des PageController-Pattern sieht so aus:
switch ($_REQUEST['action']) { case 'foo': doFoo(); break; case 'bar': doBar(); break; default: echo 'Hello, world!'; } |
HTML_QuickForm_Controller: Diese Klasse extrahiert den Namen der Aktion des Request und ruft den entsprechenden Handler. Es enthält verschiedene Seiten.
HTML_QuickForm_Page: Diese Klasse stellt eine einzelne Seite eines Formulars dar, sie erweitert die Klasse HTML_QuickForm.
HTML_QuickForm_Action: Diese Klassse implementiert das Command-Design-Patttern, prinzipell ist es ein OO-Callback.
Session-Initialisierung: Dieses Beispiel verwendet keine Sessions, da keine Daten zwischen den Sitenaufrufen gesichert werden müssen. Sessions sind aber erforderlich, wenn real mehrseitige Formulare verwendet werden sollen. HTML_QuickForm_Controller startet nicht automatisch eine Session, die Funktion session_start() muss in solchen Fällen aufgerufen werden, bevor ein entsprechendes Objekt dieser Klasse erzeugt wird.
Um die Funktionen des Packages einfacher zu verstehen, nehmen wir das Bispielformular aus dem HTML_QuickForm tutorial und implementieren es auf Basis von HTML_QuickForm_Controller:
Beispiel 42-1. Basis Controller-Benutzung
|
Es fällt auf, das der Code wesentlich umfangreicher ist, als das Original. Tatsächlich müssen wir nur drei Klassen von HTML_QuickForm_Page ableiten, um einen dreiseitigen Wizard zu erzeugen, den 'process'-Eventhandler basierend auf HTML_QuickForm_Action implementieren und zum Controller hinzufügen. Ohne den Controller wäre der Programmieraufwand bedeutend höher.
Sie müssen HTML_QuickForm_Page ableiten und die Methode buildForm() überschreiben. Der Inhalt ist weitgehend selbsterklärend, wenn Sie mit QuickForm vertraut sind, mit Ausnahme einiger Kleinigkeiten:
$this->_formBuilt = true; |
Die zweite interessante Zeile ist
$this->addElement('submit', $this->getButtonName('submit'), 'Send'); |
Die dritte Sache ist
$this->setDefaultAction('submit'); |
Normalerweise müssen Sie Handler für zwei Aktionen implementieren: 'process' und 'display'. Über das Erste kann hier keine Aussage gemacht werden, schließlich ist die Verarbeitung applikationsspezifisch. Für zweite Aktion leiten sie eine Klasse von HTML_QuickForm_Action_Display ab und überschreiben dessen _renderForm()-Methode, um den entsprechenden Renderer aufzurufen und dir Formularausgabe anzupassen.
Als nächstes erzeugen wir ein Objekt unser obigen Page-Klasse.
$page =& new FirstPage('firstForm'); |
$page->addAction('process', new ActionProcess()); |
Jetzt holen wir ein neues Controller-Objekt:
$controller =& new HTML_QuickForm_Controller('tutorial'); |
Weiter setzen wir die Standardwerte für das Formular und fügen die Seite hinzu.
$controller->setDefaults(array( 'name' => 'Joe User' )); $controller->addPage($page); |
Zum Schluß rufen wir die Controller-Methode run() auf:
$controller->run(); |
... befinden Sie im Package-Archiv. Zusätzlich zum bereits gezeigten Beispiel, existieren zwei Beispiel für mehrseitige Formulare:
Wizard: Formularseiten enthalten 'Next'- und 'Back'-Buttons und es kann nicht zur nächsten Seite nicht gewechselt werden, solange die jeweilige Seite nicht korrekt ausgefüllt wurde.
Karteireiter-Dialoge ("Tabbed form"): Formular das aus verschiedenen Seiten besteht und Buttons besitzen, um direkt auf eine bestimmte Seite zu springen. Das Formular ist erst dann gültig, wenn der überall verfügbare 'Submit'-Button gedrückt wurde.
Zurück | Zum Anfang | Nach vorne |
HTML_QuickForm_Controller | Nach oben | FAQ |