Nachdem ich nun schon mehrere Projekte mit MODx Revolution, der zweiten Ausfertigung des besten CMS der Welt, bearbeiten durfte, dachte ich, es würde sich anbieten ein kleines Tutorial über Programmierung für MODx Revolution zu schreiben. Es gibt zwar eins in der offiziellen Dokumentation, aber das ist erstens Englisch und zweitens hat es sich als zumindest für mich nicht sehr hilfreich herausgestellt – warum auch immer. Jedenfalls habe ich mich anderweitig in die Materie eingegraben und dieser Artikel ist das erste Resultat meiner Forschungen. Im folgenden geht es erst mal nur um jene Dinge, die man für die vielen kleinen Snippets braucht, die für jede Seite anfallen. Etwas vertiefend-nerdigeres wird dann sicher irgendwann die Tage folgen.

OOP Ahoi

Der große Unterschied zwischen Programmierung für MODx Evolution und MODx Revolution ist, dass in Revolution alles Objektorientiert ist. Während es früher quasi nur ein Objekt, $modx, gab, das allerlei nützliche Methoden hatte, dient $modx in Revolution vor allem dazu, an andere Objekte heranzukommen. Diese haben dann ihrerseits Methoden. Angenommen wir wollten erfahren, welches das Elterndokument von Dokument Nummer 42 ist, würde man im alten MODx Evolution folgendes schreiben:

$doc = $modx->getDocument(42);
echo $doc['parent'];

In Revolution ist der Unterschied, dass man mit Hilfe der allmächtigen getObject()-Methode ein Dokument-Objekt vom Typ modResource aus der Datenbank holt und sich das Elterndokument über dessen get()-Methode holt.

$doc = $modx->getObject('modResource', 42);
echo $doc->get('parent');

Warum so und nicht anders? Nun, mit dem Wissen um diese beiden Zeilen ist man bereits völlig dafür gerüstet, beliebige Daten aus jedem beliebigen MODx-Objekten zu holen. Es ist völlig egal, ob man Informationen über Dokumente, Chunks, Snippets, User oder Zugriffsberechtigungen haben möchte – getObject(), get(), fertig.

// ID des Chunks "foo"
$chunk = $modx->getObject('modChunk', 'foo');
echo $chunk->get('id');

// Kategorie des Templates 1337
$template = $modx->getObject('modTemplate', 1337);
echo $template->get('category');

// Name des Users 42
$user = $modx->getObject('modUser', 42);
echo $user->get('username');

Die ganzen verschiedenen Methoden, die man sich früher für solcherlei Operationen merken musste, darf man also getrost vergessen.

Klassen und Methoden

Die komplette Liste der Objekte, die man sich mittels getObject() holen kann, findet man unter http://api.modxcms.com/. Die für den Hausgebrauch Interessanten Dinge sind unter modxClasses zu finden, wo auch die diversen Methoden der einzelnen Objekte dokumentiert sind – denn natürlich ist get() nicht alles. Jedes Objekt hat eigene, spezialisierte Methoden mit denen man praktische Dinge anstellen kann. Man möchte wissen, welchen Wert die Template Variable foo im Dokument 42 hat? Kein Problem:

$doc = $modx->getObject('modResource', 42);
echo $doc->getTVValue('foo');

Nützliches und Veraltetes aus $modx

Früher war $modx das Ein und Alles der MODx-Programmierung doch mittlerweile ist es fast nur noch für getObject() wichtig. Es enthält zwar noch allerlei Überbleibsel aus MODx 1.x – so sind etwa weiterhin $modx->documentObject und $modx->db an Bord – allerdings nur noch übergangweise. Spätestens zur Version 2.1 wird hier aufgeräumt und die Altlasten fliegen raus. Deshalb sollte man, wenn es etwas Neues gebaut wird, die Finger hiervon lassen und auch veraltete Snippets wie Ditto (wird u.A. durch getResources ersetzt) sind zwar noch da, aber bereits zum Entfernen vorgemerkt.

Das DocumentObject braucht eigentlich auch niemand mehr. Die ID des gerade aufgerufenen Dokuments findet man unter $modx->resourceIdentifier und unter $modx->resource findet man ein komplettes modResource-Objekt, das man wie bekannt mit get() und all seinen anderen Methoden bearbeiten kann. Wir halten also fest: Fast alles, was früher in irgendwelchen Arrays steckte, ist jetzt schön in Objekten sortiert. Wenn man das weiß, ist man schon ganz gut gerüstet.

Fazit

Wie also programmiert es sich so in MODx Revolution? Gar nicht so schlecht, man muss nur alles vergessen, was man in MODx 1.x gemacht hat (abzüglich der Basisprinzipien, also Chunks, Snippets etc) und in der API-Dokumentation etwas heimisch werden. Die dem Objektsystem zu verdankenden Vereinheitlichungen machen, so jedenfalls mein Eindruck, schon hin und wieder die Dinge einfacher – wenn man weiß, dass man an jedes beliebige Feld einfach mit $irgendwas->get('sonstwas') herankommt, kann man sein Hirnschmalz in die wirklich wichtigen Dinge investieren: Content und Design. Und so sollte es ja eigentlich in MODx immer sein.