Ungewolltes Öffnen des Untermenüs - Bug?
Hallo,
ich habe diese Thema hier im Forum schon öfter angesprochen gefunden, jedoch habe ich nicht die Lösung für das Problem entdeckt.
Es gibt bei dem Modul mootoolsnav, um das ich sehr dankbar bin, ein Problem wenn eine Seite aufgerufen wird, die im Menü versteckt ist. Ruft man solch eine Seite auf so wird der Menüpunkt aufgeklappt, der nach dem Aufgerufenen mit der versteckten Unterseite als erstes sichtbare Untermenüpunkte hat. Das klingt kompliziert deshalb vielleicht konkret an meiner Seite erklärt:
http://www.tktbg.macciato-testen.de/
Wählt man auf der Seite den Menupunkt Fotos kommt man zur Galerieübersicht. Wählt man eine Galerie aus, so wird eine Unterseite geöffnet, die im Menü versteckt ist. Nach dem Öffnen dieser Seite wird der Menüpunkt Kontakt ausgeklappt, weil dies der erste mit sichtbaren Untermenüpunkten ist. Den gleichen Erfolg erzielt man, wenn man einen Gästebucheintrag erstellen will. Die Seite mit dem Formular für einen neuen Gästebucheintrag ist im Menü auch versteckt.
Im Backend habe ich für die Navigation als Stoplevel die 2 eingetragen und ein Häkchen bei Hardlimit gesetzt.
Wie bereits erwähnt, das Problem wurde schon mehrfach angesprochen und sollte ich blinderweise die Lösung übersehen haben so tut mir das Öffnen des neuen Themas leid.
Ich würde das tolle Modul gerne weiter einsetzen und aus diesem Grund hoffe ich, dass mir jemand (vielleicht der Entwickler?) mit einer Lösung weiterhelfen kann.
Hierfür schon ein mal vielen Dank im Voraus.
Und hier kommt die Lösung (zum Bug?)
Ich habe mich heute nochmal hingesetzt und das Ganze mal durchgedacht. Ich besitze mittlerweile schon langjährige Erfahrung in Sachen Softwareentwicklung, allerdings habe ich mit PHP noch so gut wie nichts gemacht und schon gar kein Modul für Typolight geschrieben. Deshalb vergebt mir, wenn die Lösung des Problems aus Sicht eines Senior-PHP-Typolight-Modul-Programmierers nicht optimal ist. Jedenfalls sollte meine Lösung updatesicher sein, da sie sich alleinig auf die Datei nav_moomenu.tpl bezieht, von der man bitte eine Kopie im allseits bekannten Ordner templates auf der obersten Verzeichnisebene anlegt.
Nun aber zur Lösung:
Das Problem ist, und das wurde auch schon in anderen Forumsbeiträgen geschrieben, dass bei einer Unterseite, die nicht im Menü erscheinen soll, die Variable $GLOBALS['activemenuaccord'] nicht auf -1 gesetzt wird. Dies hat das Fehlverhalten des Menüs zur Folge, das ich oben beschrieben habe. Die Variable permanent auf diesen Wert zu setzen ist meines Erachtens eine unschöne Lösung und hat in meinem Fall auch nicht zum gewünschten Verhalten des Menüs geführt.
Nun zu den erforderlichen Ergänzungen in der Datei nav_moomenu.tpl
Bitte ganz zu Beginn
PHP-Code:
<?php
$togglerlevel = 'level_1';
$menulevel = 'level_2';
?>
durch
PHP-Code:
<?php
$togglerlevel = 'level_1';
$menulevel = 'level_2';
$act_request_in_menu = false;
$request = ampersand($this->Environment->request, ENCODE_AMPERSANDS);
?>
ersetzen.
Nach der Zeile
PHP-Code:
<?php foreach($this->items as $item): ?>
bitte folgendes ergänzen:
PHP-Code:
<?php
if(strpos($request, $item['href']) !== false){$act_request_in_menu = true;}
?>
Am Ende der Datei bitte nach
PHP-Code:
<?php endforeach; ?>
folgendes einfügen:
PHP-Code:
<?php
if(!$act_request_in_menu){$GLOBALS['activemenuaccord']=-1;}
?>
Mit meiner Lösung wird die -1 nur gesetzt wenn die angeforderte Seite nicht im Menü enthalten ist.
Nur aus Interesse: Sollte der Auto des Moduls mal hier vorbeischauen, würde ich mich über ein kurzes Feedback zu meiner Lösung des Bugs, sofern es denn eine ist, freuen. Vielleicht ist das auch unnötig kompliziert und wäre einfacher gegangen...
Mein Problem ist jedenfalls gelöst. Ich hoffe, dass ich auch anderen weiterhelfen kann.
Lösung des Problems - 2. Versuch
...da war ich wohl heute Nachmittag in meiner Euphorie mit der Verkündung der Lösung ein wenig vorschnell. Ich hatte nämlich noch nicht ganze verstanden, wie das Menü erzeugt wird und die Rekursion, die da wohl im Spiel ist, nicht berücksichtigt. Ich musste bei meiner jetzigen Lösung auf eine globale Variable zurückgreifen und der Reset dieser Variablen macht mir die Updatesicherheit futsch:
Die Lösung sieht nun wie folgt aus
In der Datei ModuleMootoolsNav.php bitte nach
PHP-Code:
if ($this->defineRoot && $this->rootPage > 0)
{
$trail = array($this->rootPage);
$level = 0;
}
die Zeile
PHP-Code:
$GLOBALS['act_request_in_menu'] = false;
einfügen.
In der Datei mod_mootoolsnav.tpl den Anfang von
PHP-Code:
<?php if (!isset($GLOBALS['activemenuaccord'])) $GLOBALS['activemenuaccord']=-1;
?>
in
PHP-Code:
<?php if (!isset($GLOBALS['activemenuaccord'])) $GLOBALS['activemenuaccord']=-1;
if($GLOBALS['act_request_in_menu'] == false)$GLOBALS['activemenuaccord']=-1;
?>
abändern.
Abschließend in der Datei nav_moomenu.tpl den Anfang ändern:
PHP-Code:
<?php
$togglerlevel = 'level_1';
$menulevel = 'level_2';
$request = ampersand($this->Environment->request, ENCODE_AMPERSANDS);
?>
Ganz zum Schluss noch in der selben Datei nach der Zeile
PHP-Code:
<?php foreach($this->items as $item): ?>
folgenden Codeabschnitt einfügen:
PHP-Code:
<?php
if(strpos($request, $item['href']) !== false && $item['href'] !== '/'){
$GLOBALS['act_request_in_menu'] = true;
}
?>
Das sollte es nun aber wirklich gewesen sein. Bei mir funktioniert jetz wirklich alles tadellos. Vielleicht hat der Andreas eine bessere Lösung parat und liefert sie mit dem nächsten update mit, wär toll...