Artikel miteinander verknüpfen in modx

Beziehungen in modx

modx ist sehr flexibel, aber leider an einigen Stellen auch sehr schlecht dokumentiert. Wer nicht gerade Lust und Zeit hat, hier in den APIs zu graben, oder zig Forenbeiträge zu bemühen, der hat in der Regel Pech gehabt. Oft scheitert es dabei an ganz alltäglichen Dingen, wie dem Verknüpfen von mehreren Artikeln.
Ich selbst habe ein wenig testen und suchen müssen, um eine zufriedenstellende Lösung zu finden. Zufriedenstellend ist es für mich dann, wenn ein Redakteur hinterher keine wilden Zeichenfolgen tippen muss, sondern bequem und einfach auswählen kann. Ich brauchte die Funktion, um individuelle Inhaltsboxen in der Sidebar zu füllen, habe aber der Übersichtlichkeit halber hier eine einfachere Verknüpfung gewählt.

Die Dokumente und Templates anlegen

Ansicht der Dokumente Ich habe hier für das Beispiel einen Container mit Projekten angelegt und einen mit Mitarbeitern. Wir wollen nun einem Projekt mehrere Mitarbeiter zuordnen können – diese sollen dann auch hinterher unter dem Projekt aufgelistet werden. Bevor ich hier weitermache möchte ich noch ganz schnell darauf hinweisen, dass ich jede Mühe gescheut habe, dem Ganzen ein nettes Aussehen zu verpassen :-)

Um das Ganze hinterher mit den Template-Variablen übersichtlicher zu gestalten, habe ich für jeden Artikeltyp ein eigenes Template angelegt. So kommt man hinterher nicht in Versuchung, einem Projekt einen Avatar zuzuweisen.
Header und Footer eines Templates speichert man am Besten immer in einem dafür vorgesehenen Chunk, dann muss man nicht alle Templates ändern falls man dort einmal etwas einbauen möchte.

Überlegungen

Ziel in diesem Beispiel ist es, zu jedem Projekt eine Detailseite anzulegen, auf der dann sämtliche Mitarbeiter, die daran mitgewirkt haben aufgelistet werden. Da die Mitarbeiter jeweils bei verschiedenen Projekten mitwirken können, sollen sie selbst als Dokument angelegt werden und bei Bedarf mit einem Projekt verknüpft werden. Wir benötigen also erst einmal einen Container für die Projekte und einen Container für die Mitarbeiter.

Wie kommen die Mitarbeiter ins Projekt?

Ditto verfügt über einen Parameter documents, dem wir die IDs von Dokumenten in einer Kommaseparierten Liste übergeben können. Wir könnten also in unserem Projekt folgendes schreiben: [!Ditto? &documents=`5,7` &tpl=`mitarbeiter_li_tpl` !]

Diese Lösung würde funktionieren, jedoch hätten wir hier ein ziemlich fehleranfälliges Fragment in unseren Projekten. Der Redakteur muss in jedem Projekt diesen Aufruf erneut tippen und dabei die entsprechenden IDs einsetzen. Hier muss nur ein Apostroph falsch gesetzt werden und schon haben wir ein sehr unschönes Erscheinungsbild. Außerdem ist es nicht gerade komfortabel für den Redakteur, der sich vielleicht mit dem System gar nicht auskennt – vielleicht sogar nicht einmal HTML beherrscht.
Wir müssen also den Aufruf irgendwie aus dem Inhalt des Projektes herausbekommen und in das Projekt-Template verschieben. Die IDs müssen dann an das Template übergeben werden können, was wir am einfachsten mit einer Template-Variable erreichen können.
Wir könnten also nun eine einfache Text-Variable anlegen, in die der Redakteur die IDs getrennt mit einem Komma eingibt und diese dann an den Aufruf übergeben: [!Ditto? &documents=`[*mitarbeiter*]` &tpl=`mitarbeiter_li_tpl` !]

Diese Lösung ist auf jeden Fall besser als die erste, aber noch nicht optimal. Der Redakteur muss die IDs selbst eingeben und kann sich vertippen oder – und das wird sehr wahrscheinlich schnell der Fall sein – ein Leerzeichen hinter dem Komma einfügen. Am einfachsten wäre es, wenn er einfach eine Liste der Mitarbeiter angezeigt bekommen würde, über die er dann die Mitarbeiter auswählen könnte. Genau diese Lösung werden wir jetzt bauen…

Die Variablen anlegen

Avatar-TV anlegen Für unsere Mitarbeiter wollen wir ein Profilbild (Avatar) anlegen. Unter Elemente > Elementen-Verwaltung legen wir unter dem Reiter Template-Variablen eine neue Template-Variable mit dem Namen avatar an. Eingabetyp und Objektauswahl setzen wir auf Image und bei den Parametern tragen wir für den Alternate Text [*longtitle*] ein. Dann noch ein Häkchen unten bei dem entsprechenden Template setzen (bei mir Mitarbeiter) und Speichern.


Mitarbeiter Template-Variable anlegen Für das Template Projekt benötigen wir nun eine Template-Variable, durch die wir die anzuzeigenden Mitarbeiter auswählen können. Da mehrere Einträge ausgewählt werden sollen, ist der Eingabetyp Listbox (Multiselect) am besten geeignet. In den Eingabeoptionswerten benötigen wir eine Abfrage, die uns sämtliche Mitarbeiter auflistet. An dieser Stelle werfen wir mal einen Blick in die Datenbank. Die Artikel werden in der Tabelle modx_site_content gespeichert, wobei modx das Präfix für die Tabellen ist (wenn ihr bei der Installation ein anderes Präfix gesetzt habt, wird eure Tabelle anders heißen).

Für unsere Liste benötigen wir die ID, die ans Template übergeben wird und den Seitentitel, damit wir die Einträge leichter auswählen können. Dabei gibt nimmt modx den ersten Wert einer Abfrage immer als angezeigten Text und den zweiten als Wert. Wird nur eine Spalte abgefragt, wird dieser Wert für beides genutzt. Unsere Abfrage lautet also erst einmal: @SELECT pagetitle, id FROM [+PREFIX+]site_content
Das würde uns sämtliche Dokumente auflisten – wir benötigen aber nur die Mitarbeiter. Wir begrenzen also unsere Abfrage auf die Dokumente, die in unserem Mitarbeiter-Container gespeichert sind: WHERE parent='3' wobei 3 durch die jeweilige ID des Container ersetzt werden sollte.

Unsere Template-Variable legen wir nun also mit folgenden Werten an:

Name der Variablen
Mitarbeiter
Eingabeoptionswerte
@SELECT pagetitle, id FROM [+PREFIX+]site_content WHERE parent='3'
Objektauswahl
Delimited List
Delimiter
,

Nun noch das Häkchen bei unserem Projekt-Template setzen und Speichern.

Das Mitarbeiter-Listentemplate

Unsere Liste im Template Wenn wir uns nun in unser Projekt begeben, sehen wir die Liste mit unseren Mitarbeitern und können einen oder mehrere auswählen. Was nun noch fehlt ist das Template, welches den Mitarbeiter innerhalb eines Projektes anzeigt. In unserem Projekt-Template haben wir den Aufruf [!Ditto? &documents=`[*mitarbeiter*]` &tpl=`mitarbeiter_li_tpl` !]. Wir müssen also noch das Chunk mitarbeiter_li_tpl anlegen.

<div class="mitarbeiter">
<h3>[+pagetitle+] – [+longtitle+]</h3>
[+avatar+]
[+content+]
</div>

Fertig!

unser fertiges Projekt Unsere Helden werden korrekt unter dem Projekt angezeigt. In meinem Screenshot ist noch das mitgelieferte minimal-Template eingestellt, daher ist es vielleicht nicht so wirklich hübsch. Ihr bekommt das sicher besser hin :-)


Ähnliche Artikel

Kommentare

  1. Thorsten schrieb am 16.12.09:1

    Hallo Julia,

    danke für den informativen und praktischen Artikel.

    Ich hatte mir modx schon ein paar Mal angeschaut, damals war aber allein das Taggen von Beiträgen ein initialer Mordsaufwand. Glaubst Du, dass modx auch ohne ausgewiesene Programmierkenntnisse gut nutzbar ist? Programmierst Du selbst Module/Erweiterungen?

    Solche »Ditto«-Konstrukte zu zimmern, finde ich nicht schwer, das ist bei textpattern ja teilweise nicht viel anders. Das wäre für mich also keine »ausgewiesene Programmierung«.

    Nochmals danke!

  2. Julia Eckel schrieb am 16.12.09:2

    @Thorsten: In wie weit es auch ohne Programmierkenntnisse einzurichten ist, hängt stark vom Ziel ab. Eine »einfache« Seite mit einer einfachen Ordnerstruktur und ohne viel Schnickschnack geht sicherlich. Sobald individuellere Lösungen angedacht sind, wird man allerdings kaum um PHP/Mysql herumkommen.

    Ich versuche die vorhandenen Snippets zu nutzen wo immer es möglich ist, habe aber an einigen Stellen auch eigene Erweiterungen und Module Programmiert. Es gibt auch bereits viele fertige Lösungen, die man installieren kann. Installation ist bei modx allerdings kein »Plug & Play«, sondern erfordert ein wenig mehr Initiative und Lesearbeit.

    Ich denke allerdings, dass sich eine Einarbeitung in modx auf jeden Fall lohnt, da es ein unglaublich flexibles und schnelles System ist. Und Drupal oder Joomla kann man ja schließlich auch nicht »mal eben« einrichten.

  3. Matthias schrieb am 18.12.09:3

    MODx ist auch kein typisches »Out-of-the-box« CMF, sondern richtet sich insbesondere an Anwender, die es leid sind, Wordpress oder andere Systeme aufzubohren. Kenntnisse in PHP, sind nicht zwingend Voraussetzung – aber sinnvoll. Es gibt sehr viele Anwendungsmöglichkeiten, ausreichend dokumentiert und bei Fragen gibt es eine hilfsbereite Community (das deutsche Forum unter modxcms.de).


Dein Kommentar:

Sämtliche Html-Tags werden gelöscht, der Kommentar kann mit Textile formatiert werden.
Vor dem Absenden müsst ihr euch einmal die Vorschau ansehen.