Prepare-se para um estranho. Portanto, estou personalizando a navegação principal do catálogo para criar um comportamento da interface do usuário com estado completo que lide com vários modelos de interação (menus, menus suspensos, modais etc.) em todos os dispositivos. Como você faz.
Isso significa substituir essa classe / método:
app/code/core/Mage/Page/Block/Html/Topmenu.php :: _getHtml()
Para produzir saída HTML como esta (um pouco 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>
Agora, isso é muito chato / padrão, exceto pelo data-ui-action
atributo. É aí que a mágica do JS acontece. Qualquer clique nos elementos com esse atributo atualiza o estado da interface do usuário. Você adivinhou, a li.nav-X
classe (que Magento adiciona) atua como meu gancho para vincular o estado da interface do usuário ao elemento ativado.
Tudo bem, certo? Ative o cache do EE. Tudo bem, certo? Errado.
Se a página que você está visualizando estiver dentro da hierarquia de catálogos de Bazinga (aka nav-2
), então você verá de repente:
data-ui-action="nav-2 active"
Quem adicionou a active
string desagradável ? O fantasma é quem.
E agora o estado da interface do usuário falha, porque o valor do atributo de dados não corresponde mais à <li>
classe. Caçar o fantasma.
A caçada
Primeiro, verifique se, no cache do EE, a variável
$child->getPositionClass()
que produznav-2
realmente não tem outros valores de classe (presumivelmente) anexados. Isso não.Você verifica se um dos muitos scripts JS do decorador do Magento não está sendo executado na lista de navegação. Não é.
Talvez seja realmente algo estranho
/js/varien/menu.js
. Mas você já excluiu esses scripts principais, como sempre faz.Talvez seja algum JS embutido louco que você nunca saberia que um módulo renderiza fora da classe PHP. Procurar a fonte da página para
active
dentro de<script>
tags. Você não encontra nada.Talvez seja alguma outra loucura que o JS Magento exige, mas carrega externamente. Você desativa o JS no navegador, mas o fantasma permanece.
Você volta para sua
Topmenu.php
classe e remove o atributo de dados. O problema para. Que diabos.Você quer saber se outro atributo no mesmo elemento não está fechado corretamente entre aspas (ei, muitas classes de anexos acontecem lá). Então você troca a ordem dos atributos e os remove em várias combinações. Sem dados. Se o atributo de dados estiver presente, o fantasma também.
Você quer saber se não é essa classe PHP fazendo a ação? Há um
page_block_html_topmenu_gethtml_after
evento despachado que outra coisa pode usar para invadir a marcação do além. Nada.O que. É. Acontecendo. Aqui.
A resposta
Explique tudo isso aos desenvolvedores de back-end. Todos agem confusos. Até...