Drupal 7 und der Kampf mit Menu Trail und Breadcrumb

Drupal 7 und der Kampf mit Menu Trail und Breadcrumb

Einen Schwachpunkt gibt es bei Drupal, der auch in der aktuellen Version 7 noch nicht behoben wurde: Grundsätzlich weiß Drupal über die Zugehörigkeit von Inhalten zu bestimmten Menüpunkten nur dann Bescheid, wenn die jeweilige Node direkt mit diesem Menüpunkt verknüpft ist. Werden Nodes nun auf einer Übersichtsseite zusammengefasst (z.B. in verkürzter Form mit „Weiterlesen“-Link zum vollständigen Beitrag), die einen eigenen Menüpunkt besitzt und man klickt eine dieser Nodes an um den vollen Text zu lesen, fehlt die Information, welcher Menüpfad (engl. menu trail) dabei aktiv bleiben soll.


Ein Beispiel soll die Problematik verdeutlichen:


Wir haben eine Taxonomy mit den drei Taxonomy-Terms ProjektA, ProjektB und ProjektC.


Die Nodes mit den Inhalten sind wie folgt den Taxonomy-Terms zugeordnet:

Node1: 1. Beitrag ProjektA >> ProjektA

Node2: 2. Beitrag ProjektA >> ProjektA

Node3: 1. Beitrag ProjektB >> ProjektB

Node4: 2. Beitrag ProjektB >> ProjektB

Node5: 1. Beitrag ProjektC >> ProjektC


Dazu gibt es eine Menüstruktur nach folgendem Muster:


Menüpunkt1

Menüpunkt Projekte

>> Menüpunkt ProjektA

>> Menüpunkt ProjektB

>> Menüpunkt ProjektC

Menüpunkt3

...


Die drei Projekte-Untermenüpunkte zeigen jetzt per View alle Artikel an, die jeweils mit dem korrespondierenden Taxonomy-Term versehen sind. Wie man auf dem Screenshot sieht ist nach dem Klick auf auf den Menupunkt „Projekte>>Projekt A“ der entsprechende Menüpunkt als aktiv gekennzeichnet und die Seite zeigt alle Beiträge zu diesem Projekt an. Weiterhin zeigt die Breadcrumb korrekt „Startseite » Projekte“ an.


Drupal7 aktiver menu trail


Bis hierher ist also alles in Ordnung.


Klickt man jetzt aber auf die Überschrift eines Beitrages oder seinen „Weiterlesen“-Link, so wird der Beitrag (hier im Bild „2. Beitrag zu Projekt A“) angezeigt, aber der Menu-Trail geht verloren (eigentlich müsste ja noch immer der Menupunkt „Projekte>>Projekt A“ offen und aktiv sein) und auch die Breadcrumb stimmt nicht mehr (im folgenden Screenshot rot markiert) und zeigt nur noch „Startseite“ statt „Startseite » Projekte » Projekt A“.


Drupal7 verlorener menu trail bei einzelner Node


Zur Lösung dieses Problemes existieren mittlerweile zahlreiche Module. Die wichtigsten sind wohl


Custom breadcrumbs: Es erlaubt Administratoren, parametrisierte Breadcrumbs pro Node-Typ zu definieren. Weiterhin unterstützt das Modul Views, Panels, Taxonomy-Vokabulare und -Terms und Pfade. Außerdem besitzt es eine API, die es anderen Modulen ermöglicht, die Breadcrumb für Modulseiten oder Theme-Templates zu definieren. Die Konfiguration ist allerdings nicht gerade einfach und die Dokumentation noch recht dürftig. Für Drupal 7 gibt es erst eine Alpha-Version, die allerdings schon recht gut läuft.


Hansel breadcrumbs: Das Modul mit dem lustigen Namen (es ist nach dem Märchen „Hänsel und Gretel“ benannt, wo Brotkrümel ja eine entscheidende Rolle spielten) arbeitet regelbasiert. Der Administrator kann Regeln definieren, die unabhängig vom Menüsystem eine Breadcrumb erzeugen. Es arbeitet mit den Modulen Token, Organic groups, Domain und anderen zusammen. Mit Hilfe von logischen Schaltern lassen sich umfangreiche Regelwerke erzeugen, die hierarisch strukturiert werden können und mit deren Hilfe man auch komplexe Strukturen verwalten kann. Die Bedienung ist dadurch und wegen dem Fehlen einer ausreichenden Dokumentation allerdings recht schwierig. Dafür gibt es bereits eine Stable-Version für Drupal 7.


Daneben gibt es diverse weitere Module, die jeweils Teilaspekte des Breadcrumb-Problems lösen, wie zum Beispiel Panels Breadcrumbs, das ausschließlich in Verbindung mit Panels arbeitet.


Zur Lösung unseres recht einfachen Menütrail- und Breadcrumb-Problems wollen wir das Modul Menu Position einsetzen, das für Drupal 6 und 7 verfügbar ist. Es erstellt Breadcrumbs und aktive Menütrails anhand der Pfade der Nodes. Durch den Einsatz von Pathauto und Token können diese Pfade vollautomatisch auf der Basis der Taxonomy-Terms erzeugt werden, so dass bei richtiger Planung immer die korrekte Breadcrumb erzeugt wird. Ein weiterer Vorteil des Moduls liegt darin, dass es leicht zu konfigurieren ist und durch das Einblenden seiner Regeln direkt bei den einzelnen Menüpunkten besonders anschaulich ist.


Und so geht’s:


  1. Als erstes erzeugt man ein Taxonomy-Vokabular, in dem wir die Menüstruktur soweit abbilden, dass alle Menüpunkte, die später mit Übersichtsseiten mit mehreren Nodes verknüpft werden, einen korrespondierenden Taxonomy-Term erhalten. In unsererm Beispiel nennen wir das Vokabular „Menüstruktur“ und tragen die Terms „Projekte“ (in der ersten Hierarchiestufe) und darunter „ProjektA“, „ProjektB“ und „ProjektC“ als untergeordnete Begriffe ein.

     
  2. Jetzt verknüpfen wir die Taxonomy mit allen Inhaltstypen, für die sie gelten soll. Die Vorgehensweise hat sich gegenüber Drupal 6 geändert. Wie es geht, ist hier beschrieben: http://www.webtotum.de/blog/drupal-7-url-aliase-automatisch-taxonomy-ter... Achtung: Das Modul Menu Position erlaubt nur einen Taxonomy-Begriff pro Node! Daher sollte man unbedingt bei der Verknüpfung der Taxonomy mit den Inhaltstypen den Wert für „Anzahl von Werten“ auf 1 setzen, damit später nicht ein User versehentlich mehrere Begriffe mit einer Node verknüpft.

     
  3. Anschließend definieren wir passende „Patterns“ für die URL-Aliase von Pathauto. In unserem einfachen Beispiel legen wir nur den Default path pattern fest. Bei umfangreicheren Seiten wird man ggf. separate Patterns für unterschiedliche Inhaltstypen definieren. Dazu gehen wir in der Seitenadministration auf „Verwaltung >> Konfiguration >> Suche und Metadaten >> Lesbare URLs“ und klicken auf den Tab „Patterns“. Dort tragen wir bei „Default path pattern (applies to all content types with blank patterns below)“ den Wert [node:taxonomy-vocabulary-1:name]/[node:title] ein

     
  4. Als nächstes installieren und aktivieren wir das Modul Menu Position. http://drupal.org/project/menu_position

     
  5. Nun erstellen wir die Regeln, nach denen die einzelnen Nodes anhand ihrer URL-Aliase (= Pfade) den jeweiligen Menüpunkten zugeordnet werden sollen. Dazu gehen wir auf „Verwaltung >> Struktur >> Menu position rules“ und wählen „Add menu position rule“. Auf der folgende Seite geben wir der Rule einen Administrative title. Dieser dient nur zur Identifizierung der Rule in der Admin-Ansicht und erscheint sonst nirgends. Dann wählen wir den Parent menu item, d.h. den Menüpunkt, dem diese Regel zugeordnet wird, aus. Unter Conditions läßt sich die Regel jetzt noch auf bestimmte Inhaltstypen oder Sprachen einschränken. Das haben wir in unserem Fall nicht gebraucht und daher weggelassen. Wichtig ist jedoch die Angabe der Seiten, für die die Regel gelten soll. Hier geben wir den Pfad projekte/projekta/* mit einem Sternchen am Ende ein. Damit gilt diese Regel für alle Nodes deren Pfad mit projekte/projekta anfängt.
    Drupal7 Menu postion rule erstellenAuf diese Weise legen wir für jeden Menüpunkt eine Regel an und ordnen dieser den jeweiligen Pfad aller Nodes zu, die dazu gehören.

    Achtung: Die Regeln werden in der Reihenfolge abgearbeitet in der sie in der Übersicht stehen. Wird, wie in unserem Beispiel, die Hierarchie der Taxonomie verwendet, so müssen die Regeln, die am tiefsten in die Hierarchie hinuntergehen, oben stehen, wohingegen die oberen Ebenen ans Ende wandern. Der Grund: Durch den Platzhalter „*“ am Ende eines Pfades werden alle nachfolgenden Regeln mit erfasst und somit nicht ausgeführt. In unserem Beispiel lautet die Regel für den Menüpunkt „Projekte“ „projekte/*“. Stünde diese Regel am Anfang der Liste, so würden auch alle Nodes von ihr erfasst, deren Pfad „projekte/projekta/*“, „projekte/projektb/*“ oder „projekte/projektc/* lautet und unterhalb des Menüpunktes „Projekte“ statt unter ihrem eigenen Menüpunkt eingeordnet. Der folgende Screenshot zeigt die korrekt Sortierung der Rules:
    Drupal7 korrekte Sortierung der Menu position rules

     
  6. Als nächstes werfen wir einen Blick in das Menü, dem wir die Regeln zugeordnet haben. Dies erreichen wir über „Verwaltung >> Strukture >> Menüs“ dort wählen wir das entsprechende Menü (hier ist es das „Main Menu“, in Drupal 6 „Primary Links“ genannt) und klicken auf „Links auflisten“. Wie man auf dem Screenshot sieht, sind die Rules für die Projekte A bis C direkt unter dem jeweiligen Menüpunkt eingehängt. Nur der für die Projekteübersicht steht ganz unten. Wir verschieben ihn jetzt durch anklicken des kleinen Kreuzes mit den vier Pfeilen links neben der Bezeichnung und ziehen mit der Maus direkt unter seinen Menüpunkt. Damit die Änderungen wirksam werden, muss man unbedingt auf „Konfiguration speichern“ klicken, bevor man die Seite verläßt. Aber zum Glück weist einen Drupal ja darauf hin.
    Drupal7 geänderte Menüzuordnung von Menu position Rules


    Den Grund für das Umsortieren sieht man, wenn man mal auf einen Beitrag in der Projektübersicht klickt. Auf dem folgenden Screenshot sieht man, was Menu Position Rule macht: Es blendet einen Link zu der Node innerhalb des Menübaumes ein, und zwar exakt an der Stelle an der die Rule ihren Eintrag im Menü vorgenommen hat. In diesem Beispiel unterhalb des Menüpunkte „Projekt C“
    Drupal7 Eintrag von Menu Positon Rule an falscher Stelle im Menübaum

    Nach dem Umsortieren des Menübaumes steht der Eintrag an der richtigen Stelle:
    Drupal7 an richtige Stelle verschobener Eintrag von Menu position rule

     

  7. Möchte man diesen Eintrag im Menübaum nicht haben, so kann man ihn per CSS ausblenden. Menu Position weißt seinem Eintrag eine eigene Klasse „menu-position-link“ zu. Man sieht das sehr schön auf dem folgenden Screenshot mit aktiviertem Firebug.
    Drupal7 Anzeige der CSS-Klasse von Menu Position in Firebug

 


So, das war's soweit. Damit läßt sich relativ leicht der aktive Menu-Trail und eine korrekte Breadcrumb erstellen.