
Schritt 1 b) Verwendung von <htmlb:SimpleFormItem> 
Das Element
<sf:SimpleFormItem> ist implementiert und damit einsatzfähig. Allerdings muss nun berücksichtigt werden, dass jeder Eintrag direkt in den aktuellen Output-Stream gerendert wird. Bei der späteren Verwendung von <htmlb:gridLayout> wird ein Zähler für die genaue Anzahl der Felder benötigt, so dass das gridLayout und natürlich auch jede einzelne Zelle korrekt konfiguriert werden können. Das bedeutet, dass Einträge zuerst gezählt und dann später gerendert werden.Dies wird am besten dadurch erreicht, dass die Elemente
<htmlb:label> und <htmlb:inputField> sofort gerendert werden, allerdings nicht in den Output-Stream. Stattdessen werden diese Elemente in separate Writer gerendert, in denen der Content abgelegt und die Einträge gezählt werden und über die schließlich gerendert wird.Um dies zu realisieren, muss der Eintrag derart geändert werden, dass er in einen String rendert und der String wird für das spätere Rendering an
<sf:SimpleForm> weitergereicht.Dem Element
<sf:SimpleForm> wird eine neue Methode ADD_ITEM hinzugefügt, mit den zwei Parameters label_html und inputField_html, die beide vom Typ String sind.
Es ist möglich, den BSP-Elementhandlern zusätzliche Methoden hinzuzufügen, die zusätzliche Funktionalität implementieren, welche wiederum von „geringeren" Elementen verwendet werden kann. Die Elementhandler-Klassen sind normale ABAP-Klassen, die in der Workbench bearbeitet werden können.
Das einfache Coding wird somit folgendermaßen aussehen:
|
method ADD_ITEM . DATA: out TYPE REF TO IF_BSP_WRITER. out->PRINT_STRING( '<tr><td>' ). " <tr><td> endmethod. |
Die einzige Aufgabe von
ADD_ITEM ist momentan das sofortige Rendering des Strings.Im nächsten Schritt wird das Coding innerhalb von
<sf:SimpleFormItem> verändert. Für jedes interne Element, das verwendet wird, darf die Ausgabe des Elements auf keinen Fall auf den aktuellen Writer geschrieben werden. Dies kann dadurch realisiert werden, dass ein neuer Writer auf den Stack geschoben wird. Daraufhin werden alle neuen Elemente auf diesen neuen Writer schreiben, und aus diesem neuen Writer kann zu gegebenem Zeitpunkt dann der Content extrahiert werden.Das geänderte Coding sieht folgendermaßen aus:
|
method IF_BSP_ELEMENT~DO_AT_BEGINNING . DATA: my_out TYPE REF TO IF_BSP_WRITER, * Add own temporary writer on stack * <htmlb:Label/> my_out->CLEAR( ). * <htmlb:inputField/> my_out->CLEAR( ). * Remove my writer from stack * Copy Text to <sf:SimpleForm> sf ?= me->GET_CLASS_NAMED_PARENT( 'CL_BSP_TUTCMPLX_SIMPLE_FORM' ). sf->ADD_ITEM( label_html = label_html inputField_html = inputField_html ). rc = CO_ELEMENT_DONE. endmethod. |
Hierbei sind die folgenden Aspekte von Interesse:
Alle neuen Elemente, die nun verarbeitet werden, schreiben auf den obersten Writer des Stacks. Am Ende dieser Methode muss dieser zusätzliche Writer wieder vom Stack entfernt werden, und zwar mit der Methode
Nun kann die Seite
after.htm wieder ausgeführt werden, um sicherzustellen, dass sie auch weiterhin korrekt läuft.Mit dieser Änderung ist das Element
<sf:SimpleFormItem> abgeschlossen.Lesen Sie weiter unter
Schritt 2: Erstellen von <sf:SimpleForm>