Show TOC

HintergrundSchritt 1 b) Verwendung von <htmlb:SimpleFormItem> Dieses Dokument in der Navigationsstruktur finden

 

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 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.

Ende des Hinweises.

Das einfache Coding wird somit folgendermaßen aussehen:

Syntax Syntax

  1. 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.
    
    
Ende des Codes

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:

Syntax Syntax

  1. 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.
    
    
Ende des Codes

Hierbei sind die folgenden Aspekte von Interesse:

  • Die Verwendung von PUSH_WRITER() am Anfang, um einen zusätzlichen Writer dem Stack hinzuzufügen.

    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().

  • Die Verwendung der Methoden GET_CONTENT(), um den aktuellen herausgeschriebenen String auf dem Output zu extrahieren, und CLEAR(), um sicherzustellen, dass die beiden Elemente in separaten Strings stehen.

  • Die Verwendung der Methode GET_CLASS_NAMED_PARENT(), um eine Referenz auf ein Element zu erhalten, das sich "weiter oben" im Element-Stack befindet.

  • Der Aufruf der der Methoden ADD_ITEM(), die eine lokale, vom Element definierte Methode darstellt.

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>