Любопытный случай с фантомным навигационным декоратором, поражающим EE-кеш Magento


12

Приготовься к странному. Поэтому я настраиваю основную навигацию по каталогу, чтобы создать поведение пользовательского интерфейса с полным состоянием, которое обрабатывает несколько моделей взаимодействия (меню, выпадающие списки, модалы и т. Д.) На разных устройствах. Как ты.

Это означает переопределение этого класса / метода:

app/code/core/Mage/Page/Block/Html/Topmenu.php :: _getHtml()

Для вывода HTML-кода вот так (несколько упрощенно):

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

Теперь, это довольно скучно / стандартно за исключением data-ui-actionатрибута. Вот где происходит магия JS. Любые нажатия на элементы с этим атрибутом обновляют состояние интерфейса. Как вы уже догадались, li.nav-Xкласс (который добавляет Magento) действует как моя ловушка для привязки состояния пользовательского интерфейса к активированному элементу.

Все хорошо, верно? Включить EE кеш. Все хорошо, верно? Неправильно.

Если страница, которую вы просматриваете, находится в иерархии каталогов Bazinga (aka nav-2), то внезапно вы увидите это:

data-ui-action="nav-2 active"

Кто добавил неприятную activeстроку? Призрак есть кто.

И теперь ваше состояние пользовательского интерфейса не выполняется, потому что значение атрибута данных больше не соответствует <li>классу. Выследите призрака.

Охота

  1. Во-первых, вы проверяете, что в кеше EE переменная, к $child->getPositionClass()которой nav-2выводятся данные , фактически не имеет других (предположительно) значений классов. Это не.

  2. Вы проверяете, что один из многих сценариев JS Magento для декораторов не выполняется в списке навигации. Это не.

  3. Может быть, это на самом деле какая-то странная вещь в /js/varien/menu.js. Но вы уже исключили эти основные сценарии, как всегда.

  4. Может быть, это какой-то сумасшедший встроенный JS, вы никогда не узнаете, что модуль визуализируется из класса PHP. Поиск источника страницы activeв <script>тегах. Вы ничего не найдете.

  5. Возможно, это какой-то другой сумасшедший, которого требует JS Magento, но загружается внешне. Вы отключаете JS в браузере, но призрак живет.

  6. Вы возвращаетесь в свой Topmenu.phpкласс и удаляете атрибут данных. Проблема прекращается. Что за черт.

  7. Вы задаетесь вопросом, не является ли другой атрибут в том же элементе должным образом закрытым в кавычках (эй, много добавления класса происходит там). Таким образом, вы меняете порядок атрибутов и удаляете их в различных сочетаниях. Нет кости. Если атрибут данных присутствует, то и фантом.

  8. Вы задаетесь вопросом, что, если дело не в этом классе PHP? Есть отправленное page_block_html_topmenu_gethtml_afterсобытие, что-то еще может использовать, чтобы взломать разметку из-за пределов. Ничего.

  9. Какая. Является. Случается. Вот.

Ответ

Объясните все это бэкэнд-разработчикам. Все действуют в замешательстве. До того как...

Ответы:


10

Кто-то взломал

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

Вы видите противное маленькое регулярное выражение:

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

Что соответствует какой-то чертовщины nav-в этом <li>. Просто чтобы вы помнили:

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

Magento ожидает найти nav-строки только в <li>элементах, но значение вашего атрибута данных сопоставляется и взламывается. Не хотеть.

Поэтому используйте другой класс и атрибут данных, например i-have-a-child-.

Фантом

Настоящий мужчина делает свою удачу, Билли Зейн.


1
«Потрясающая» проблема и объяснение!
Анна Фёлькл

Ха-ха, это на самом деле довольно сумасшедший ... В модели модуля кеширования полной страницы ... одобрено
Erfan
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.