Drücke die Tasten ◄ ► für weitere Artikel  

TYPO3 Neos: So erweiterst Du das CMS mit eigenen Plugins

Inwiefern sich die aktuelle Alpha-Version von TYPO3 Neos erweitern lässt, zeigt TYPO3-Experte Martin Helmich am Beispiel eines simplen Gästebuch-Plugins. Dabei erläutert er die Vorgehensweise Schritt für Schritt und gibt ganz konkrete Einblicke in seine Arbeit.

TYPO3 Neos: So erweiterst Du das CMS mit eigenen Plugins

Die gute Erweiterbarkeit war stets eines der großen “Verkaufsargumente” für das . 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.

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:

$ git clone --recursive \
git://git.typo3.org/TYPO3v5/Distributions/Base.git neos
$ cd neos
$ wget -q --no-check-certificate -O \
-https://getcomposer.org/installer | php_cli
$ php_cli composer.phar install --dev --prefer-source

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:

$ ./flow kickstart:package MH.Guestbook
$ ./flow kickstart:model MH.Guestbook Entry "author:string" "email:string" "date:\DateTime" "content:string"
$ ./flow kickstart:repository MH.Guestbook Entry
$ ./flow kickstart:actioncontroller MH.Guestbook Entry --generate-actions --generate-templates

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:

<f:if condition="{entries}"><f:then>
<f:for each="{entries}" as="entry">
<div>
<div>
Geschrieben am {entry.date -> format:date(format="d.m.Y, H:i")} von
<f:link.email email="{entry.email}">{entry.author}</f:link.email>
</div>
<div>{entry.content -> f:format.nl2br()}</div>
</div>
</f:for>
</f:then><f:else>
<p>Keine Einträge vorhanden.</p>
</f:else></f:if>
<p><f:link.action action="new">Neuer Gästebuch-Eintrag</f:link.action></>p

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:

<f:form action="create" name="entry">
<table>
<tr>
<td><label for="author">Dein Name</label></td>
<td>
<f:form.textfield property="author" id="author" style="width: 100%"/>
</td>
</tr><tr>
<td><label for="email">Deine E-Mail-Adresse</label></td>
<td>
<f:form.textfield property="email" id="email" style="width: 100%"/>
</td>
</tr><tr>
<td colspan="2">
<f:form.textarea property="content" id="content"
style="width: 100%; height: 200px;" />
</td>
</tr><tr>
<td></td>
<td><f:form.submit value="Erstellen" /></td>
</tr>
</table>
</f:form>

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:

use TYPO3\Flow\Annotations as Flow;
class Entry
{
/**
* @var \DateTime
*/
protected $date;
/**
* @var string
* @Flow\Validate(type="NotEmpty")
*/
protected $author;
/**
* @var string
* @Flow\Validate(type="NotEmpty")
*/
protected $email;
/**
* @var string
* @Flow\Validate(type="NotEmpty")
*/
protected $content;
public function __construct()
{
$this->date = new \DateTime('now');
}
// [...]
}

Datenbank-Migrationen erstellen

Mit einem einfachen ./flow doctrine:update könntet Ihr nun die entsprechenden Datenbanktabellen für Euer Paket erstellen. Damit das 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:

$ ./flow doctrine:migrationgenerate

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.

$ mkdir -p Packages/MH.Guestbook/Migrations/Mysql
$ 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

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:

prototype(MH.Guestbook:Frontend) < prototype(TYPO3.Phoenix.ContentTypes:Plugin)
prototype(MH.Guestbook:Frontend) {
package = 'MH.Guestbook'
controller = 'Entry'
}

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 :zu folgen. In Zeile 1 wird zunächst der bereits aus dem klassischen TypoScript bekannte Kopier-Operator “

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:

TYPO3:
TYPO3CR:
contentTypes:
'MH.Guestbook:Frontend':
superTypes: ['TYPO3.Phoenix.ContentTypes:Plugin']
label: 'Guestbook'
group: 'Plugins'

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:

include: resource://MH.Guestbook/Private/TypoScript/ContentElements.ts2

Ausprobieren!

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 Structure sollte 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.

Über den Autor

Martin Helmich ist Softwareentwickler beim Webhoster Mittwald. Er ist der Verfasser der Extbase- und Fluid-Dokumentation, die von Mittwald kostenlos zum Download bereitgestellt wird. Außerdem ist er Co-Autor des Buches „Praxiswissen TYPO3“, das im O'Reilly Verlag erschienen ist.

41 Shares bis jetzt – Dankeschön!

Bewerten
VN:F [1.9.22_1171]
Eine Antwort
  1. von Kieran Given am 21.11.2012 (11:09Uhr)

    Will TYPO3 NEOS find acceptance in the TYPO3 Community? Possibly in time. Sometimes TYPO3 NEOS reminds me of GOOGLE+. GOOGLE launched GOOGLE+ and it was for us Tech-Geeks "WOW", but ordinary folks/users didn't want to have to take all their photos/posts/friends over to GOOGLE+, so they stayed on Facebook, even though arguably, GOOGLE+ would've given everybody a better experience. GOOGLE+ is growing quite significantly but primarily as a social engine for businesses / organisations in my opinion. I like GOOGLE+ for business related interaction, but facebook for personal connections. So will TYPO3 NEOS give a better experience, but not find acceptance? It depends largely I think, if the old CMS from TYPO3 continues to be updated, etc. and then NEOS could have a hard time or rather could take a LONG time for it to come through as the favourite. I've played around with NEOS and I REALLY like what I saw, but the old TYPO3 CMS still ticks the boxes, and it could be stay that way for some time to come.

Deine Meinung

Bitte melde dich an!

Du musst angemeldet sein, um einen Kommentar schreiben zu können.

Jetzt anmelden

Mehr zum Thema TYPO3
TYPO3 CMS 6.2: Alle Features der neuen Version im Überblick
TYPO3 CMS 6.2: Alle Features der neuen Version im Überblick

Am gestrigen Dienstag wurde die neue Version 6.2 des beliebten Content-Management-Systems (CMS) TYPO3 veröffentlicht. Welche Änderungen und Verbesserungen es gibt, haben wir hier für euch... » weiterlesen

TYPO3 CMS: Das TYPO3-Backend kennenlernen [t3n-Video-Workshop]
TYPO3 CMS: Das TYPO3-Backend kennenlernen [t3n-Video-Workshop]

Heute führen wir auf t3n.de die Video-Serie weiter, in der wir euch in Zusammenarbeit mit Galileo Press Video-Workshops zu verschiedenen Themen für Webentwickler und Digitalarbeiter präsentieren... ... » weiterlesen

Fundraising für TYPO3 6.2: Es fehlen noch 40.560 Euro
Fundraising für TYPO3 6.2: Es fehlen noch 40.560 Euro

Um das Update auf Version 6.2 des TYPO3 CMS ermöglichen zu können, ruft eine Initiative jetzt zum Fundraising auf. Insgesamt 87.120 Euro werden benötigt, die Hälfte davon soll von der Community... » weiterlesen

Kennst Du schon unser t3n Magazin?

t3n 35 jetzt kostenfrei probelesen! Alle Inhalte des t3n Magazins Diesen Hinweis verbergen