Logo der TYPO3 Usergruppe Leipzig

Einleitung Model View Controller Konzept

Seit kurzem stehen auf typo3.org die Extensions lib und div im TER zum Download bereit, welche das Model-View-Controller Konzept in TYPO3 für die Extensionentwicklung bereitstellt. Diese beiden Extensions(tx_lib, tx_div) sollen in Zukunft eine Alternative zur pi_base bereitstellen. Die Entwicklung wird von der TYPO3-Association geleitet (Newsgroup:Extension-Coordination-Team), Hauptentwickler ist Elmar Hinz.

Warum MVC?

  • Alle Teile (Model, View, Controller) sind unabhängig und austauschbar
  • "Zwingt" den Programmierer sauber zu coden
  • Jeder Code wird nur einmal geschrieben
  • erhöht Übersicht und Ordung durch Reduzierung der Komplexität
  • Fachkräfte können optimal Ihrer Fähigkeiten eingesetzt werden
  • Hoher Wert durch Wiederverwendbarkeit aller Komponeten

Warum MVC und Typo3?

  • ermöglicht Plugins in TYPO3 5.0 relativ einfach zu migrieren
  • löst Probleme beim Erweitern von Extensions mittels XCLASS
  • soll Entwicklern einfacher die TYPO3-Core-Engine Programmierung ermöglichen, da TYPO3 5.0 selbst auf einem eigenen MVC-Konzept aufbauen wird. FE-MVC Plugins werden über einen Dispatcher mit dem TYPO3 Framework kommunizieren
  • flexibel durch "Addons" erweiterbar
  • für reine TYPO3-Programmierer ein Grund sich mit PHP5 zu befassen
  • mehr Spaß bei der Extensionentwicklung

Allgemeines

MVC Datenfluss

Das Konzept wurde zuerst von Trygve Reenskaug als Seeheim-Modell beschrieben und wurde für Benutzeroberflächen in Smalltalk genutzt. Das war wohl in den 70ern, und seit dem hat es sich als Standard bei komplexen Softwaresystemen etabliert. TYPO3 ist, wie wir alle wissen, auch eine mittlerweile komplexe Software und arbeitet praktisch auch schon mit diesem Konzept. Bei Desktopanwendungen spricht man meist von "Events". Das kann ein Schieberegler, Mausklick etc. sein, in Webanwendungen von "Actions", das kann ein Formular oder URL-Parameter sein. Meist spielen ein View und ein Controller zusammen, wohingegen das Model nix von beiden weiß.

Der View

  • Ein View ist meist eine GUI-Komponete, z.B. eine Webseite mit Linkparametern und Formularen, mit denen der Besucher kommunizieren kann.
  • Der View kennt seinen Controller und auch sein Model
  • Er kann Informationen aus dem Model abrufen und darstellen
  • Der View erhält bei Änderungen, bzw. Ereignisse vom Model, beispielsweise ob ein gesuchter Datensatz, wie z. B. ein Suchbegriff aus einem Suchformular, gefunden wurde oder nicht.
  • Eine Änderung des Views kann auch direkt vom Controller angestoßen werden. z. B. bei einem Loginformular könnte der Controller entscheiden, je nachdem ob man eingeloggt ist, welcher View, also die Anzeige/Ausgabe auf der Seite, dargestellt werden soll.
  • Ein View stellt also meist Aspekte des Zustandes eines Model dar.

Das Model

  • Das Model weiss nichts von View oder Controller.
  • Es stellt aber Operationen bereit, die vom Controller genutzt werden können, z. B. eine Suchfunktion.
  • Er stellt Zustandsinformation für den View bereit, z. B. die aktuellen Datensätze des Suchergebnisses.
  • Das Model repräsentiert also die Zustände und Operationen der Anwendung.

Der Controller

  • Die Anwendungslogik sollte nicht im Controller, sondern im Model implementiert werden.
  • Der Controller kann als dünner Adapter zwischen Ereignissen auf der Webseite und den Operationen des Models und des Views angesehen werden.
  • Er ordnet also nur zu, welche Action welche Operationen auslöst.
  • Die vom View dargestellten GUI-Komponenten, also Webseite mit Links und Formularen, machen Informationen über den Zustand von  Model und View für den Benutzer/Besucher nicht einfach nur sichtbar, sondern erlauben ihm auch durch klicken auf der Webseite Actions mit Parametern zu schicken.
  • Der Controller interpretiert solche Ereignisse (Actions) der Webseite, die der ihm zugehörige View erzeugt hat, durch Operation des Models und des Views, welche ja beiden bekannt sind.

Typo3 Extension mit dem MVC-Modell

MVC Konzept in Typo3
  • Der Besucher/Benutzer fordert aus einer View-Komponente eine Action an.
  • Diese Action kann auch Parameter wie ein Suchwort beinhalten.
  • Wird keine Action übergeben hat jeder Controller eine defaultAction.
  • Die Action ist praktisch die alte main function in Extensions mit der pi_base.
  • Der Controller Action wird instanziert und seine Action aufgerufen.
  • Dabei werden die Parameter (Formulare, URL-Parameter) übergeben.
  • Zusätzlich wird Typoscript für die Formatierung übergeben.
  • Optional kann hier auch eine Pluginkonfiguration übergeben werden.
  • Dann übergibt der Controller, je nachdem, View und Model die Parameter/Config und gibt den nächsten View zurück.
  • Beim Lesen wird dem View ein Model übergeben.
  • Beim Schreiben wird dem Model ein View übergeben.
  • Die Seite/View wird ausgegeben.

Eigene Extensions mit lib/div

  • Zuerst werden im EM natürlich die Extensions tx_lib und tx_div installiert.
  • Dann im Kickstarter eine neue Extension mit den benötigten Tabellen anlegen.
  • Allerdings ohne FE-Plugins!
  • Wir nennen unsere Extension "mvclogin" und brauchen keine Tabellen.
  • Im Extensionordner werden die Ordner controllers, models, views und static erstellt.
  • Danach erstellen wir uns einen Controller folgendermaßen: class.tx_###EXTKEY###_controllers_###NAME###.php
  • Das ist praktisch unsere main Funktion, wie man es von der pi_base kennt.

Beispiel Login Controller

Extensions als FE-Plugin konfigurieren

  • Wir denken uns mal, dass wir schon den View und unser Model haben ;-)
  • Im ordner static  erstellen wir uns die Dateien setup.txt und constants.txt
  • In diesen beiden Dateien können wir der Extension sagen wie das Plugin heißt und welchem Controller es zugeordnet ist.
  • Hier können auch TypoScript für die Formatierung, Stylesheet etc. übergeben werden.
  • Jetzt die ext_tables.php öffnen und mittels t3lib_extMgm::addPlugin() unser Plugin registrieren. Ab jetzt können wir es als Plugin auf einer Seite einfügen.
  • Ebenfalls in der  ext_tables.php mit t3lib_extMgm::addStaticFile() können wir unser Typoscript aus dem static Ordner für Root Template übergeben.
  • Im EM die Extension installieren.
  • Im Root Template der Hauptseite unser Typoscript hinzufügen.
  • Extensions als Plugin auf der Seite einfügen, fertig.

Beispiel setup.txt

BEISPIEL CONTANTS.TXT

Auszug ext_tables.php

Wie gehts weiter?

Um nun selbst mit diesen Extensions zu arbeiten sollte man als Erstes die Quellcodes von tx_lib und tx_div studieren. Desweiteren gibt es auch eine Demoextension, mit Namen tx_articles, welche das MVC-Konzept am Beispiel zeigt. Sehr zu empfehlen, da bisher die einzige Dokumentation, ist das Buch "Typo3 4.0 Handbuch für Entwickler". Hier werden detailliert die Klassen erklärt, und am Beispiel von tx_articles eine Extension Schritt für Schritt erstellt. Sehr zu empfehlen ist auch die Newsgroup des ECT. Lib/Div sind zwar im Moment noch sehr schmal im Funktionsumfang, aber es lohnt sich schon jetzt damit zu arbeiten, da man mit dem MVC-Konzept die Power von PHP5 erst richtig nutzen kann.

 

Autor: Frank Thelemann