O curioso caso do decorador de navegação fantasma atingindo o cache EE do Magento

12

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-actionatributo. É 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-Xclasse (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 activestring 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

  1. Primeiro, verifique se, no cache do EE, a variável $child->getPositionClass()que produz nav-2realmente não tem outros valores de classe (presumivelmente) anexados. Isso não.

  2. Você verifica se um dos muitos scripts JS do decorador do Magento não está sendo executado na lista de navegação. Não é.

  3. Talvez seja realmente algo estranho /js/varien/menu.js. Mas você já excluiu esses scripts principais, como sempre faz.

  4. 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 activedentro de <script>tags. Você não encontra nada.

  5. Talvez seja alguma outra loucura que o JS Magento exige, mas carrega externamente. Você desativa o JS no navegador, mas o fantasma permanece.

  6. Você volta para sua Topmenu.phpclasse e remove o atributo de dados. O problema para. Que diabos.

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

  8. Você quer saber se não é essa classe PHP fazendo a ação? Há um page_block_html_topmenu_gethtml_afterevento despachado que outra coisa pode usar para invadir a marcação do além. Nada.

  9. O que. É. Acontecendo. Aqui.

A resposta

Explique tudo isso aos desenvolvedores de back-end. Todos agem confusos. Até...

Brendan Falkowski
fonte

Respostas:

10

Alguém se abre:

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

Você vê uma pequena expressão regular desagradável:

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

O que corresponde a algum diabo nav-dentro disso <li>. Só para você se lembrar:

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

O Magento espera encontrar apenas nav-strings nos <li>elementos, mas o valor do atributo de dados está sendo correspondido e invadido. Não quero.

Portanto, use uma classe e um atributo de dados diferentes, como i-have-a-child-.

O fantasma

Um homem de verdade faz a sua própria sorte, Billy Zane.

Brendan Falkowski
fonte
1
Problema e explicação "impressionantes"!
Anna Völkl
haha wow isso é realmente muito louco ... Em um modelo do módulo de cache de página inteira ... votado
Erfan