Mach dich bereit für einen verrückten. Daher passe ich die primäre Katalognavigation an, um ein zustandsreiches Benutzeroberflächenverhalten zu erstellen, das mehrere Interaktionsmodelle (Menüs, Dropdowns, Modale usw.) auf verschiedenen Geräten verarbeitet. So wie du es tust.
Das bedeutet, dass diese Klasse / Methode überschrieben wird:
app/code/core/Mage/Page/Block/Html/Topmenu.php :: _getHtml()
So erstellen Sie eine HTML-Ausgabe (etwas vereinfacht):
<ul class="nav-list">
<li class="nav-1">
<a data-ui-action="nav-1" href="#">Bazzow</a>
<div class="menu"> ... </div>
</li>
<li class="nav-2">
<a data-ui-action="nav-2" href="#">Bazinga</a>
<div class="menu"> ... </div>
</li>
</ul>
Das ist bis auf das data-ui-action
Attribut ziemlich langweilig . Hier passiert die JS-Magie. Wenn Sie auf Elemente mit diesem Attribut klicken, wird der Status der Benutzeroberfläche aktualisiert. Sie haben es erraten, die li.nav-X
Klasse (die Magento hinzufügt) fungiert als mein Hook, um den UI-Status an das aktivierte Element zu binden.
Alles gut, richtig? Aktivieren Sie den EE-Cache. Alles in ordnung Falsch.
Befindet sich die angezeigte Seite in der Kataloghierarchie von Bazinga (aka nav-2
), wird plötzlich Folgendes angezeigt :
data-ui-action="nav-2 active"
Wer hat die böse active
Saite hinzugefügt ? Das Phantom ist wer.
Und jetzt schlägt Ihr UI-Status fehl, da der Wert des Datenattributs nicht mehr mit der <li>
Klasse übereinstimmt . Jage das Phantom.
Die Jagd
Zuerst prüfen Sie, ob unter EE-Cache an die Variable,
$child->getPositionClass()
die ausgegebennav-2
wird, tatsächlich keine anderen (vermutlich) Klassenwerte angehängt wurden. Es tut nicht.Sie überprüfen, ob eines von Magentos vielen Decorator-JS-Skripten in der Navigationsliste nicht ausgeführt wird. Es ist nicht.
Vielleicht ist es tatsächlich etwas Seltsames
/js/varien/menu.js
. Aber Sie haben diese Kernskripte bereits ausgeschlossen, wie Sie es immer tun.Vielleicht ist es ein verrückter Inline-JS, von dem Sie nie erfahren würden, dass ein Modul aus der PHP-Klasse gerendert wird. Suchen Sie die Seite Quelle für
active
in -<script>
Tags. Du findest nichts.Vielleicht ist es ein anderer verrückter JS, den Magento benötigt, der aber extern geladen wird. Sie deaktivieren JS im Browser, aber das Phantom lebt.
Sie kehren zu Ihrer
Topmenu.php
Klasse zurück und entfernen das Datenattribut. Das Problem hört auf. Was zum Teufel.Sie fragen sich, ob ein anderes Attribut für dasselbe Element nicht ordnungsgemäß mit Anführungszeichen versehen ist (hey, viele Klassenanfügungen finden dort statt). Sie tauschen also die Reihenfolge der Attribute aus und entfernen sie in verschiedenen Kombinationen. Kein Würfel. Wenn das Datenattribut vorhanden ist, ist auch das Phantom vorhanden.
Sie fragen sich, was passiert, wenn es nicht diese PHP-Klasse ist, die die Tat vollbringt? Es gibt ein ausgelöstes
page_block_html_topmenu_gethtml_after
Ereignis, das möglicherweise von einem anderen Element verwendet wird, um das Markup von außerhalb zu hacken. Nichts.Was. Ist. Ereignis. Hier.
Die Antwort
Erklären Sie dies den Backend-Entwicklern. Jeder handelt verwirrt. Bis um...