
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.
Kommentare (10)
Florian ¶
5. August 2010, 11:29 Uhr
Sehr schön Peter,
ich mache es so, dass ich nicht X Ordner anlege, sondern nur die index.php einmal anpasse:
Henning ¶
12. August 2010, 16:19 Uhr
Hi alle,
ich hatte Ende letzten Jahres eine step-by-step Anleitung geschrieben, vielleicht kann der eine oder andere daraus einen Nutzen ziehen:
MODx Revolution Multi Domain Installation Tutorial
Herzliche Grüsse, Henning
cronix ¶
24. August 2010, 11:10 Uhr
Könntest du erläutern wie man das in der .htaccess genau umsetzten würde?
Martin Gartner ¶
22. März 2012, 09:48 Uhr
Mark Hamstra hat ein feines Plugin entwickelt, welches die ganzen manuellen Hacks (index.php bearbeiten usw.) obsolet macht:
http://modx.com/extras/package/contextrouter
Eben getestet und funktioniert wie geschmiert!
Martin Gartner ¶
22. März 2012, 09:54 Uhr
Eine Frage noch dazu:
kann man den Default "web" Kontext umbenennen? Oder sogar löschen?
Ich würde das gerne aus kosmetischen Gründen so machen, da die ganzen anderen Kontexte Site-bezogene Namen haben lediglich der erste Kontext heisst "web" - das ist unsauber.
Oder sollte ich den "web" Kontext einfach unverwendet lassen? Kann man den irgendwie ausblenden?
Beste Grüße,
Martin
Florian ¶
6. April 2012, 19:05 Uhr
Hallo Peter,
sehr guter Tipp - das wird mir bei meinem aktuellen Projekt sicherlich sehr helfen.
Gibt es da eine Grenze und parallelen Websites mit einer Installation?
Grüße
Florian
Peter Kröner ¶
7. April 2012, 15:19 Uhr
Bei beiden: Nicht dass ich wüsste.
Oliver Haase-Lobinger ¶
27. Juni 2012, 08:39 Uhr
Coole, kurze Anleitung! Danke!
Es hat sich aber ein kleiner Fehler eingeschlichen:
http_host und base_url: Host und Pfad der jeweiligen Seite
Hier müsste base_path stehen.
Peter Kröner ¶
27. Juni 2012, 14:02 Uhr
Also ich hab da bei meinen Seiten wirklich
base_url
stehen.Oliver Haase-Lobinger ¶
28. Juni 2012, 09:05 Uhr
@Peter: Klar, aber doch nicht zweimal. ;-)
Einmal "base_url" und einmal "base_path".