(Document-)Controller
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.
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:
PHP-Code
class myDocumentController extends baseController {
function myDocumentController(){
}
function transformContent(){
}
}
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.
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:
APF-Template
<@controller namespace="sites::apfdocupage::pres::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:
PHP-Code
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'));
}
}
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:
APF-Template
<@controller namespace="sites::apfdocupage::pres::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:
PHP-Code
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());
}
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);
}
// Items in das Header-Template einsetzen
$Template__ListHeader->setPlaceHolder('TableElements',$Buffer);
// Template transformieren und zurückgeben
return $Template__ListHeader->transformTemplate();
}
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();
}
}
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
Bitte geben Sie Ihren Kommentar hier ein. Füllen Sie alle mit * gekennzeichneten Felder vollständig und korrekt aus. Um zum Artikel zurückzukehren klicken sie bitte
hier. Zur Formatierung des Textes können folgende BBCode-ähnliche die Zeichen verwendet werden:
- [b]..[/b]: fett
- [i]..[/i]: kursiv
- [u]..[/u]: unterstrichen
Hinweis: Formatierungszeichen in Name und E-Mail-Adresse werden nicht akzeptiert.