====== Grundstruktur ====== Hier soll die Grundstruktur von DSAo-Md kurz erklärt werden, um neuen Programmierern einen leichteren Einstieg zu ermöglichen. Die Struktur des Zend Frameworks wird hier nicht erläutert, dafür gibt es die [[http://framework.zend.com/manual/en/zend.controller.html|ZF-Doku]]. ===== MVC ===== [[http://en.wikipedia.org/wiki/Model–view–controller|MVC]] (Model-View-Controller) ist das zugrunde liegende Konzept, welches an dieser Stelle nicht genauer erläutert werden soll. ==== Controller ==== Der Controller steuert den Ablauf der Script-Ausführung. Wichtige Elemente sollen hier kurz beschrieben werden. === _getModel() === Gibt ein angefordertes Modell zurück. === gotoSimple() === Wrapper für die am häufigsten genutze Variante des [[http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller.actionhelpers.redirector|Redirect-Helpers]]. === forward() === Eigentlich ist dies nur ein Wrapper für die Methode Zend_Controller_Action::_forward(), da ich sonst von den Action-Helpern aus nicht Forwarden kann (wenn jemandem was besseres einfällt, immer her damit). Unterschied zwischen forward() und redirect()? Beim Forwarden wird die Aktion direkt nach der aktuellen Aktion ausgeführt (daher am besten vor der Ausführung der Aktion forwarden), während beim Redirect die Ausführung abgebrochen wird und der Benutzer auf die angeforderte Seite weitergeleitet wird. Intern ist dies sauberer, insgesamt aber für den Benutzer und den Server weniger effizient. Da es im Moment noch keine Möglichkeit gibt, problemlos zu forwarden (vor allem auch, da der Benutzer sich dann nicht mehr darauf verlassen kann, dass der URI, der ihm im Client angezeigt wird, auch wirklich der URI ist, der vom Server gerendert wurde), wird meistens redirect() benutzt. === getConfig() === Gibt die [[#Konfiguration|Konfiguration]] zurück. === getHelper() === Es wird ein [[http://framework.zend.com/manual/en/zend.controller.actionhelpers.html|Helper]] zurück gegeben. Aus Gründen der Effizienz wird hier außerdem ein interner Array mit Referenzen auf die Helper verwaltet. === getLog() === Gibt ein Objekt des [[#Logging|Loggers]] zurück. === getTranslate() === Gibt ein Objekt der [[#Sprachverwaltung|Sprachverwaltung]] zurück. === getUri() === Gibt das Objekt des aktuell aufgerufenen URI zurück. === getUser() === Gibt das Objekt des aufrufenden Benutzers zurück. === getView() === Gibt das Objekt der View-Komponente (Smarty in unserem Fall) zurück. === isXmlHttpRequest() === Gibt zurück, ob der Aufruf eine Ajax-Anfrage ist. === postDispatch(), preDispatch(), preRedirect() === Wird jeweils vor bzw. nach der im zweiten Teil genannten Aktion ausgeführt und kann von den Controllern überladen werden. ==== Model ==== Das Modell wertet Daten aus und bereit (Datenbank-)Daten für die Ausgabe vor. === _getObject() === Gibt ein Objekt der übergebenen Klasse zurück. Mancher wird sich nun fragen: Wieso nicht einfach 'new Object();' benutzen? Ganz einfach: Bei vielen Objekten (z.B. Modellen selber oder Tabellen) gibt es keine oder zumindest nur sich praktisch nie ändernde Klasseneigenschaften. Da wäre es Zeitverschwendung, ein neues Objekt dieser Klasse zu instanziieren, anstatt das schon vorhandene zu benutzen. Hierfür wird die [[#Registry|Registry]] benutzt. === _getTable() === Gibt ein Tabellenobjekt für den übergebenen Tabellennamen zurück. === _init() === Initialisierungsmethode, die von den Modellen überladen werden sollte. === _setDefaultTable() === Setzt die Standardtabelle. Kann z.B. in _init() ausgeführt werden. === camelize(), underscore() === Häufig benutzte Methoden zur Konvertierung von Schreibweisen. === getLog() === Gibt wie beim Controller das gleiche, aber nicht dasselbe Logger-Objekt zurück. === getTranslate() === s.o. ==== View ==== Die View-Komponente rendert aus den vom Controller übergebenen Inhalten ein Template, das schließlich an den Client gesandt wird. Bei uns wird hier die Klasse Smarty überladen. === addTemplate() === Fügt ein Template hinzu. Diese Methode muss nur aufgerufen werden, wenn nicht das erwartete Template übergeben werden soll (Standardmäßig wird das zur aktuellen Aktion passende Template übergeben.). Zusätzlich kann das Template noch positioniert werden (evtl. sollte man hier in Zukunft etwas wie einen Template-Stack einrichten.). === debug() === Diese statische Methode kann zum Debuggen über die Smarty-Debug-Konsole verwendet werden. === getLayouts() === Gibt alle vorhandenen Layouts zurück. === sprintf() === Diese statische Methode erlaubt das Einfügen von ggf. zu übersetzenden Strings in einen anderen String. Für nähere Informationen sei auf die Inline-Dokumentation verwiesen. ===== Benutzerverwaltung ===== Benutzer werden durch die Klasse Dsao_User repräsentiert. Das Objekt des aktuell angemeldeten Benutzers kann über die Registry oder über die Methode getUser() im Controller bezogen werden. ===== Datenbank ===== Zunächst Mal gibt es für jedes Modul 'ne eigene SQL-Datei. ==== Tabellen ==== Die Tabellen werden durch Objekte der Klasse Dsao_Db_Table_Abstract repräsentiert. Für alle wichtigen Werte, die beim Erstellen einer solchen Klasse zu setzen sind, sei auf die Inline-Dokumentation verwiesen. Alles weitere dazu auch in der [[http://framework.zend.com/manual/en/zend.db.html|ZF-Doku]]. ===== Konfiguration ===== Ein Objekt der Konfiguration kann über die Registry oder die Methode getConfig() in verschiedenen Klassen bezogen werden. ===== Logging ===== Es gibt im Controller und im Model getrennte Logger, deren Meldungen jeweils an die View-Komponente übergeben werden. ===== Registry ===== Jederzeit über Dsao_Registry::get() verwendbar ist die Registry ein globaler Variablenspeicher und verleitet daher schnell zu schlampigem Code und schlechtem Design (ich würde auch behaupten, dass bisher schon solche Fehler gemacht wurden und der Code in der Richtung noch verbessert werden muss). Man sollte darauf achten, dass nur Variablen, die wirklich global gebraucht werden (Konfiguration, Benutzerobjekt etc.) dort gespeichert werden. ===== Sprachverwaltung ===== Alle Texte in allen Sprachen werden hierüber verwaltet. Alles weitere dazu im Artikel über die [[sprachverwaltung|Sprachverwaltung]].