幻影导航装饰器撞击Magento的EE缓存的奇怪情况


12

准备好一个奇怪的。因此,我正在自定义主要目录导航,以构建一个全状态的UI行为,该行为处理跨设备的多个交互模型(菜单,下拉菜单,模式等)。像你所做地。

这意味着要覆盖此类/方法:

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魔术发生的地方。对具有该属性的元素的任何单击都会更新UI状态。您猜对了,li.nav-X该类(Magento添加)充当了将UI状态绑定到激活元素的钩子。

一切都好吧?打开EE缓存。好吧?错误。

如果您正在查看的页面在Bazinga(aka nav-2)的目录层次结构内,那么突然您将看到以下内容:

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

谁添加了讨厌的active字符串?幻影是谁。

现在,您的UI状态失败,因为数据属性的值不再与<li>该类匹配。寻找幻影。

狩猎

  1. 首先,您检查在EE高速缓存下$child->getPositionClass()输出的变量nav-2实际上没有附加其他(大概)类值。它不是。

  2. 您检查了Magento的许多装饰器JS脚本之一是否未在导航列表中执行。不是。

  3. 也许这实际上是一件奇怪的事情/js/varien/menu.js。但是您已经像往常一样排除了那些核心脚本。

  4. 也许这是一些疯狂的内联JS,您永远不会知道模块会从PHP类中渲染出来。在页面源中搜索标记active<script>。你什么也没找到。

  5. 也许这是其他一些疯狂的JS Magento所需要的,但是从外部加载。您在浏览器中禁用了JS,但是幻影仍然存在。

  6. 您回到Topmenu.php班级并删除data属性。问题停止了。我勒个去。

  7. 您想知道同一元素上的另一个属性是否未正确用引号引起来(嘿,很多类附加在其中发生)。因此,您交换属性的顺序并以各种组合将其删除。没有骰子。如果存在data属性,则幻像也存在。

  8. 您想知道不是 PHP类在做事吗?有一个已调度的page_block_html_topmenu_gethtml_after事件,其他事件可能会用它来破坏标记。没有。

  9. 什么。是的。发生了。这里。

答案

向后端开发人员说明所有这些。每个人的行为都感到困惑。直到...

Answers:


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>元素上找到字符串,但是您的data属性值被匹配并被黑了。不要。

因此,请使用不同的类和数据属性,例如i-have-a-child-

幻影

一个真正的男人,靠自己的运气,比利·赞恩。


1
“很棒”的问题和解释!
AnnaVölkl'15

哈哈哇,这真是太疯狂了……在全页缓存模块的模型中……被赞扬
2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.