Anfang des InhaltsbereichsHintergrunddokumentation Schritt 1 b) Verwendung von <htmlb:SimpleFormItem> Dokument im Navigationsbaum lokalisieren

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.

Hinweis

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 = me->GET_PREVIOUS_OUT( ).

  out->PRINT_STRING( '<tr><td>' ).      " <tr><td>
  out->PRINT_STRING( label_html ).      " <htmlb:Label/>
  out->PRINT_STRING( '</td><td>' ).     " </td><td>
  out->PRINT_STRING( inputField_html ). " <htmlb:inputField/>
  out->PRINT_STRING( '</td></tr>' ).    " </td></tr>

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,
         label_html      TYPE STRING,
         inputField_html TYPE STRING.

* Add own temporary writer on stack
  my_out = m_page_context->PUSH_WRITER( ).

* <htmlb:Label/>
  ....
  label_html = my_out->GET_CONTENT( ).
  my_out->CLEAR( ).

* <htmlb:inputField/>
  ....
  inputField_html = my_out->GET_CONTENT( ).
  my_out->CLEAR( ).

* Remove my writer from stack
  m_page_context->POP_WRITER( ).

* Copy Text to <sf:SimpleForm>
  DATA:  sf     TYPE REF TO CL_BSP_TUTCMPLX_SIMPLE_FORM.
  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 POP_WRITER().

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.
Die Verarbeitungsweise von BSP-Elementen auf dem Stack wurde dargestellt. Ebenso wurde dargestellt, wie der Output von solch einem Element in einen String geschrieben werden kann, um zu einem späteren Zeitpunkt gerendert zu werden.

Lesen Sie weiter unter Schritt 2: Erstellen von <sf:SimpleForm>

Ende des Inhaltsbereichs