(Document-)Controller

Artikel bewerten:
Dieser Artikel wurde noch nicht bewertet. Bewerten Sie diesen Artikel als erstes!

1. Zweck eines (Document-)Controllers

Wie unter Standard-TagLibs und Templates bereits mehrfach angesprochen, werden (MVC-Document-)Controller zur Generierung von dynamischen Inhalten verwendet. Um diese Aufgabe wahr nehmen zu können muss ein Document-Controller einem DOM-Knoten bekannt gemacht werden. Dies passiert in der ersten Zeile einer Template-Datei durch ein <@controller @>-Tag. Der PageController weist dem aktuellen DOM-Knoten damit den dort angegebenen Document-Controller zu und führt diesen bei der Transformation des Knotens aus.


2. Aufbau eines (Document-)Controllers

Jeder Document-Controller erbt vom Basis-Controller baseController. Dieser besitzt zur Verarbeitung der bekannten TagLib-Tags notwendige Methoden. Beispiel hierfür ist die Funktion __getTemplate() um eine Referenz auf ein im Knoten enthaltenes Template zugreifen zu können, oder die Methode setPlaceHolder(), mit der ein <html:placeholder />-Tag gefüllt werden kann.

Das Gerüst eines Document-Controllers hat immer folgende Gestalt:
   class myDocumentController extends baseController
   
{

      function 
myDocumentController(){
      }

      function 
transformContent(){
      }

    
// end class
   
Ein Document-Controller ist im Prinzip eine PHP-Klasse "wie jede andere auch". Dem Entwickler steht es frei eigene Klassenvariablen zu definieren, eigene Methoden einzuführen und weitere Klassen einzubinden. Wichtig ist nur, dass das zuvor gezeigte Interface eingehalten wird.

Wie der API-Dokumentation zu entnehmen ist verfügt der baseController über folgende Methoden: Des Weiteren verfügt der baseController über alle Methoden der Klasse coreObject.


3. Beispiele für (Document-)Controller

3.1. Darstellung dynamischer Inhalte in Meta-Tags

In diesem Kapitel soll nun die Implementierung eines Document-Controllers erläutert werden, der das in Templates, Kapitel 2.1, aufgeführte Template mit Inhalten füllt. Dazu ist das Template zunächst um die Definition des Document-Controllers zu erweitern und sieht daher wie folgt aus:
<@controller namespace="sites::apfdocupage::pres::templates::documentcontroller" file="website_v1_controller"
class="website_v1_controller" @>
[..]
<meta name="DC.Date" content="<html:placeholder name="Date" />" />
<meta name="DC.Type" content="Text" />
<meta name="DC.Format" content="text/html" />
<meta name="DC.Identifier" content="Dipl.-Ing. (FH) Christian W. Achatz" />
<meta name="DC.Source" content="<html:placeholder name="URI" />" />
<meta name="DC.Language" content="de" />
<meta name="DC.Relation" content="<html:placeholder name="URI" />" />
[..]
<meta name="keywords" lang="de" content="PHP,Framework,PageController,FrontController,Pattern,[..]" />
<meta name="date" content="<html:placeholder name="Date" />" />
<meta name="robots" content="index,follow" />
<meta name="revisit-after" content="5 days" />
[..]
Der zugehörige Document-Controller implementiert in diesem Fall lediglich die Methode transformContent() die bei der Transformation aufgerufen wird. Der Quellcode der Klasse sieht dann wie folgt aus:
   class website_v1_controller extends baseController
   
{

      function 
website_v1_controller(){
      }

      function 
transformContent(){

         
// Platzhalter-Tag "URI" setzen
         
$this->setPlaceHolder('URI',$_SERVER['REQUEST_URI']);

         
// Platzhalter-Tag "Date" setzen
         
$this->setPlaceHolder('Date',date('Y-m-d'));

       
// end function
      
}

    
// end class
   

3.2. Darstellung dynamischer Listen

Die folgenden Zeilen greifen das in Templates, Kapitel 2.2, aufgeführte Template zur Darstellung einer Liste. Dazu wird das Template - wie oben - zunächst um die Definition desc Document-Controllers erweitert:

<@controller namespace="sites::apfdocupage::pres::templates::documentcontroller" file="list_v1_controller"
class="list_v1_controller" @>
[..]
<html:placeholder name="List" />

<html:template name="ListHeader">
  <table cellpadding="0" cellspacing="0" border="0">
    <tr>
      <td>
         <strong>ExampleList</strong>
      </td>
    </tr>
    <template:placeholder name="TableElements" />
  </table>
</html:template>

<html:template name="ListItem">
    <tr>
      <td>
         <template:placeholder name="ItemValue" />
      </td>
    </tr>
</html:template>
Der zugehörige Document-Controller implementiert nun einerseits die Methode transformContent(), wird aber die privaten Methoden __buildList() und __buildListItem() erweitert. Somit werden die Tasks nochmal in eigene "Helper-Methoden" verpackt und der Code gestaltet sich übersichtlicher und besser lesbar. Das Laden der Liste übernimmt eine fiktive Business-Komponente (listLoader), die eine Liste (=Array) von listItem- Objekten zurückgibt. Letzters ist ein Daten-Objekt, das von coreObject erbt und genau eine Eigenschaft mit dem Namen ListContent besitzt das mit get() abgefragt werden kann. Die Liste wird dann iteriert und daraus eine HTML-Ausgabe generiert:
   import('sites::demosite::biz','listLoader');


   class 
list_v1_controller extends baseController
   
{

      function 
list_v1_controller(){
      }

      function 
transformContent(){

         
// Liste in Platzhalter-Tag "List" einsetzen
         
$this->setPlaceHolder('List',$this->__buildList());

       
// end function
      
}

      function 
__buildList(){

         
// listLoader erzeugen
         
$listLoader = &$this->__getServiceObject('sites::demosite::biz','listLoader');

         
// Liste laden
         
$List $listLoader->loadList();

         
// HTML-Puffer initialisieren
         
$Buffer = (string)'';

         
// Referenz auf Header-Template holen
         
$Template__ListHeader = &$this->__getTemplate('ListHeader');

         
// Liste durchlaufen und Items generieren
         
foreach($List as $lKey => $lItem){

            
// Ausgabe für Item generieren
            
$Buffer .= $this->__buildListItem($lItem);

          
// end foreach
         
}

         
// Items in das Header-Template einsetzen
         
$Template__ListHeader->setPlaceHolder('TableElements',$Buffer);

         
// Template transformieren und zurückgeben
         
return $Template__ListHeader->transformTemplate();

       
// end function
      
}

      function 
__buildListItem(&$listItem){

         
// Referenz auf ListItem-Template holen
         
$Template__ListItem = &$this->__getTemplate('ListItem');

         
// Inhalt des Templates setzen
         
$Template__ListItem->setPlaceHolder('ItemValue',$listItem->get('ListContent'));

         
// Template transformieren und zurückgeben
         
return $Template__ListItem->transformTemplate();

       
// end function
      
}

    
// end class
   

3.3. Weiterführende Beispiele

Weiterführende Controller-Beispiele sind unter Gästebuch-Tutorial und Kontaktformular-Tutorial zu finden. Das Thema Formulare wird auf der Seite Formulare nochmals genauer behandelt.


Kommentare

Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.


Für diesen Artikel liegen aktuell keine Kommentare vor.