Geteiltes Menü erstellen
Eine häufig benötigte Menüstruktur ist folgende, die auch in dem nebenstehenden Bild dargestellt wird.
Man möchte ein horizontales Hauptmenü haben, und pro Unterseite dann einen Block links oder rechts, in dem die Unter-Menüpunkte ab dem zweiten Level angezeigt werden.
Eigentlich auch gar kein Problem: Man erzeugt das horizontale Menü als Primary Links, und erstellt für jede Seite ein eigenes Menü, das dann als Block an den entsprechenden Stellen eingeblendet wird. Aber genau da ist der Haken. Wenn der Menüblock auf einer Seite eingeblendet werden soll, dann passiert das nicht von alleine, sondern man muss es in der Konfiguration des Blockes eintragen.
Sinn würde es ja machen, wenn der Block dann automatisch auf jeder Seite angezeigt würde, die einem Submenü hinzugefügt wird. Dies kann man mit dem Folgenden kleinen Snippet erreichen:
<?php
if ($_GET['q'] == 'node/3') {
return TRUE;
}
$item = menu_get_item(NULL, $_GET['q']);
while ($item['pid'] && ($item = menu_get_item($item['pid'])));
return ($item['title'] == 'Name des Submenüs');
?>
Man muss natürlich dafür "Diesen Block nur auf den aufgelisteten Seiten anzeigen:" auf PHP stellen: "Nur anzeigen, wenn der folgende PHP-Code TRUE zurückgibt (PHP-Modus für Experten)".
Der obere Teil mit node/3 gibt die Seite an, die über den Primary Link erreicht wird, da diese ja nicht im Submenü enthalten ist. Bei "Name des Submenüs" tragt ihr dann den Namen des jeweiligen Submenüs (natürlich für jeden Block ein anderer) ein. Leerzeichen sind hier erlaubt.
Es wäre sicherlich schön, noch eine Verbindung zwischen dem jeweiligen Submenü und dem jeweiligen Primary Link zu haben, da man das Ganze dann noch vereinfachen könnte, aber so funktioniert es auf jeden Fall erstmal. Vielleicht postet ein Entwickler ja noch Verfeinerungen.
Vielen Dank an Thilo Wawrzik für die Erstellung des Snippets.
Anhang | Größe |
---|---|
menu-geteilt-3.jpg | 28.48 KB |
- Anmelden oder Registrieren um Kommentare zu schreiben
Wozu der Umweg? Diesen Block
am 29.09.2007 - 15:45 Uhr
Wozu der Umweg? Diesen Block nur auf den aufgelisteten Seiten anzeigen: Node/3! Fertig! Ohne PHP!
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Alternative
am 29.09.2007 - 16:24 Uhr
@Spartacus: Es geht darum, den Block automatisch auf allen Seiten anzuzeigen, die von dem Submenü aus verlinkt sind. Nicht nur auf node/3 ...
Eine Alternative zu dieser Lösung ist das Modul 'Menu Block Split' (http://drupal.org/project/menu_block_split), mit dem eine ähnliche Aufteilung möglich ist. Voraussetzung ist hier aber, dass alle Menüpunkte in EINEM Menü enthalten sind und nicht über 'Primary links' und das Navigationsmenü verteilt sind.
ach kapitsche logisch wenn
am 09.01.2009 - 12:20 Uhr
ach kapitsche logisch wenn ich auf ein Link klicke, verschwindet der ja,stimmt! es sei den ich trag jedes mal die URL mit ein, aber das wäre ja Zeitverschwendung!
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Menu Block Split - Patch
am 14.02.2008 - 16:20 Uhr
Das Modul 'Menu Block Split' in der Version 5.x-1.1 hat einen Bug. Dieser verursacht, daß der Block mit dem Untermenü beim Anzeigen der Seite des Untermenüpunktes nicht mehr angezeigt wird. Nur die Untermenüpunkte des zuerst erstellten Hauptmenüpunkt werden noch angezeigt.
Hier ein Beispiel, das den Bug verständlich aufzeigt:
- Du machst zuerst einen Menüpunkt 'Obst' in der ersten Menüebene und dazu eine Seite 'Obst'.
- Dazu machst Du einen untergeordneten Menüpunkt 'Äpfel' und eine Seite dazu.
- Dann machst Du eine Seite 'Gemüse' mit einer entsprechenden Seite.
- Dazu machst Du einen untergeordneten Menüpunkt 'Karotten' und eine Seite dazu.
- Wenn dann die Seite 'Karotten' angezeigt wird, verschwindet das untergeordnete Menü. Wenn es unter 'Gemüse' also noch weitere untergeordnete Menüpunkte wie z. B. 'Sellerie' gäbe, könnte man nicht direkt darauf zugreifen, sondern müsste über den 'zurück-Button' des Browsers oder den Hauptmenüpunkt 'Gemüse' gehen.
Hier ist ein Patch um den Bug zu beheben:
http://drupal.org/node/201822#comment-672746
Oder hier gleich der Patch:
function menu_block_split_is_child($parent, $child) {
$item = menu_get_item($parent);
if (is_array($item['children'])) {
if (in_array($child, $item['children'])) {
return TRUE;
}
else {
foreach ($item['children'] as $c) {
if (menu_block_split_is_child($c, $child) == TRUE) {
return TRUE;
}
}
}
}
return FALSE;
}
Diesen Code in der Datei 'menu_block_split.module' anstatt des dort vorhandenen Codes ab
'function menu_block_split_is_child($parent, $child) ...
einsetzen (letzte Funktion in der Datei).
Also nach langem
am 02.09.2008 - 23:52 Uhr
Also nach langem rumprobieren habe ich herausgefunden, das diese Funktionalität auch ohne das Modul "Menu Block Split" funktoniert.
Zu Eräuterung folgende Struktur wollte ich umsetzen:
Hauptpunkt A
Hauptpunkt B
Hauptpunkt C
Als erstes habe ich die Hauptmenüpunkte als "Primary Links" angelegt. Dabei zeigt der Link immer jeweils auf den ersten Unterpunkt. Anschließend musste ich noch 3 weitere Menüs für die Unterpunkte der jeweiligen "Pirmary Links" anlegen.
Jetzt kommt das entscheidene. Alle Inhalte, welche zu einem Hauptmenüpunkt und deren Untermenüpunkte gehören, bekamen einen URL Prefix im URL-Alias (z.B. haupt-a/unterpunkt-a1 oder haupt-b/unterpunkt-b1).
Nun geht zur Block-Administration und legt die 3 zusätzlichen Menüs in die linke Leiste. Jetzt muss in der Block-Konfiguration für jeden der 3 Blöcke nur noch unter "Sichtbrakeitseinstellungen" eingestellt werden, dass der Block nur bei aufgelisteten Seiten angezeigt werden soll. In den entsprechenden Feld wird dann einfach haupt-a/* eingetragen werden.
Die URL-Aliase habe ich mit dem Modul "Pathauto" unter Verwendung der Taxonomie automatisch erstellen lassen.
Es gibt bei dieser Methode genau wie mit dem Modul "Menu Block Split" das problem, das man den "Primary Link" nicht nocheinmal ein das Untermenü mit aufnehmen sollte, da hier untergeortnete Menüpunkte dann nicht mehr aufgeklpatt werden.
--------
Active-Media-Production
Individual Web Development and Design
--------
Active-Media-Production
Individual Web Development and Design
Hab das Problem auch gehabt
am 08.01.2009 - 21:35 Uhr
Hab das Problem auch gehabt und folgendermaßen gelöst (Drupal 6)
Primary Links erstellt und ganz normal ausgegeben. Dann jeweils eine zweite Ebene hinzugefügt und folgenden Code in die Template.php:
function themeSubMenu($values){
global $base_path;
$output = '';
$class='';
$menArr = menu_tree_page_data($values);
foreach($menArr as $key=>$value){
if($value['link']['in_active_trail'] == 1){
foreach($value['below'] as $subKey=>$subValue){
if($subValue['link']['in_active_trail'] == 1){
$class="hl";
}
$output .= '<li><a href="'.$base_path.drupal_get_path_alias($subValue['link']['link_path']).'"'.
.' class="'.$class.'">'.$subValue['link']['link_title'].'</a></li>';
}
}
}
return $output;
}
Das ganze in der page.tpl.php dann dort wo das Submenü hin soll mit:
print themeSubMenu('primary-links');
aufrufen.
Das ist momentan nur für bis zu 2 Ebenen gedacht, kann aber auch erweitert werden.
mehr Details dazu:
http://www.ebugz.de/drupal-6-getrenntes-untermenu/
Gute Lösung
am 09.01.2009 - 06:32 Uhr
Nicht schlecht. Ich glaube allerdings, mit dem Erscheinen von http://drupalmodules.com/module/menu-block Menu Block hat sich mein Artikel überholt...
Nölle alaaf!
Danke für den Hinweis auf das Modul
am 09.01.2009 - 10:37 Uhr
Denke damit geht es dann natürlich deutlich komfortabler ;) wenn auch mit dem Nachteil eines weiteren Moduls auf der Seite.
Grüße
In welche Datei kopiert man
am 06.06.2010 - 09:46 Uhr
In welche Datei kopiert man den Code denn rein?
Das stand in der Antwort 3
am 06.06.2010 - 20:08 Uhr
Das stand in der Antwort 3 weiter oben: in die template.php Datei Deines Themes.
Wenn diese Datei nicht da ist, selbst im Verzeichnis Deines Themes eine anlegen.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Menu Block
am 06.06.2010 - 22:09 Uhr
Also wie gesagt: erstmal Menu Block probieren, dann rumcoden :)
Seit es Menu Block gibt, habe ich bisher noch keine Situation gefunden, wo ich was anderes gebraucht habe.
Ist evtl. ein bisschen fummlig, bis man begriffen hat, welche Ebene des Menüs man anspricht, aber dann lüppt es wie ein Golf 2.
Mit Context gehts auch
am 23.07.2010 - 09:35 Uhr
Submenü-Blöcke kann man so auch ganz gut mit dem Modul Context steuern. Man hat dann nebenbei die Funktionalität von Context auch noch für andere Zwecke (z.B. dynamische Templates für spezielle Seiten) zur Verfügung.
Man erstellt dazu einen Context für jedes Hauptlink (z.B. durch Pfad getriggert) uund fügt dann die gewünschten Menüblöcke als Action zu den gewünschten Seiten dazu.