Navigation aufteilen in Drupal 7

In diesem Artikel soll es darum gehen, wie man die verschiedenen Navigationsebenen von einander darstellen lassen kann. Man sieht ja oft im Internet, dass die erste Navigationsebene über/unter dem Header ist und die zweite und dritte in der rechten/linken Sidebar. Dieses habe ich versucht um zusetzten.
Als ersten brauchen wir die Funktion menu_navigation_links(), der wir den Namen der Navigation und die gewünschte Ebene übergeben. Wichtig ist, dass die erste Ebene, wie bei einem Array, der Null entspricht.

Beim Aufruf dieser Funktion erhält man dann ein Array mit dem Key der sich aus „menu-menuID“ und dem Status bildet. Ist der Menüpunk gerade aktiv (man ist gerade auf der Seite), so wird noch der Wert „active-trail“ hinzugefügt. Den Wert bildet ein assoziatives Array mit den Attributen zu. Ein Beispiel würde so aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
array(3)
{
  ["menu-166 active-trail"]=> array(3)
  {
    ["attributes"]=> array(1)
    {
      ["title"]=> string(5) "Ebene"
    }
    ["href"]=> string(6) "node/1"
    ["title"]=> string(5) "Ebene"
  }
}

Nun müssen wir an die Attribute ran kommen. Das habe ich mit zwei „foreach“-Schleifen gelöst und die Attribute in ein eindimensionales Array abgelegt, welches ich an die Drupal Funktion „l()“ übergebe. Diese Funktion generiert dann den richtigen Link, auch wenn die URL per ModRewrite umgeschrieben wird. Das ganze sieht dann ungefähr so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function getFirstLevelMenu()
{
  $menu = menu_navigation_links('navigation', 0);
 
  $output =  "<ul class=\"first-level-menu\">\n";
  foreach ($menu as $value)
  {
    foreach ($value as $k => $v)
    {
      $m[$k] = $v;
    }
    $output .= '<li>' . l($m['title'], $m['href'], $m['attributes']) . "</li>\n";
  }
  $output .= "</ul>\n";
 
  return $output;
}

Fertig ist die Generierung der ersten Ebene.

Nun benötigen wir eine Funktion, die die zweite und dritte Ebene ausliest. Der Anfang ist genau der gleiche wie bei der „getFirstLevelMenu()“-Funktion. Der einzige Unterschied ist nur, dass wir gleich die zweite Ebene auslesen, also eine 1 übergeben. Die eigentliche Änderung erfolgt vor dem schließenden LI-Tag. Dort wird die nächste Ebene ausgelesen. Sollte diese nicht leer sein, so werden wieder die Schleifen durchlaufen und die Werte an die Funktion „l()“ übergeben.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function getSecondLevelMenu($level = 1)
{
  $i = 0;
  $menu = menu_navigation_links('navigation', $level);
 
  $output .=  "<ul class=\"second-level-menu\">\n";
  foreach ($menu as $value)
  {
    foreach ($value as $k => $v)
    {
      $m[$k] = $v;
    }
    $output .= '<li>' . l($m['title'], $m['href'], $m['attributes']);
 
    $menu_2 = menu_navigation_links('navigation', $level++);
    if(!empty($menu_2) && 1>$i)
    {
      $output .=  "<ul class=\"third-level-menu\">\n";
      foreach ($menu_2 as $value_2)
      {
 
        foreach ($value_2 as $k_2 => $v_2)
        {
          $m_2[$k_2] = $v_2;
        }
 
        $output .= '<li>' . l($m_2['title'], $m_2['href'], $m_2['attributes']);
        $output .= "</li>\n";
      }
      $output .= "</ul>\n";
    }
 
    $output .= "</li>\n";
    $i++;
  }
  $output .= "</ul>\n";
  return $output;
}

Fertig ist die Funktion zum Auslesen der zweiten und dritten Navigationsebene.

Wichtig wäre anzumerken, dass ich erst seit ein paar Tagen mit Drupal arbeite. Somit kann ich nicht garantieren, dass es der beste Weg ist. Eventuell existiert ein einfacherer, schnellerer oder schlichtweg elleganteren Weg das Vorhaben zu verwirklichen. Sollten Sie einen besseren Weg kenne, so würde ich mich sehr über einen Kommentar freuen!

ALL-INKL.COM

Ein Kommentar zu dem Artikel “Navigation aufteilen in Drupal 7”