Przygotuj się na dziwne. Dlatego dostosowuję nawigację katalogu głównego, aby zbudować zachowanie interfejsu użytkownika z pełnym stanem, które obsługuje wiele modeli interakcji (menu, menu rozwijane, modały itp.) Na różnych urządzeniach. Tak jak ty.
Oznacza to zastąpienie tej klasy / metody:
app/code/core/Mage/Page/Block/Html/Topmenu.php :: _getHtml()
Aby wygenerować wynik HTML w ten sposób (nieco uproszczony):
<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>
Teraz jest to dość nudne / standardowe z wyjątkiem data-ui-action
atrybutu. To tam dzieje się magia JS. Wszelkie kliknięcia elementów o tym atrybucie aktualizują stan interfejsu użytkownika. Zgadłeś, li.nav-X
klasa (dodana przez Magento) działa jak mój haczyk, aby powiązać stan interfejsu użytkownika z aktywowanym elementem.
Wszystko dobrze, prawda? Włącz pamięć podręczną EE. Wszystko dobrze, prawda? Źle.
Jeśli przeglądana strona znajduje się w hierarchii katalogu Bazinga (aka nav-2
), nagle zobaczysz:
data-ui-action="nav-2 active"
Kto dodał paskudny active
ciąg? Fantom jest kim.
A teraz twój stan interfejsu kończy się niepowodzeniem, ponieważ wartość atrybutu danych nie pasuje <li>
już do klasy. Zapoluj na upiór.
Polowanie
Najpierw sprawdzasz, czy pod pamięcią podręczną EE do zmiennej,
$child->getPositionClass()
której dane wyjściowe wnav-2
rzeczywistości nie są dołączone inne (przypuszczalnie) wartości klasy. To nie.Sprawdzasz, czy jeden z wielu skryptów JS dekoratora Magento nie działa na liście nawigacji. To nie jest.
Może to naprawdę dziwna rzecz
/js/varien/menu.js
. Ale już wykluczyłeś te podstawowe skrypty, jak zawsze.Może to jakiś zwariowany wbudowany JS, którego nigdy nie wiadomo, że moduł renderuje się z klasy PHP. Wyszukaj źródło strony w
active
obrębie<script>
tagów. Nic nie znajdzieszMoże to jakiś inny zwariowany JS Magento wymaga, ale ładuje się na zewnątrz. Wyłączasz JS w przeglądarce, ale fantom żyje.
Wracasz do swojej
Topmenu.php
klasy i usuwasz atrybut danych. Problem ustaje. Co do cholery.Zastanawiasz się, czy inny atrybut tego samego elementu nie jest poprawnie zamknięty w cudzysłowie (hej, dzieje się tam wiele dopisywania klas). Więc zamieniasz kolejność atrybutów i usuwasz je w różnych kombinacjach. Nie ma kości. Jeśli atrybut danych jest obecny, to również fantom.
Zastanawiasz się co zrobić, jeśli nie jest to klasa PHP robi czyn? Jest
page_block_html_topmenu_gethtml_after
zdarzenie wywoływane przez coś innego, co może zhakować znaczniki z zewnątrz. Nic.Co. Jest. Wydarzenie. Tutaj.
Odpowiedź
Wyjaśnij to wszystkim twórcom backendu. Wszyscy zachowują się zdezorientowani. Aż do...