TYPO3 Neos erweitern (1): Eigene Plugins

TYPO3 Neos erweitern (1): Eigene Plugins

Die gute Erweiterbarkeit war stets eines der großen „Verkaufsargumente“ für das TYPO3 CMS. Ein Blick in das TYPO3 Extension Repository gibt dieser Behauptung Recht, tummeln sich hier doch mehrere tausend quelloffene TYPO3-Erweiterungen. TYPO3 Neos steht seinem Vorbild in Sachen Erweiterbarkeit in nichts nach, und bietet sogar noch mehr Möglichkeiten in dieser Hinsicht. In diesem Tutorial soll daher betrachtet werden, wie Ihr eigene Plugins für TYPO3 Neos entwickeln könnt. Als Beispiel dient dafür eine einfache Gästebuch-Erweiterung.

  1. Eine aktuelle Neos-Version installieren
  2. Ein Flow-Paket erstellen
  3. Den Kickstarter benutzen
  4. Die erstellten Dateien anpassen
  5. Datenbank-Migrationen erstellen
  6. Das Plugin definieren
  7. Ein Inhaltselement erstellen
  8. Das Inhaltselement dem Backend bekannt machen
  9. Die TypoScript-Definitionen inkludieren
  10. Ausprobieren!
  11. Fazit
  12. Ihr möchtet Neos testen?
  13. Bereits von Neos begeistert?

Eine aktuelle Neos-Version installieren

Das in diesem Artikel beschriebene Vorgehen funktioniert leider nicht mit der aktuellen Neos-Version 1.0-alpha1, sondern nur mit der aktuellen Entwicklungsversion. Das macht aber nichts, denn die ist schnell installiert. Alles was Ihr dazu benötigt, ist ein Git-Client:

Der letzte Composer-Aufruf lädt die benötigten Abhängigkeiten (zahlreiche Flow-Pakete, aber auch externe Bibliotheken) aus diversen Quellen nach – eine gute Gelegenheit, erst einmal eine Tasse Kaffee trinken zu gehen. ;-) Je nach Systemkonfiguration könnt Ihr statt dem php_cli-Kommando auch einfach das php-Kommando verwenden.

Nach dem Download könnt Ihr wie von Flow oder der Alpha-Version gewohnt, den DocumentRoot des Webservers auf das Web/-Verzeichnis umbiegen und Neos wie gewohnt über die Web-Oberfläche installieren.

Ein Flow-Paket erstellen

Den Kickstarter benutzen

Über den Paket-Kickstarter (bereitgestellt vom Paket TYPO3.Kickstarter) kann nun ein neues Paket erstellt werden. Grundsätzlich handelt es sich bei Neos-Plugins um ganz reguläre Flow-Pakete. Der einzige Unterschied besteht darin, dass die Views der Controller nicht isoliert, sondern in den jeweiligen Seitenkontext hinein gerendert werden.

Wie genau einfache Applikationen in Flow entwickelt werden können, hatte ich bereits in einem früheren Tutorial betrachtet. Zunächst könnt Ihr mit dem Kickstarter das Paket, sowie die benötigten Models, Repositories, Controller und Views erstellen:

Die erstellten Dateien anpassen

Im nächsten Schritt könnt Ihr die vom Kickstarter erstellten Dateien Euren Bedürfnissen anpassen. Im Falle des Gästebuchs bietet es sich beispielsweise an, die Index-View so anzupassen, dass die Einträge in einzelnen Divs gerendert werden; außerdem werden die Links zum Bearbeiten und Löschen ausgeblendet. So könnte die Datei Resources/Private/Templates/Entry/Index.html in der finalen Version aussehen wie folgt:

Darüber hinaus hat der Kickstarter in der New-View standardmäßig ein Eingabefeld für das Eintragsdatum hinzugefügt (welches der Anwender aber natürlich nicht selbst setzen können soll). Auch diese View kann nun ein wenig angepasst werden:

Damit in einem neuen Gästebucheintrag immer das aktuelle Datum steht, kann nun noch der Konstruktor des Entry-Models (in Classes/MH/Guestbook/Domain/Model/Entry.php) angepasst werden. Außerdem solltet Ihr die entsprechenden Validierungsregeln hinzufügen, sodass Einträge nicht ohne Inhalt oder Autorenangabe erstellt werden können:

Datenbank-Migrationen erstellen

Mit einem einfachen ./flow doctrine:update könntet Ihr nun die entsprechenden Datenbanktabellen für Euer Paket erstellen. Damit das Plugin portabel ist, solltet Ihr jedoch besser mit sogenannten Migrations arbeiten. Hierbei handelt es sich um kurze PHP-Module, die einzelne Änderungen an der Datenbank vornehmen. Erstellen könnt Ihr eine Migration mit folgenden Befehlen:

Dieser Befehl erstellt eine Migration-Datei im Verzeichnis Data/DoctrineMigrations. Um diese Migration zusammen mit Eurem Paket auszuliefern, solltet Ihr die Datei nun in das Paketverzeichnis kopieren.

Anschließend könnt ihr die noch nicht ausgeführten Migrations in die Datenbank einspielen:

An dieser Stelle könnte Euer eigener Controller – eine entsprechende Route in der Datei Configuration/Routes.yaml vorausgesetzt – bereits im Standalone-Modus aufgerufen werden. Aber der wirklich interessante Teil dieses Tutorials beginnt erst jetzt …

Das Plugin definieren

Ein Inhaltselement erstellen

Die Definition neuer Inhaltselement-Typen (genauer gesagt Knotentypen) – und nichts anderes ist ein Plugin in Neos – erfolgt ausschließlich über TypoScript 2 (den objektorientierten Nachfolger des altbekannten TypoScripts).

TypoScript-Definitionen werden in Neos-Paketen in der Regel im Verzeichnis Resources/Private/TypoScript gespeichert. Wie die Dateien in diesen Ordnern heißen, ist prinzipiell egal; in diesem Fall wäre ContentElements.ts2 ein geeigneter Dateiname.

TypoScript 2 verfolgt das Prinzip der Prototypenbasierten Objektorientierung. Im Unterschied zur herkömmlichen Objektorientierung werden hier keine Klassen definiert, aus denen später Objekt erstellt werden, sondern Prototypen. Aus einem solchen Prototypen können später Objekte durch einfaches Kopieren erstellt werden. Einen Prototyp für ein eigenes Plugin könnt Ihr wie folgt definieren:

Der Name des Knotentypen (in diesem Fall MH.Guestbook:Frontend) ist in aller Regel weitgehend frei wählbar. Normalerweise macht es allerdings Sinn, der Konvention <Paketname>:<Pluginname> zu folgen. In Zeile 1 wird zunächst der bereits aus dem klassischen TypoScript bekannte Kopier-Operator „<“ verwendet, um das neue Plugin als Abkömmling eines generischen-Plugin-Typen zu definieren.

In den Zeilen 2 bis 5 werden anschließend bestimmte Attribute des Prototypen mit eigenen Werten überschrieben – beispielsweise das zu verwendende Paket und der anzusprechende Controller.

Das Inhaltselement dem Backend bekannt machen

Nachdem das Inhaltselement nun definiert wurde, muss es dem Neos-Backend noch bekannt gemacht werden, damit wir Knoten dieses Typs auch auf Seiten platzieren können. Dies geschieht über die Konfigurationsdatei Configuration/Settings.yaml in Eurem Paket:

Der Plugin-Name muss hierbei dem Namen aus Eurer TypoScript-Definition entsprechen. Die Beschriftung, und der Name der Gruppe, unter der das Plugin einsortiert wird, sind vollkommen frei wählbar.

Die TypoScript-Definitionen inkludieren

Damit Neos etwas mit Eurem neuen Inhaltstyp anfangen kann, muss noch die TypoScript-Datei mit der Definition in das Root-Template der Seite inkludiert werden. Dies könnt Ihr tun, indem Ihr folgenden TypoScript-Schnipsel in das Root-Template (z. B. Packages/Sites/TYPO3.PhoenixDemoTypo3Org/Resources/Private/TypoScripts/Library/Root.ts2) Eurer jeweils aktiven Seite einfügt:

Ausprobieren!

typo3 guestbook

Nun ist es an der Zeit, Euer neues Plugin auszuprobieren. Meldet Euch hierzu im Neos-Backend an und fügt an beliebiger Stelle ein neues Inhaltselement ein. Neben den beiden bereits bekannten Gruppen General und Structuresollte nun zusätzlich die Gruppe Plugins sichtbar sein. Fügt das neue Inhaltselement ein und klickt anschließend auf die Schaltfläche Publish.

Im Frontend sollte nun die Index-View Eures Controllers als Seiteninhaltselement ausgegeben werden.

Fazit

Natürlich kratzt dieser Artikel nur an der Oberfläche der Möglichkeiten, über die Neos erweitert werden kann. Neben den hier vorgestellten Plugins könnt Ihr über TypoScript beispielsweise genauso gut auch bereits bestehende Inhaltstypen Euren Vorstellungen anpassen. Oder Ihr könntet über das Signal/Slot-Muster den Neos-Kern erweitern, über die umfangreiche Konfiguration Implementierungen ganzer Klassen austauschen oder mittels aspektorientierter Programmierung das Verhalten beliebiger Kern-Klassen verändern.

Den Quelltext des in diesem Tutorial entstandenen Plugins findet Ihr übrigens auf Github. Anregungen und Verbesserungsvorschläge sind jederzeit willkommen. :)

Ihr möchtet Neos testen?

Jetzt einfach einen kostenlosen Neos Testaccount bei Mittwald anfordern!

Bereits von Neos begeistert?

Bei Mittwald findet ihr die passenden Angebote für euer TYPO3 Neos Hosting!

Kommentare

  1. Gravatar
    armin otto am


    $ cp Data/DoctrineMigrations/Version20121017151353.php Packages/MH.Guestbook/Migrations/Mysql/

    Anschließend könnt ihr die noch nicht ausgeführten Migrations in die Datenbank einspielen:
    $ ./flow doctrine:migrate

    Der Zielpfad ist falsch. Korrekt wäre:
    $ cp Data/DoctrineMigrations/Version20121017151353.php Packages/Application/MH.Guestbook/Migrations/Mysql/

    Damit funktioniert auch das migrate.

    Antworten
  2. Gravatar
    Tobias Breyer am

    Danke für den Artikel. NEOS hört sich spanndend an und wird sicher ein paar schlaflose Nächte mit sich bringen. ;-)

    Antworten

Kommentar hinzufügen