Der merkwürdige Fall des Phantomnavigationsdekorators, der auf Magentos EE-Cache stößt

12

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-actionAttribut 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-XKlasse (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 activeSaite 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

  1. Zuerst prüfen Sie, ob unter EE-Cache an die Variable, $child->getPositionClass()die ausgegeben nav-2wird, tatsächlich keine anderen (vermutlich) Klassenwerte angehängt wurden. Es tut nicht.

  2. Sie überprüfen, ob eines von Magentos vielen Decorator-JS-Skripten in der Navigationsliste nicht ausgeführt wird. Es ist nicht.

  3. Vielleicht ist es tatsächlich etwas Seltsames /js/varien/menu.js. Aber Sie haben diese Kernskripte bereits ausgeschlossen, wie Sie es immer tun.

  4. 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 activein - <script>Tags. Du findest nichts.

  5. 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.

  6. Sie kehren zu Ihrer Topmenu.phpKlasse zurück und entfernen das Datenattribut. Das Problem hört auf. Was zum Teufel.

  7. 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.

  8. 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_afterEreignis, das möglicherweise von einem anderen Element verwendet wird, um das Markup von außerhalb zu hacken. Nichts.

  9. Was. Ist. Ereignis. Hier.

Die Antwort

Erklären Sie dies den Backend-Entwicklern. Jeder handelt verwirrt. Bis um...

Brendan Falkowski
quelle

Antworten:

10

Jemand knackt auf:

app/code/core/Enterprise/PageCache/Model/Container/Catalognavigation.php
Method: saveCache()
Line 107

Sie sehen einen bösen kleinen regulären Ausdruck:

if (preg_match('/(?<=\s|^)nav-.+?(?=\s|$)/', $classValue, $matches)) {
    $categoryUniqueClasses .= ($categoryUniqueClasses ? ' ' : '') . $matches[0];
}

Welches ist etwas Teufelei zur Anpassung nav-innerhalb dieser <li>. Nur damit du dich erinnerst:

<li class="nav-1">
    <a data-ui-action="nav-1" href="#">Bazzow</a>
    <div class="menu"> ... </div>
</li>

Magento erwartet, dass nur nav-Zeichenfolgen auf <li>Elementen gefunden werden, aber der Wert Ihres Datenattributs wird abgeglichen und gehackt. Nicht wollen.

Verwenden Sie also ein anderes Klassen- und Datenattribut wie i-have-a-child-.

Das Phantom

Ein richtiger Mann macht sein eigenes Glück, Billy Zane.

Brendan Falkowski
quelle
1
"Super" Problem und Erklärung!
Anna Völkl
haha wow , die eigentlich ziemlich verrückt ... In einem Modell des vollständigen Seiten - Cache - Modul ... upvoted
Erfan