Цікавий випадок фантомного навігаційного декоратора, який вражає кеш-пам'ять Eent 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 (ака 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
"Дивовижна" проблема та пояснення!
Анна Вьоклл

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