Anfang des InhaltsbereichsVorgehensweisen Controller result.do für die Ergebnisliste anlegen Dokument im Navigationsbaum lokalisieren

Verwendung

Dieser Controller steuert die Ergebnisliste Ihrer Suche, die innerhalb eines HTMLB-TableView ausgegeben werden soll. Wird ein Buch der Ergebnisliste dann angeklickt, sollen zu diesem Buch im unteren Teil der Seite Detaildaten angezeigt werden (vgl. Controller detail.do für die Detailanzeige anlegen und View detail.htm für die Detailanzeige anlegen).

Vorgehensweise

Dies ist der schwierigste View, weil neben den Methoden DO_REQUEST und DO_HANDLE_EVENT auch noch die Methode IF_HTMLB_TABLEVIEW_ITERATOR~RENDER_CELL_START überschrieben werden muss. Die Struktur vom Typ BSBOOKDATA, die ein gefundenes Buch repräsentiert, enthält neben normalen String-Feldern für Titel, Untertitel, Verlag etc. noch eine interne Tabelle (Typ AUTHORTAB) der Autoren, da ein Buch ja mehrere Autoren haben kann (vgl. StrukturlinkDatenmodell für die Bookshop-Tutorials). Diese interne Tabelle lässt sich im Rahmen einer Spalte im TableView nur mittels Custom-Rendering.Funktionen darstellen. Diese werden wir im 2. Schritt durchführen: Custom-Rendering für die Autorenspalte erarbeiten.

Zunächst werden wir die Methoden DO_REQUEST und DO_HANDLE_EVENT überschreiben und die benötigten Attribute zur Controller-Klasse hinzufügen.

Die Methode DO_REQUEST wird ausgeführt, wenn der Controller aufgerufen wird (hier in dem Haupt-View default.htm), die Methode DO_HANDLE_EVENT wird bei Eintreten eines Events (das Anklicken eines Tabelleneintrags) aufgerufen.

Methode DO_REQUEST

Das Coding für diese Methode sieht so aus:

method DO_REQUEST .

  data: result_view type ref to if_bsp_page.

  data: main_controller type ref to cl_bsp_controller2.

  data: search_controller type ref to CL_BSP_TUT_SEARCH.

  data: isbn_tab type isbn_tab.

  data: bookcat_tab type BSBOOKCAT_TAB.

* get reference to search_controller

  main_controller ?= m_parent.

  if main_controller is bound.

    search_controller ?= main_controller->get_controller(

                         controller_id = 'search' ).

    if search_controller is bound.

      isbn_tab = search_controller->isbn_tab.

    endif.

  endif.

  if isbn_tab is not initial.

    CALL METHOD cl_book_shop=>get_book_data

      EXPORTING

        isbn_tab          = isbn_tab

      IMPORTING

        bookcat_tab       = bookcat_tab

      EXCEPTIONS

        empty_input_table = 2

        invalid_isbn = 4.

  else.

    clear me->cata_id.

  endif.

  me->bookcat_tab = bookcat_tab.

  result_view = create_view( view_name = 'result.htm' ).

  result_view->set_attribute(

               name = 'bookcat_tab'

               value = bookcat_tab ).

  result_view->set_attribute( name = 'iterator' value = me ).

  call_view( result_view ).

endmethod.

Als erstes ist zu beachten, wie sich der Controller die Informationen von dem Controller der Suche search.do beschafft. Hierzu muss er sich über den Haupt-Controller die Referenz zum search-Controller besorgen und dann von diesem die ISBN-Tabelle der gefundenen Bücher übernehmen.

Anschließend wird mit der selben Methode wie im alten Tutorial StrukturlinkUnser erster Online-Buchladen aus der ISBN-Tabelle eine Tabelle mit allen Daten der gefundenen Bücher erzeugt.

Zuletzt wird der zugehörige View result.htm aufgerufen. Diesem müssen als Attribute neben der Struktur mit den Buchdaten noch ein Iterator mitgegeben werden. Der Iterator wird für das Custom-Rendering der Autorenspalte benötigt (vgl. Custom-Rendering für die Autorenspalte erarbeiten).

Methode DO_HANDLE_EVENT

Diese Methode enthält folgendes Coding:

method DO_HANDLE_EVENT .

  class cl_book_shop definition load.

  DATA: table_event type ref to CL_HTMLB_EVENT_TABLEVIEW.

  data bookcat_tab type bsbookcat_tab.

  data wa type bsbookdata.

  data cata_id type bsindex.

  data rowselection type I.

  bookcat_tab = me->bookcat_tab.

  IF htmlb_event is bound AND

     htmlb_event->name = 'tableView'.

     table_event ?= htmlb_event.

  rowselection = table_event->selectedrowindex.

     read table bookcat_tab index rowselection into wa.

     me->cata_id = wa-cata_id.

  endif.

endmethod.

In der internen Tabelle bookcat_tab befinden sich die gefundenen Bücher. Wenn der Event einer angeklickten Zeile eintritt, wird der entsprechende Buchindex in dem Attribut cata_id festgehalten.

Diese wird dann von dem Controller für die Detailanzeige detail.do benötigt.

Zusätzliche Attribute der Controller-Klasse

Folgende zusätzliche Attribute müssen Sie der Controller-Klasse geben:

Attribut

Art

Sichtbarkeit

Bezugstyp

Beschreibung

CATA_ID

Instance Attribute

Public

BSINDEX

Bookshop Index

S_BOOKDATA

Instance Attribute

Public

BSBOOKDATA

Struktur für die Übergabe aller relevanten Daten eines Buchs

BOOKCAT_TAB

Instance Attribute

Public

BSBOOKCAT_TAB

Tabelle für Buch- und Katalogdaten

Die Strukturen sind dem bekannten Buchdatenmodell der anderen Tutorials entnommen, siehe hierzu StrukturlinkDatenmodell für die Bookshop-Tutorials.

Ergebnis

Sie haben nun den Controller für die Ergebnisliste mit Ausnahme der Methode für das Custom-Rendering für die Autorenspalte (Custom-Rendering für die Autorenspalte erarbeiten). Diese können Sie zunächst weglassen und das Tutorial so fertigstellen, Sie haben dann lediglich keine Autoren in der dafür vorgesehenen Spalte.

Diese Grafik wird im zugehörigen Text erklärt

Erzeugen Sie nun also den zugehörigen View: View result.htm für die Ergebnisliste anlegen

Ende des Inhaltsbereichs