Prepárate para una extraña. Por lo tanto, estoy personalizando la navegación del catálogo principal para crear un comportamiento de interfaz de usuario completo que maneje múltiples modelos de interacción (menús, menús desplegables, modales, etc.) en todos los dispositivos. Como tu lo haces.
Eso significa anular esta clase / método:
app/code/core/Mage/Page/Block/Html/Topmenu.php :: _getHtml()
Para producir una salida HTML como esta (algo simplificada):
<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>
Ahora, esto es bastante aburrido / estándar, excepto por el data-ui-action
atributo. Ahí es donde sucede la magia JS. Cualquier clic en elementos con ese atributo actualiza el estado de la interfaz de usuario. Lo has adivinado, la li.nav-X
clase (que agrega Magento) actúa como mi gancho para vincular el estado de la interfaz de usuario al elemento activado.
Todo bien, verdad? Encienda el caché EE. Todo bien ¿verdad? Incorrecto.
Si la página que está viendo está dentro de la jerarquía de catálogo de Bazinga (aka nav-2
), de repente verá esto:
data-ui-action="nav-2 active"
¿Quién agregó la active
cuerda desagradable ? El fantasma es quién.
Y ahora su estado de IU falla, porque el valor del atributo de datos ya no coincide con la <li>
clase. Caza al fantasma.
La caza
Primero, verifica que bajo la memoria caché EE la variable
$child->getPositionClass()
que produce ennav-2
realidad no tiene otros (presumiblemente) valores de clase añadidos. No es asi.Comprueba que uno de los muchos scripts JS decoradores de Magento no se está ejecutando en la lista de navegación. No es.
Tal vez en realidad sea algo extraño
/js/varien/menu.js
. Pero ya excluyó esos scripts centrales como siempre lo hace.Tal vez sea un JS en línea loco que nunca sabrías que un módulo representa fuera de la clase PHP. Busque en la fuente de la página
active
dentro de las<script>
etiquetas. No encuentras nadaTal vez sea otro loco que JS Magento requiere, pero se carga externamente. Deshabilita JS en el navegador, pero el fantasma vive.
Vuelve a su
Topmenu.php
clase y elimina el atributo de datos. El problema se detiene. Que demonios.Se pregunta si otro atributo en el mismo elemento no se cierra correctamente entre comillas (hey, hay muchos anexos de clase allí). Entonces intercambias el orden de los atributos y los eliminas en varias combinaciones. No dados. Si el atributo de datos está presente, también lo está el fantasma.
¿Se pregunta qué pasaría si no es esta clase de PHP la que realiza la escritura? Hay un
page_block_html_topmenu_gethtml_after
evento enviado que algo más podría usar para hackear el marcado desde más allá. Nada.Qué. Es. Sucediendo. Aquí.
La respuesta
Explique todo eso a los desarrolladores de back-end. Todos actúan confundidos. Hasta...