Ich werkele regelmäßig für eine Agentur, deren Kunde ganze Breitseiten an Öffentlichkeitsarbeit in die Welt hinauspumpt. Dafür reicht natürlich eine einzige Website nicht, sondern da wollen gleich ganze Netzwerke befüllt werden. Da aber jeweils die gleichen Redakteure an den Seiten arbeiten, wäre es natürlich schön und effizient, wenn die Verwaltung dieses ganzen Netzwerks über ein gemeinsames Interface möglich wäre. Mit MODx Revolution ist die Umsetzung von so etwas zum Glück geradezu trivial.
Schritt 1: Kontext anlegen
MODx Revolution bietet die Möglichkeit, Sets von Systemeinstellungen anzulegen, die die eigentlichen Systemeinstellungen punktuell überschreiben. Das ist für uns wichtig, weil die verschiedenen Websites unterschiedliche Titel haben sollen und unter unterschiedlichen Domains laufen, sich also in einigen wenigen Dingen von der Grundkonfiguration unterscheiden. Ein solches Set von abweichenden Systemeinstellungen heißt in MODx „Kontext“ und kann unter System → Kontexte angelegt werden. Die zu dort einzutragenden Einstellungen sind für eine eigene Seite in der Regel mindestens die folgenden:
site_start
undbase_url
: Startseite und Basis-Adressesite_name
: Titel der Seitehttp_host
undbase_url
: Host und Pfad der jeweiligen Seite
Dazu ist es ratsam, auch für angepasste Fehlerseiten u.Ä. zu sorgen, wobei die Keys dieser Einstellungen einfach aus den Systemsettings ermittelt werden können. Und das ist auch schon alles, was man im MODx-Manager selbst einrichten muss. Der neue Kontext sollte im links im Ressourcenbaum erscheinen und kann bereits mit Seiten befüllt werden.
Schritt 2: Dateien und Domains
Nun ist noch dafür zu sorgen, dass der neu angelegte Kontext beim Aufruf über die neue Domain auch verwendet wird. Das wird mit einem ganz simplen Hack gemacht: einfach die Dateien config.core.php
, index.php
und .htaccess
aus dem Modx-Hauptverzeichnis in ein eigenes Unterverzeichnis kopieren und die Domain oder Subdomain der neuen Seite auf dieses Verzeichnis zeigen lassen. Dann die index.php
öffnen und gegen Ende der Datei eine Zeile finden, die so oder ähnlich aussieht:
$modx->initialize('web');
Das, was hier als Parameter an initialize()
übergeben wird, ist der Name des zu verwendenden Kontexts – standardmäßig web
. Das tauschen wir einfach gegen den Namen unseres neuen Kontexts aus … und das war es dann auch schon! Nochmal zusammengefasst:
- Ein Set von abweichenden Systemeinstellungen für die neue Seite anlegen
- Drei Dateien kopieren und eine Zeile anpassen, damit die neuen Einstellungen verwendet werden
Ruft man jetzt die Domain der neuen Seite auf (die in das neue Verzeichnis mit den kopierten Dateien zeigt), wird der gewünschte Kontext initalisiert – mit all seinen Einstellungen, Ressourcen und Rechten für Redakteure.
Fertig!
Natürlich braucht es im Detail noch hier und da ein paar Feinjustierungen, aber prinzipiell sind diese beiden Schritte alles, was man machen muss, um mehrere Websites mit einer einzigen MODx-Installation zu betreiben. Nutzen kann das man dies nicht nur für größere Netzwerke, sondern zum Beispiel auch für verschiedene Sprachversionen einer Seite. Mit dem Rechtesystem ist es auch möglich, bestimmte Redakteure nur bestimmte Kontext-Bereiche mit Seiten befüllen zu lassen.
Im übrigen: das gesamte Backend von MODx Revolution ist mit genau dieser Technik umgesetzt – wer es nicht glaubt, kann ja mal den Kontext-Key mgr
unter die Lupe nehmen und nachsehen, welche drei Dateien denn da im Manager-Verzeichnis liegen.
Probleme, Lösungen und Tipps
Ein etwas ekliger Aspekt solcher Seiten ist das Kampf mit den URLs verlinkter Ressourcen (Bilder, PDFs etc) in Kombination mit einem WYSIWYG-Editor. Ich nehme zwar an, dass man das alles innerhalb von MODx konfigurieren kann, aber was auch nicht verkehrt ist, ist der Weg über Symlinks oder mod_rewrite – einfach für alle Domains eigene Ressourcenverzeichnisse simulieren, die nichts als Verweise oder Redirects auf einen großen gemeinsames Ressourcenpool sind. Lieber zwei Zeilen in die .htaccess schreiben als groß in der Konfiguration herumfummeln!
Als weiteres praktisch-billiges Tool hat sich dieses Gib-Text-anhängig-vom-aktiven-Kontext-aus-Snippet erwiesen:
$contextkey = $modx->resource->_contextKey;
$contexts = array('foo-de', 'foo-en', 'bar-de', 'bar-en');
foreach($contexts as $context){
if($context == $contextkey && !empty(${$context})){
return ${$context};
}
}
Damit kann man in Templates und Chunks flexibel Textbrocken ja nach aktiver Seite und/oder Sprache ausgeben, einfach indem man z.B. aufruft. Dererlei geht zwar auch über Lexicon-System von MODx, aber wenn es auch mal schnell und dreckig sein darf, reicht dieses Snippet.
Zum Abschluss noch drei allgemeine Tipps aus nun schon mehrmonatiger Erfahrung mit solchen Konstruktionen:
- Bei der Auswahl der Kontext-Keys bietet es sich an, sie so zu benennen, dass man die Namen in Snippets parsen kann und automatisch festellen lassen kann, zu beispielsweise welcher Seite oder Sprache ein Kontext gehört. Ich mag das Muster
seite-sprache
, also z.B.foo-de
,foo-en
,foo-pl
,bar-de
,bar-en
und so weiter - Baut kontext- und sprachagnostische Snippets. Der Aufwand für Ressourcen-Recycling innerhalb einer MODx-Installation liegt bei 0 – wenn man entsprechend geplant hat. Nicht vergessen dass es ja in Revo auch Platzhalter in Chunks gibt!
- Nutzt um Himmels Willen Kategorien um Ressourcen zu sortieren! Wenn man mehr als eine Seite in mehreren Sprachen betreiben sollte, ist das die einzige Chance den Durchblick zu bewahren.