准备好一个奇怪的。因此,我正在自定义主要目录导航,以构建一个全状态的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>
该类匹配。寻找幻影。
狩猎
首先,您检查在EE高速缓存下
$child->getPositionClass()
输出的变量nav-2
实际上没有附加其他(大概)类值。它不是。您检查了Magento的许多装饰器JS脚本之一是否未在导航列表中执行。不是。
也许这实际上是一件奇怪的事情
/js/varien/menu.js
。但是您已经像往常一样排除了那些核心脚本。也许这是一些疯狂的内联JS,您永远不会知道模块会从PHP类中渲染出来。在页面源中搜索标记
active
内<script>
。你什么也没找到。也许这是其他一些疯狂的JS Magento所需要的,但是从外部加载。您在浏览器中禁用了JS,但是幻影仍然存在。
您回到
Topmenu.php
班级并删除data属性。问题停止了。我勒个去。您想知道同一元素上的另一个属性是否未正确用引号引起来(嘿,很多类附加在其中发生)。因此,您交换属性的顺序并以各种组合将其删除。没有骰子。如果存在data属性,则幻像也存在。
您想知道不是该 PHP类在做事吗?有一个已调度的
page_block_html_topmenu_gethtml_after
事件,其他事件可能会用它来破坏标记。没有。什么。是的。发生了。这里。
答案
向后端开发人员说明所有这些。每个人的行为都感到困惑。直到...