Drupal: Menüpunkt auf Basis der Taxonomieauswahl generieren

Dieser Eintrag beschreibt die dynamische Erzeugung von Menüpunkten auf Basis eines Taxonomie Auswahlfeldes (select-Auswahl).

Dabei wird der neu erstellte Node auf Basis des ausgewählten Wertes in einer anderen Position der Menüstruktur automatisch eingeordnet.
Hiermit trennen wir logische Anforderungen (Bereichsauswahl) von der technischen Menüeinordnung (die für normale Benutzer häufig zu komplex ist!)

Beispiel Menüstruktur:
- Bereich A
-- Eintrag A-A
-- Eintrag A-B
-- Eintrag A-C
- Bereich X
-- Bereich B
--- Eintrag B-A
--- Eintrag B-B
--- Eintrag B-C
-- Bereich C
--- Eintrag C-A
--- Eintrag C-B
--- Eintrag C-C

Beispiel Auswahl:
- Bereich A
- Bereich B
- Bereich C

Ich habe dazu die folgende Lösung gewählt:

Ausgangsbedingungen:
- Drupal 6
- Rules-Modul (http://www.drupal.org/project/rules)
- Taxonomie-Modul mit Auswahlfeld

Vorgehensweise:
Neue Regel anlegen:

Entsprechenden Node-Typ als Auswahlregel verwenden bei Aktion: "Inhalt soll gespeichert werden".
Aktion "Menüpunkt taxonomiebasiert erzeugen" (oder ähnlich) als selbst definierte PHP Aktion anlegen.

Aktion mit folgendem Code bestücken:

  1. //Taxonomie-Einordnung holen
  2. $termId = $node->taxonomy[3];
  3.  
  4. //Elternmenü-Eintrag zu Term ermitteln
  5. $term_to_menu_parent = array(
  6.     14 => 72,
  7.     59 => 430,
  8.     22 => 372,
  9. );
  10.  
  11. if(isset($term_to_menu_parent[$termId])){
  12.   $node->menu['link_title'] = $node->title;
  13.   $node->menu['plid'] = $term_to_menu_parent[$termId];
  14.   $node->menu['hidden'] = 1;
  15. }
  16.  
  17. return array('node' => $node);

Wichtig ist an dieser Stelle noch:

  • Anzugeben, ob der Eintrag unsichtbar sein soll, was über den "hidden"-Parameter erfolgt.
  • Das "$term_to_menu"-Array anzupassen, welches angibt, bei welcher Term-ID (aus der Taxonomieauswahl) welcher Eltern-Menüeintrag verwendet wird, um das neue Kindelement zu erzeugen.

Es gilt zu beachten, dass durch die gewählte Aktion auch die Änderung von Nodes abgedeckt wird! In diesem Fall wird der alte Menüpunkt gelöscht und ein neuer erzeugt.