Préparez-vous pour une bizarre. Je personnalise donc la navigation du catalogue principal pour créer un comportement d'interface utilisateur complet qui gère plusieurs modèles d'interaction (menus, listes déroulantes, modaux, etc.) sur les appareils. Comme vous le faites.
Cela signifie remplacer cette classe / méthode:
app/code/core/Mage/Page/Block/Html/Topmenu.php :: _getHtml()
Pour produire une sortie HTML comme celle-ci (quelque peu simplifiée):
<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>
Maintenant, c'est assez ennuyeux / standard, sauf pour l' data-ui-action
attribut. C'est là que la magie JS se produit. Tout clic sur des éléments avec cet attribut met à jour l'état de l'interface utilisateur. Vous l'avez deviné, la li.nav-X
classe (que Magento ajoute) agit comme mon crochet pour lier l'état de l'interface utilisateur à l'élément activé.
Tout va bien, non? Activez le cache EE. Tout va bien, non? Faux.
Si la page que vous consultez se trouve dans la hiérarchie de catalogue de Bazinga (aka nav-2
), vous verrez soudain ceci:
data-ui-action="nav-2 active"
Qui a ajouté la active
chaîne méchante ? Le fantôme est qui.
Et maintenant, votre état d'interface utilisateur échoue, car la valeur de l'attribut de données ne correspond plus à la <li>
classe. Traquez le fantôme.
La chasse
Tout d'abord, vous vérifiez que sous EE cache la variable
$child->getPositionClass()
qui sortnav-2
n'a pas réellement (probablement) d'autres valeurs de classe ajoutées. Ce ne est pas.Vous vérifiez que l'un des nombreux scripts JS de Magento ne s'exécute pas dans la liste de navigation. Ce n'est pas.
C'est peut-être en fait quelque chose d'étrange
/js/varien/menu.js
. Mais vous avez déjà exclu ces scripts de base comme vous le faites toujours.Peut-être que c'est un JS en ligne fou que vous ne sauriez jamais qu'un module rend hors de la classe PHP. Recherchez les balises
active
dans la source de la page<script>
. Vous ne trouvez rien.Peut-être que c'est un autre JS Magento fou qui nécessite mais se charge en externe. Vous désactivez JS dans le navigateur, mais le fantôme vit.
Vous revenez à votre
Topmenu.php
classe et supprimez l'attribut de données. Le problème s'arrête. Que se passe-t-il.Vous vous demandez si un autre attribut sur le même élément n'est pas correctement fermé entre guillemets (hé, beaucoup de classes s'ajoutent là-dedans). Vous échangez donc l'ordre des attributs et les supprimez dans diverses combinaisons. Pas de dé. Si l'attribut de données est présent, le fantôme l'est aussi.
Vous vous demandez si ce n'est pas cette classe PHP qui fait l'acte? Il y a un
page_block_html_topmenu_gethtml_after
événement distribué que quelque chose d'autre pourrait utiliser pour pirater le balisage d'au-delà. Rien.Quoi. Est. Événement. Ici.
La réponse
Expliquez tout cela aux développeurs backend. Tout le monde est confus. Jusqu'à...