Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 17 HTML
  gp 17.1 HTML_BBCodeParser
  gp 17.2 HTML_Crypt
  gp 17.3 HTML_Page2
    gp 17.3.1 Methoden zur Manipulation des Heads
    gp 17.3.2 Methoden zur Manipulation des Bodys
    gp 17.3.3 Ausgabe der HTML-Daten
  gp 17.4 HTML_CSS
    gp 17.4.1 Ausgabe des Stylesheets
  gp 17.5 HTML_Javascript
  gp 17.6 HTML_Template_IT
  gp 17.7 HTML_Template_Flexy
    gp 17.7.1 Fomulare in Flexy
    gp 17.7.2 Plugins
  gp 17.8 HTML_Form
  gp 17.9 HTML_QuickForm
    gp 17.9.1 Standard-Formularelemente
    gp 17.9.2 Erweiterte Formularelemente
    gp 17.9.3 Gruppen
    gp 17.9.4 Verarbeitung des Formulars
    gp 17.9.5 Filter
    gp 17.9.6 Serverseitige Validierung
    gp 17.9.7 Clientseitige Validierung
    gp 17.9.8 Datei-Uploads
    gp 17.9.9 Templates
  gp 17.10 HTML_QuickForm_Controller
  gp 17.11 HTML_Menu
  gp 17.12 HTML_TreeMenu
  gp 17.13 HTML_Progress
  gp 17.14 HTML_Table
  gp 17.15 HTML_Table_Matrix
  gp 17.16 Pager


Rheinwerk Computing

17.10 HTML_QuickForm_Controller  toptop


Besprochene Version: 1.0.4 Lizenz: PHP-Lizenz
Klassendatei(en): HTML/QuickForm/Controller.php; HTML/QuickForm/Page.php; HTML/QuickForm/Action/Submit.php; HTML/QuickForm/Action/Display.php; HTML/QuickForm/Action/Direct.php; HTML/QuickForm/Action/Jump.php; HTML/ QuickForm/Action/Next.php; HTML/QuickForm/Action/Back.php

HTML_QuickForm ist ein sehr leistungsfähiges Paket für die Erstellung und Verarbeitung von Formularen. Erfordert Ihre Problemstellung allerdings ein Formular, das über mehrere Seiten geht, bietet QuickForm Ihnen keine Möglichkeit, die einzelnen Werte zwischenzuspeichern. Natürlich können Sie diese auch selbst in Sessions ablegen, aber es ist deutlich einfacher, an dieser Stelle auf HTML_QuickForm_Controller zurückzugreifen.

Das Paket gibt Ihnen die Möglichkeit, mehrere verschiedene Formulare in einer Datei elegant zu kombinieren und sicherzustellen, dass Werte, die eingegeben wurden, nicht verloren gehen. Hierbei stellt auch ein Vor- und Zurückblättern kein Problem dar. Zugegebenermaßen ist die Arbeit mit dem Paket nicht immer ganz trivial, da Funktionalitäten von HTML_QuickForm überschrieben werden müssen.

Für jedes Formular wird eine eigene Klasse angelegt, die die Klasse HTML_QuickForm_Page erweitert und die dort enthaltene Methode buildForm() überschreiben muss. Die Methode buildForm() ist eine Art Container, in der ein einzelnes Formular verwaltet wird. In der Methode muss allerdings kein neues HTML_QuickForm-Objekt instanziiert werden. Um die Methoden nutzen zu können, die zum Hinzufügen von Elementen, Regeln und Filtern dienen, greifen Sie auf $this zurück.

In der Methode muss die Eigenschaft _formBuilt mit dem Wert true belegt werden, um zu verdeutlichen, dass das Formular bereits einmal ausgegeben wurde. Beim Aufbau des Formulars können Sie alle Methoden nutzen, die in Abschnitt 17.9 beschrieben wurden. Allerdings können Sie hier noch keine Templates zuweisen.

Um HTML_QuickForm_Controller die Möglichkeit zu geben, die Formulare korrekt verwalten zu können, müssen Sie für das Vor- und Zurückblättern Submit-Buttons vorsehen. Um einen Button zum Vorwärtsblättern zu integrieren, nutzen Sie beispielsweise folgende Zeile:

$this->addElement('submit', $this->getButtonName('next'), 
                                                 'Weiter >>');

Der Name des Buttons wird durch die Methode getButtonName() generiert und kann nicht selbst vergeben werden. Um vor- und zurückblättern zu können, benötigen Sie zwei Buttons. Wenn Sie diese zu einer Gruppe zusammenfassen, darf die Gruppe keinen Namen haben.

$navi[] = $this->createElement('submit', 
                               $this->getButtonName('back'), 
                               '<< Zur&uuml;ck'); 
$navi[] = $this->createElement('submit', 
                   $this->getButtonName('next'), 'Weiter >>'); 
$this->addGroup($navi, null, '', '&nbsp;');

Übergeben Sie der Gruppe einen Namen, werden Sie feststellen, dass Sie nicht zum vorhergehenden Formular zurückgelangen können. Wie Sie sehen, bekommt die Methode getButtonName() entweder die Konstante 'back' oder 'next' übergeben. Dies legt die Funktionalität des Buttons fest. Anstelle von Buttons können Sie natürlich auch auf Grafiken, also <input type ="image" ... />, zurückgreifen.

Blättern Sie von einem Formular zum anderen, so werden die eingegebenen Werte in einer Session abgelegt, die Sie selbst starten müssen, so dass ein einmal eingegebener Wert nicht verloren geht. Zusätzlich muss in jedem Formular definiert werden, welche »Aktion« auszuführen ist, wenn es abgeschickt wird, ohne dass einer der Buttons genutzt wurde. In Listing 17.24 finden Sie ein Beispiel, in dem in einem ersten Formular der Vorname und in einem zweiten der Nachname erfragt wird.

<?php 
require_once 'HTML/QuickForm/Controller.php'; 
require_once 'HTML/QuickForm/Action/Display.php'; 
 
// Session starten 
session_start(); 
 
// Klasse zur Ausgabe der ersten Seite 
class Form_Vorname extends HTML_QuickForm_Page 
{ 
   // buildForm gibt das eigentliche Formular aus 
   public function buildForm() 
   { 
      //Speichern, dass das Formular aufgerufen wurde 
      $this->_formBuilt = true; 
 
      // Formular konstruieren 
      $this->addElement('text', 'vorname', 'Ihr Vorname:'); 
      $this->addElement('submit', 
                   $this->getButtonName('next'), 'Weiter >>'); 
 
      // Regel hinzufuegen 
      $this->addRule('vorname','Vorname erforderlich', 
                                                 'required'); 
      // Legt fest, was passieren soll, wenn das Formular nicht 
      // ueber den Submit-Button abgeschickt wird. 
      $this->setDefaultAction('next'); 
   } 
} 
 
// Klasse fuer die zweite Seite 
class Form_Nachname extends HTML_QuickForm_Page 
{ 
   function buildForm() 
   { 
      $this->_formBuilt = true; 
      $this->addElement('text', 'nachname', 'Ihr Nachname:'); 
 
      //Buttons hinzufuegen 
      $navi[] = $this->createElement('submit', 
                   $this->getButtonName('back'), 
                   '<< Zur&uuml;ck'); 
      $navi[] = $this->createElement('submit', 
                   $this->getButtonName('next'), 'Fertig'); 
      $this->addGroup($navi, null, '', '&nbsp;'); 
 
      $this->addRule('nachname', 'Der Nachname ist 
                                   erforderlich', 'required'); 
      $this->setDefaultAction('next'); 
   } 
} 
 
// Klasse zur Ausgabe der Formulare 
class ActionDisplay extends HTML_QuickForm_Action_Display 
{ 
   // Methode _renderForm() ueberschreiben 
   public function _renderForm($page) 
   { 
      // Neuen Renderer ableiten 
      $renderer = $page->defaultRenderer(); 
 
    // RequiredNote setzen; hier koennen auch 
    // Templates zugewiesen werden 
    $page->setRequiredNote('<span style="color:F00">*</span> 
                                         Feld erforderlich.'); 
      // Renderer-Objekt an ActionDisplay uebergeben 
      $page->accept($renderer); 
      echo $renderer->toHtml(); 
   } 
} 
 
// Klasse zur Verarbeitung der Formulare 
class ActionProcess extends HTML_QuickForm_Action 
{ 
   // Methode zum Verarbeiten der Daten 
   function perform($page, $actionName) 
   { 
      // Auslesen der Daten 
      $values = $page->controller->exportValues(); 
      echo 'Die Eingaben lauteten:<pre>'; 
      var_dump($values); 
      echo '</pre>'; 
   } 
} 
 
// Neue Formular-Objekte mit eindeutigem Namen ableiten 
$seite1 = new Form_Vorname('seite1'); 
$seite2 = new Form_Nachname('seite2'); 
 
// Neues Controller-Objekt ableiten 
$controller = new HTML_QuickForm_Controller('namen', true); 
 
// Formularseiten hinzufuegen 
$controller->addPage($seite1); 
$controller->addPage($seite2); 
 
// Aktionen hinzufuegen 
$controller->addAction('display', new ActionDisplay()); 
$controller->addAction('process', new ActionProcess()); 
 
// Controller ausfuehren 
$controller->run(); 
?>

Listing 17.24 Ausgabe eines einfachen Formulars mit QuickForm_Controller

Zusätzlich zu den Klassen für die Formulare müssen Sie noch die Klassen HTML_QuickForm_Action_Display und HTML_QuickForm_Action erweitern. Genauer gesagt muss die Klasse HTML_QuickForm_Action_Display nicht wirklich erweitert werden. In dieser Klasse müssen Sie die Methode _renderForm() nur dann überschreiben, wenn Sie eigene Templates verwenden wollen oder den Hinweis, dass eine Eingabe erforderlich ist, durch einen eigenen ersetzen wollen. Dabei ist es wichtig, dass Sie die Schritte, die in Listing 17.24 zu finden sind, mit aufgreifen. Das heißt, es muss ein Renderer-Objekt abgeleitet und der Seite zugewiesen werden. Der Aufruf der Methode setRequiredNote() ist optional.

Bei der Erweiterung der Klasse HTML_QuickForm_Action muss die Methode perform() überschrieben werden. Sie wird genutzt, um die Daten nach Ende der eigentlichen Abfragen zu verarbeiten. Die eingegebenen Informationen stellt $page->controller->exportValues() Ihnen zur Verfügung. Die exportValues()-Methode des enthaltenen Controller-Objekts liest die Eingaben aus der Session aus und gibt sie in einem Array zurück. In diesem Beispiel sieht der Aufbau des Arrays folgendermaßen aus:

array(2) { 
  ["vorname"]=> 
  string(7) "Carsten" 
  ["nachname"]=> 
  string(6) "Möhrke" 
}

Die Feldnamen dienen direkt als Schlüssel, ohne dass die Namen der Seiten zusätzlich einfließen.

Nachdem Sie die Klassen und Methoden erstellt haben, können Sie das eigentliche »Hauptprogramm« aufbauen. Um die einzelnen Formulare nutzen zu können, müssen Sie Objekte aus den dazugehörigen Klassen ableiten. Diese müssen einem HTML_QuickForm_Controller-Objekt zugewiesen werden. Dem Konstruktor dieses Objekts übergeben Sie zuerst einen eindeutigen Namen. Dieser ist insbesondere dann notwendig, wenn Sie mehrere Controller-Objekte in einer Datei verwenden, da diese anhand ihres Namens unterschieden werden. Der zweite Wert ist eine boolesche Konstante. Mit dieser definieren Sie, ob der Benutzer nur dann von einem Formular zum nächsten kommen kann, wenn die Regeln erfüllt werden (true). Wenn Sie ein false übergeben, werden die Regeln nicht geprüft.

Die einzelnen »Formular-Objekte« werden jeweils mit addPage() an das Controller-Objekt übergeben.

Zu guter Letzt werden noch den einzelnen Aktionen die neu erstellten Klassen zugewiesen. Das heißt, die Aktion 'display' bekommt mit $controller->addAction('display', new ActionDisplay()) die Klasse ActionDisplay zugewiesen. Auch diese Zeile ist nur dann notwendig, wenn der Darstellungsprozess durch Einsatz von Templates o. Ä. verändert werden soll. Der Aktion 'process' muss jedoch die Klasse zugewiesen werden, die die Daten verarbeiten soll. Andernfalls würden die Daten nicht ausgewertet, was das Formular ad absurdum führen würde. In der letzten Zeile von Listing 17.24 wird die Verarbeitung der Daten dann schließlich mit der Methode run() gestartet.

Das ist nur ein relativ kurzer Abriss dessen, was HTML_QuickForm_Controller leisten kann. Aus Platzgründen ist es hier aber nicht möglich, komplexere Beispiele zu bringen. So ist es beispielsweise möglich, das Erscheinungsbild des zweiten Formulars von den Eingaben im ersten abhängig zu machen. Dazu ist es dann allerdings notwendig, die Klassen für die Aktionen 'next' und 'back' zu überschreiben. Hierzu sind allerdings gute Beispiele in dem Archiv des Pakets enthalten.

 <<   zurück
     
  Zum Katalog
Zum Katalog: PHP PEAR
PHP PEAR
Jetzt bestellen!
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Katalog: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Katalog: Responsive Webdesign






 Responsive Webdesign


Zum Katalog: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Katalog: MySQL 5.6






 MySQL 5.6


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de