Unerklärliches Verhalten bei "Aktiv"-Stellung des Menüs
am 14.06.2007 - 23:32 Uhr in
Hi zusammen!
Verzweifelt versuche ich eine 3-fach strukturierte
Menüebene zu erreichen, bei der von den Eltern-Elementen
bis zum letzten Kind eine Klasse .active gesetzt wird.
(Die Menüs sind dabei "zerschnitten" an verschiedenen
Orten auf der Seite)
Das merkwürde:
Ganz wenige Menüs haben exakt das gewünschte Verhalten,
_alle_ anderen Menüeinträge nicht.
Dabei habe ich auch das Module "Sliced Menu" ausprobiert;
auch hier der selbe Fehler -- als würde hier ein Bug
in einer Hauptfunktion sein.
Das Thema "Aktivmachung eines Menüpunktes" wurde ja schon
besprochen und ich habe auch den weiter vorne geposteten
Code in die template.php eingebaut. Aber warum dieses
(für mich) nicht nachvollziehbare Verhalten?
Ist jemand schon mal was ähnliches aufgefallen? oder
noch besser: wie kann ich diesen Fehler beheben?
Dank und Gruß
Pfoto
P.S:
Ich verwende diesen Code in der template.php, aber auch
Versuche mit anderem Code brachten nicht das gewünschte
Ergebnis...
function phptemplate_menu_links($links) {
if (!count($links)) {
return '';
}
$level_tmp = explode('-', key($links));
$level = $level_tmp[0];
$output = "<ul class=\"links-$level\">\n";
$i = 0;
foreach ($links as $index => $link) {
$i++;
$output .= '<li';
if ($i == 1) {
if (stristr($index, 'active')) {
$output .= ' id="homeactive"';
}
$output .= ' class="home">' . l($link['title'], $link['href'],
$link['attributes'], $link['query'], $link['fragment'],$absolute, $html = TRUE) ."</li>\n";
} else {
if (stristr($index, 'active')) {
$output .= ' id="active"';
}
$output .= ">". l('<span>'.$link['title'].'</span>', $link['href'],
$link['attributes'], $link['query'], $link['fragment'],$absolute, $html = TRUE) ."</li>\n";
}
}
$output .= '</ul>';
return $output;
}
/**
* überschreibt theme_menu_item() aus includes/menu.inc
*
* fügt zusätzlich eine class 'active' für alle aktiven menupunkte zum <li>-element
*/
function phptemplate_menu_item($mid, $children = '', $leaf = TRUE) {
$item = menu_get_item($mid); // hole den jeweiligen menupunkt
if ((drupal_get_normal_path($item['path']) == $_GET['q']) // pfad aktiv?
|| (drupal_is_front_page() && $item['path'] == '<front>') // oder sind wir auf der startseite?
|| menu_in_active_trail($mid)) { // oder sind wir irgendwo im aktiven pfad, also in einem übergeordneten element des gerade angewählten?
$active = ' class="active"';
} else {
$active = '';
}
return '<li' . $active . '>' . menu_item_link($mid) . $children ."</li>\n";
}
- Anmelden oder Registrieren um Kommentare zu schreiben
Deine Seite zeigt ja das es
am 15.06.2007 - 12:00 Uhr
Deine Seite zeigt ja das es bei manchen geht und bei anderen nicht, versuche einfach zu ermitteln wo der Unterschied der beiden ist, vielleicht fehlt da einen Zuordnung von Kategorien, etc.
gruß pebosi
gruß pebosi
--
https://pebosi.net
Glaub mir, ich habe echt
am 15.06.2007 - 13:06 Uhr
Glaub mir, ich habe echt alles untersucht und verglichen,
was denn an den wenigen funktionierenden Menüitems so besonders ist,
was bei den anderen fehlt -- ich finde wirklich nichts!
Ich habe nun schon MenuTrails ausprobiert (es erscheint nach
dem Editieren und abschicken von Nodes dann immer eine weiße Seite),
SlicedMenü und TrimMenü. Die letztgenannten erfüllen durchaus
ihren Zweck, aber mein Problem besteht immer noch.
Auch verschiedene Code-Stücke aus dem deutschen und original
Drupal-Forum habe ich eingesetzt -- leider vergeblich!
Hat jemand eine solche 3-stufige Navigation mit Aktivierung
aller beteiligten Menüpunkte schon realisieren können?
Schade, dass das in Drupal so komplex ist. :-((
Gruß
Pfoto
Habs endlich hinbekommen
am 15.06.2007 - 23:14 Uhr
Meine Lösung ist bestimmt nicht astrein, aber für die die
es interessiert, hier mein vorgehen:
1.) Als Primary-Menü die erste, zweite und dritte Ebene erstellen
2.) Modul Trim-Menü installieren und damit die zweite Ebene trennen
Durch das Trim-Menü-Modul werden die zweiten Ebenen
automatisch zu Blöcken, die zur rechten Zeit (bei Klick
auf die erste Ebene) angezeigt werden.
3.) Für die dritte Ebene nun entsprechend weitere neue Menüs anlegen
(dies ist leider der große Nachteil, da man diese Ebene ja schon
im Primary-Menü anlegen musste...)
4.) Nun den folgenden Code in die Datei template.php einfügen:
function phptemplate_menu_links($links) {
if (!count($links)) {
return '';
}
$level_tmp = explode('-', key($links));
$level = $level_tmp[0];
$output = "<ul class=\"links-$level\">\n";
foreach ($links as $index => $link) {
$output .= '<li';
if (stristr($index, 'active')) {
$output .= ' id="active"';
}
$output .= ">". l('<span>'.$link['title'].'</span>', $link['href'],
$link['attributes'], $link['query'], $link['fragment'],$absolute, $html = TRUE) ."</li>\n";
}
$output .= '</ul>';
return $output;
}
/**
* überschreibt theme_menu_item() aus includes/menu.inc
* schaut, ob ein MenüItem im Pfad-Alias des gerade gewählten MenüItems ist
* fügt dann zusätzlich eine class 'active' für alle aktiven menupunkte zum <li>-element
*/
function phptemplate_menu_item($mid, $children = '', $leaf = TRUE) {
$item = menu_get_item($mid); // hole den jeweiligen menupunkt
if (stristr(drupal_get_path_alias($_GET['q']), drupal_get_path_alias($item['path']))) {
$active = ' class="active"';
} else {
$active = '';
}
return '<li' . $active . '>' . menu_item_link($mid) . $children ."</li>\n";
}
5.) Damit die letzte Funktion ihre Wirkung tut, muss in den Pfadangaben
immer auch der Pfad des Eltern-Menüitems hinzugefügt werden, als z.B.
"Produkte/Kleidung/Pullover"
Wenn nun der Eltern-Menüpunkt "Produkte/Kleidung/" feststellt, dass
dieser String auch in dem des gerade aktivierten Kind-Elementes vorkommt,
wird das "active" geschrieben.
Vielleicht finde ich ja mit der Zeit elegantere Lösungen,
aber vorerst fasse ich Drupal nicht mehr an ;-)
Gruß
Pfoto