Preparati per uno strano. Quindi sto personalizzando la navigazione del catalogo principale per creare un comportamento dell'interfaccia utente pieno di stato che gestisca più modelli di interazione (menu, menu a discesa, modali, ecc.) Su tutti i dispositivi. Come fai tu.
Ciò significa sovrascrivere questa classe / metodo:
app/code/core/Mage/Page/Block/Html/Topmenu.php :: _getHtml()
Per produrre output HTML in questo modo (in qualche modo semplificato):
<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>
Ora, questo è piuttosto noioso / standard tranne per l' data-ui-action
attributo. Ecco dove accade la magia di JS. Qualsiasi clic su elementi con tale attributo aggiorna lo stato dell'interfaccia utente. Hai indovinato, la li.nav-X
classe (che aggiunge Magento) funge da hook per associare lo stato dell'interfaccia utente all'elemento attivato.
Va bene, vero? Attiva cache EE. Va bene vero? Sbagliato.
Se la pagina che stai visualizzando si trova all'interno della gerarchia del catalogo di Bazinga (aka nav-2
), improvvisamente vedrai questo:
data-ui-action="nav-2 active"
Chi ha aggiunto la brutta active
stringa? Il fantasma è chi.
E ora il tuo stato dell'interfaccia utente non riesce, perché il valore dell'attributo di dati non corrisponde più alla <li>
classe. Dai la caccia al fantasma.
La caccia
Innanzitutto, controlla che nella cache EE la variabile
$child->getPositionClass()
quali outputnav-2
non abbia effettivamente altri valori di classe (presumibilmente) aggiunti. Non è così.Verifichi che uno dei tanti script JS decoratore di Magento non sia in esecuzione nell'elenco di navigazione. Non è.
Forse in realtà è una cosa strana
/js/varien/menu.js
. Ma hai già escluso quegli script di base come fai sempre.Forse è un JS in linea pazzo che non sapresti mai che un modulo fa fuori dalla classe PHP. Cerca l'origine della pagina
active
all'interno dei<script>
tag. Non trovi niente.Forse è qualche altro pazzo che JS Magento richiede ma carica esternamente. Disabiliti JS nel browser, ma il fantasma vive.
Torna alla tua
Topmenu.php
classe e rimuovi l'attributo data. Il problema si ferma. Che diavolo.Ti chiedi se un altro attributo sullo stesso elemento non sia correttamente racchiuso tra virgolette (ehi, molte accodamenti di classe si verificano lì). Quindi si scambia l'ordine degli attributi e li si rimuove in varie combinazioni. Niente da fare. Se l'attributo di dati è presente, lo è anche il fantasma.
Ti chiedi cosa succede se non è questa classe PHP a compiere l'atto? C'è un
page_block_html_topmenu_gethtml_after
evento inviato che qualcos'altro potrebbe usare per hackerare il markup dall'aldilà. Niente.Che cosa. È. Happening. Qui.
La risposta
Spiega tutto ciò agli sviluppatori back-end. Tutti si comportano confusi. Fino a...