Erstellung und Darstellung von kombinierten ElementenIm letzten Abschnitt, hatten wir ein Beispiel welches ein "Element für das Geburtsdatum" gezeigt hat:
Wie könnte man dieses Element als Zend_Form_Element Element darstellen? Wie kann man einen Decoratpr schreiben um es darzustellen? Das ElementDie Fragen darüber wie das Element arbeiten würde beinhalten:
Die ersten zwei Fragen drehen sich um das Formularelement selbst: Wie würden setValue() und getValue() arbeiten? Es gibt aktuell eine weitere implizite Frage durch die Frage über den Decorator: Wie würde man getrennte Datenabschnitte vom Element empfangen und/oder setzen? Die Lösung besteht darin die setValue() Methode des Elements zu überladen um eigene Logik anzubieten. In diesem speziellen Fall sollte unser Element drei getrennte Verhalten haben:
Intern werden Tag, Monat und Jahr getrennt gespeichert. Wenn der Wert des Elements empfangen wird, wird das in einem normalisierten String Format getan. Wir überschreiben getValue() und ordnen die getrennten Datenabschnitte dem endgültigen String zu. So würde die Klasse aussehen:
Diese Klasse bietet einige nette Flexibilitäten -- wir können Standardwerte von unserer Datenbank setzen, und sicher sein das der Wert richtig gespeichert und dargestellt wird. Zusätzlich können wir erlauben den Wert von einem Array zu setzen welches über die Formulareingabe übergebenen wurde. Letztendlich haben wir getrennte Zugriffe für jeden Datenabschnitt, welche wir jetzt in einem Decorator verwenden können um ein kombiniertes Element zu erstellen. Der DecoratorBei der erneuten Betrachtung des Beispiels im letzten Abschnitt, nehmen wir wir an dass wir wollen das unsere Benutzer Jahr, Monat und Tag separat eingeben. PHP erlaubt es uns glücklicherweise die Array Schreibweise zu verwenden wenn Elemente erstellt werden, deshalb ist es möglich diese drei Entitäten in einem einzelnen Wert zu fangen -- und wir erstellen jetzt ein Zend_Form Element das solch einen Array Wert verarbeiten kann. Der Decorator ist relativ einfach: er holt Tag, Monat und Jahr vom Element, und übergibt jedes einem eigenen View Helfer um die individuellen Formular Eingaben darzustellen; diese werden dann für das endgültige Markup gesammelt.
Jetzt müssen wir kleinere Änderungen an unserem Formular Element durchführen und Ihm sagen das wir den obigen Decorator als Standard verwenden wollen. Das benötigt zwei Schritte. Erstens müssen wir das Element über den Pfad des Decorators informieren. Wir können das im Constructor tun:
Es ist zu beachten dass das im Constructor getan wird und nicht in init(). Es gibt hierfür zwei Gründe. Erstens erlaubt dies das Element später zu erweitern um Logik in init hinzuzufügen ohne das man sich Gedanken über den Aufruf von parent::init() machen muss. Zweitens erlaubt es zusätzliche Plugin Pfade über die Konfiguration zu übergeben oder in einer init Methode die dann das Überladen des standardmäßigen Date Decorators mit einem eigenen Ersatz erlaubt. Als nächstes überladen wir die loadDefaultDecorators() Methode um unseren neuen Date Decorator zu verwenden:
Wie sieht die endgültige Ausgabe aus=? Nehmen wir das folgende Element an:
Wenn man dieses Element ausgibt erhält man das folgende Markup (mit einigen wenigen Modifikationen an Leerzeichen für die Lesbarkeit):
ZusammenfassungWir haben jetzt ein Element das mehrere zusammengehörende Formular Eingabefelder darstellen kann, und die getrennten Felder anschließend als einzelne Entität behandelt -- das Element dateOfBirth wird als Array an das Element übergeben, und das Element wird anschließend, wie vorher erwähnt, die passenden Datenabschnitte erstellen und einen Wert zurückgeben den wir für die meisten Backends verwenden können. Zusätzlich können wir verschiedene Decoratore mit dem Element verwenden. Wenn wir einen » Dojo DateTextBox Dijit Decorator verwenden wollen -- welche Stringwerte akzeptiert und zurückgibt -- können wir das ohne Änderung des Elements selbst durchführen. Am Ende erhält man eine einheitliche API für ein Element welche man verwenden kann um ein Element zu beschreiben welches einen kombinierten Wert repräsentiert.
|