Magento - 找到对应于一段HTML的块

时间:2012-10-04 21:00:10

标签: magento

我是Magento的新手,在探索系统时我发现的一件事就是将生成的(X)HTML页面中的给定元素绑定到创建它的块的名称。我知道System-> Configuration->模板路径提示。但是,它非常难看,有时会改变页面上元素的布局,并且不会显示所有块(我认为它只包含模板块)。

我尝试过的方法是修改Mage_Core_Block_Abstract中的toHtml()方法,在内容之前和之后添加空元素,例如

<blockStart xmlns="http://some/url" name="the_block_name"/>
<!-- the block's contents -->
<blockEnd/>

(可能有一种方法可以在不修改核心文件的情况下执行此操作,但我现在并不介意这种方法,因为它仅供我自己使用。但欢迎任何想法。)

这些元素在文档中提供了足够的信息,以便在浏览器端使用jQuery的.nextUntil()函数将data-magento-blockname属性添加到blockStart和blockEnd元素之间的元素。然后,我可以使用这些属性在任何给定时间显示包含指针下内容的完整块名称“path”的工具提示。

这种方法的问题在于,虽然Magento使用严格的DOCTYPE生成XHTML,但是将Content-Type设置为“text / html”是硬编码的(参见app/code/core/Mage/Core/Model/App.php第1246行)。这意味着浏览器将XML解释为HTML“标签汤”,导致奇怪的事情发生 - 我的许多标签完全消失,出现在错误的地方或者没有立即关闭,因此它们包含其他内容。此外,并非文档中的所有HTML元素都显示在DOM中。

我已经尝试修改App.php以将Content-Type更改为application / xhtml + xml,这确实允许我的机制成功运行。但是,它有一些严重的缺点:

  1. 我不得不禁用无法生成有效XHTML的加载项,特别是Commerce Bug。商业Bug的丢失非常糟糕,因为我真的希望在我的加载项运行时访问其页面和包XML查看功能。
  2. Magento中包含的大部分javascript都使用了document.write(),它不能与XHTML一起使用,所以我得到了javascript异常,大概有些功能不起作用。
  3. 有没有人知道我的方法对这些问题的任何解决方案,或者知道将输出中的HTML元素链接到生成它们的Magento块的任何更简单的方法?

2 个答案:

答案 0 :(得分:2)

使用模板路径提示时,有时您需要检查元素,然后通过查看ChromeDevTools或Firebug中的列表找到列出的关联模板文件(它将是具有一堆内联样式的父元素)。

我经常使用grep来找东西。只需导航到您应该查找的认为的最高文件夹(以便不必遍历数千个不相关的文件夹/文件)。

因此,如果您知道一个块名称,并且想要找到哪个模板文件使用该块,您可以转到/ app / design / frontend / base / default / layout并执行以下操作:

grep "catalog/category" -r -l .

并且您应该能够获得一些正在加载该块的文件名,然后找到它们的声明节点并查看正在加载哪个模板文件。

echo get_class($this)

也可以提供帮助。

答案 1 :(得分:1)

更新最终需要一段时间,但最后我给你BlockSpy:http://omnicognate.wordpress.com/2012/11/13/blockspy-my-first-magento-extension/


更新没有太多时间来处理它,但我现在已经完成了这项工作的服务器端部分。通过在core_block_abstract_to_html_after事件处理程序中添加我的blockStart / blockEnd标记,我设法在不修改任何核心文件的情况下执行此操作,并将它们放入注释中,我已经让它们通过HTMLTidy不受干扰。 SAX解析器位正在运行。只有javascript客户端要做,这应该是直截了当的 - 想法是以CSS XRAY bookmarklet(http://westciv.com/xray/)的风格做一些事情。

我会链接到一篇关于它如何工作的文章,并在完成后更新并接受这个答案 - 如果其他人之前没有提出更好的解决方案,当然。


我想我正在接近解决这个问题的方法。看起来问题实际上归结为三件事:

  1. Magento并没有真正产生可靠的有效XHTML。例如,对于使用Javascript的CDATA部分存在一些不一致。我遇到了一些无效页面,毫无疑问还有更多页面。
  2. 页面的生成以纯文本方式完成。由于服务器正在操纵字符串而不是DOM,因此在服务器端可靠地插入标记并不容易。此外,AFAIK无法保证块'toHtml()方法将始终生成整个元素的集合。例如,没有什么能阻止你(我认为)有一个产生文本的块并将其嵌入父块的属性值中,或者在父块中打开一个XHTML元素并在子块中关闭它(尽管如此)是严峻的。)
  3. 将Content-Type切换为XHTML,即使说服服务器生成正确有效的标记,也会完全破坏网站上的javascript,而且我不准备通过更新所有内容来使用XHTML。< / LI>

    我认为以下方法可以解决这些问题:

    1. 在服务器端使用PHP::Tidy强制服务器生成有效的XHTML。我通过在tidy_parse_string()处理程序中运行controller_front_send_response_before来试一试,它似乎有用。
    2. 使用服务器端的SAX XML解析器在发送之前处理响应,而不是在客户端使用Block类插入处理的blockStart / blockEnd标记。我可以遍历标记之间的子串,在我去的时候将每个子串传递到SAX解析器(并省略标记)。这应该允许我维护状态并构建输出XML字符串以响应SAX解析器生成的事件。然后,我可以在服务器端安全地(如果缓慢地)插入data- * 属性。
    3. 将Content-Type保留为t​​ext / html。这将允许javascript工作,并且无论如何都会在客户端忽略data- * 属性。
    4. 这有点痛苦,但它似乎应该适用于我的所有扩展,避免破坏javascript并避免对块产生什么样的输出做出任何假设。我只尝试过第一步 - 一旦我遇到了棘手的问题就会更新: - )