Wie ich HTML-Dateien in MODX-Seiten einbinde

Durch einen sehr bereichernden Besuch bei Cheatha letzte Woche habe ich das grandiose CMS MODX kennengelernt. Es war Liebe auf den ersten Blick.

Ohne zuviel versprechen zu wollen, ahne ich bereits, dass ich hier in Zukunft öfter mal von kleinen feinen MODX-Lösungen berichten werde. Ich fange mit einer an, die mich wirklich schon wochenlang beschäftigt hat.

Das Problem

Ich arbeite an einem neuen Webprojekt, das sehr viel Content bereithalten wird. Dieser Content wird in Markdown geschrieben und enthält ( LaTeX )-Schnipsel. Mittels Pandoc übersetze ich diesen Text nach HTML.

Wie bekomme ich dieses HTML nun ohne Copy&Paste in mein MODX?

Die Lösung

Die Antwort kommt - natürlich - in Form eines PHP-Snippets. Klar, mit den entsprechenden PHP-Skills hätte ich das auch einfach selbst schreiben können. Aber die habe ich noch nicht, weswegen ich doch sehr froh über Cheathas Hinweis auf das MODX-Extra “Include snippet” bin. Ein wenig abgewandelt, an meine aktuellen Pfade angepasst und als includeHTML abgespeichert sieht dies so aus:

<?php
$file = $modx->getOption('file',$scriptProperties,false);
$snippet = $modx->getOption('snippet',$scriptProperties,false);
$basePath = $modx->getOption('base_path');
$includePath = '';

if($file) $includePath = $basePath.$file;
else if($snippet) $includePath = $basePath."assets/elements/btsync/".$snippet.".html";

if(file_exists($includePath)) include($includePath);
else $modx->log(modX::LOG_LEVEL_ERROR, 'File not found in: '.$includePath, 'HTML', 'snippet/include');

Warum da btsync drin steht? Weil der Content über einen btsync-Ordner von unseren Heimrechnern auf den Webserver synchronisiert wird. Änderungen können somit immer lokal vorgenommen werden, ohne sich extra in den MODX-Manager einloggen zu müssen.

Um den HTML-Content in eine MODX-Seite einzubinden, reicht nun die folgende Zeile:

[[!includeHTML? &snippet=`dateiname`]]

Eine Dateiendung ist nicht nötig. Dateien in Unterordnern des Syncordners sind ebenfalls zugänglich. Dazu ist nur der relative Pfad notwendig:

[[!includeHTML? &snippet=`pfad/zur/datei/dateiname`]]

Ziemlich elegant, wenn ihr mich fragt.