Adventure,PHP,Framework,PageController,FrontController,Pattern,Objektorientierung,OO,Software,Design,Wiederverwendbarkeit,UML,Tutorial,Benchmark,ausgezeichnete Performance

Suche:    
Downloads  |  SVN!  |  Roadmap  |  Forum!  |  Bugtracking  |  Gästebuch  |  Backlinks!  |  Referenzen!  |  Sitemap  |  Impressum  
 
Deutsch | English Adventure PHP Framework  Bookmark @ Technorati Bookmark @ del.icio.us Bookmark @ Mr. Wong Bookmark @ Simpy Bookmark @ Google Bookmark @ Digg.com Adventure PHP Framework Seite 006-Controller drucken!

(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:
  • __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

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:
  • [f]..[/f]: fett
  • [k]..[/k]: kursiv
  • [u]..[/u]: unterstrichen
Hinweis: Formatierungszeichen in Name und E-Mail-Adresse werden nicht akzeptiert.

Name:*
E-Mail:*

Kommentar:


Bestätigungscode:*



Powered by WebRing.