(Document-)Controller
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:
-
__getTemplate():
Methode um eine Referenz auf ein Template-Objekt zu holen.
-
__getForm():
Funktion um auf ein Formular-Objekt zuzugreifen.
-
__placeholderExists():
Prüft, ob in der Seite ein Platzhalter-Tag mit dem übergebenen Namen existiert.
-
__templatePlaceholderExists():
Prüft, ob in einem Template ein Platzhalter-Tag mit dem übergebenen Namen existiert.
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.