Il curioso caso del decoratore di navigazione fantasma colpisce la cache EE di Magento


12

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-actionattributo. 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-Xclasse (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 activestringa? 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

  1. Innanzitutto, controlla che nella cache EE la variabile $child->getPositionClass()quali output nav-2non abbia effettivamente altri valori di classe (presumibilmente) aggiunti. Non è così.

  2. Verifichi che uno dei tanti script JS decoratore di Magento non sia in esecuzione nell'elenco di navigazione. Non è.

  3. Forse in realtà è una cosa strana /js/varien/menu.js. Ma hai già escluso quegli script di base come fai sempre.

  4. Forse è un JS in linea pazzo che non sapresti mai che un modulo fa fuori dalla classe PHP. Cerca l'origine della pagina activeall'interno dei <script>tag. Non trovi niente.

  5. Forse è qualche altro pazzo che JS Magento richiede ma carica esternamente. Disabiliti JS nel browser, ma il fantasma vive.

  6. Torna alla tua Topmenu.phpclasse e rimuovi l'attributo data. Il problema si ferma. Che diavolo.

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

  8. Ti chiedi cosa succede se non è questa classe PHP a compiere l'atto? C'è un page_block_html_topmenu_gethtml_afterevento inviato che qualcos'altro potrebbe usare per hackerare il markup dall'aldilà. Niente.

  9. Che cosa. È. Happening. Qui.

La risposta

Spiega tutto ciò agli sviluppatori back-end. Tutti si comportano confusi. Fino a...

Risposte:


10

Qualcuno si apre:

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

Vedi una brutta espressione regolare:

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

Che corrisponde a qualche diavoleria per nav-dentro questo <li>. Solo così ti ricordi:

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

Magento si aspetta di trovare solo nav-stringhe sugli <li>elementi, ma il valore dell'attributo dei dati viene confrontato e violato. Non voglio.

Quindi usa una classe e un attributo di dati diversi come i-have-a-child-.

Il fantasma

Un vero uomo fa fortuna, Billy Zane.


1
Problema e spiegazione "fantastici"!
Anna Völkl,

haha wow che in realtà è piuttosto pazzo ... In un modello del modulo cache a pagina intera ... aggiornato
Erfan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.