Magento-查找与HTML片段对应的块

Magento-查找与HTML片段对应的块,magento,Magento,我是Magento的新手,在探索系统时,我发现有一件事很尴尬,那就是将生成的(X)HTML页面中的给定元素与创建它的块的名称绑定。我知道系统->配置->模板路径提示。但是,它非常难看,有时会改变页面上元素的布局,并且不会显示所有块(我认为它只包含模板块) 我尝试过的一种方法是修改Mage_Core_Block_Abstract中的toHtml()方法,在内容前后添加空元素,例如 <blockStart xmlns="http://some/url" name="the_block_name

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

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

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

(也许有一种方法可以在不修改核心文件的情况下实现这一点,但我现在并不介意这种方法,因为它只是供我自己使用。不过,欢迎任何想法。)

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

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

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

  • 我不得不禁用不能生成有效XHTML的插件,尤其是商业Bug。Commerce Bug的丢失非常糟糕,因为我真的希望在外接程序运行时访问它的页面和包XML查看功能
  • Magento中包含的大部分javascript都使用document.write(),这不适用于XHTML,因此我遇到了javascript异常,可能有些功能不起作用

  • 有没有人知道我的方法有什么解决这些问题的方法,或者有没有更简单的方法将输出中的HTML元素链接到生成它们的Magento块?

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

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

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

    grep "catalog/category" -r -l .
    
    您应该能够获得加载该块的一些文件名,然后找到它们的声明节点,并查看正在加载的模板文件

    echo get_class($this)
    

    也可能有帮助。

    更新结果花了一段时间,但最后我给您介绍了BlockSpy:


    更新没有太多的时间来处理它,但我现在已经完成了服务器端部分的工作。通过在
    事件处理程序之后的
    core\u block\u abstract\u中添加我的blockStart/blockEnd标记到\u html\u中,我成功地做到了这一点,而无需修改任何核心文件,并且通过将它们放在注释中,我使它们能够不受干扰地通过HTMLTidy。SAX解析器位正在工作。这里只需要javascript客户端,这应该很简单——其思想是以CSS XRAY bookmarklet的风格做一些事情(http://westciv.com/xray/). 

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


    我想我快要找到解决办法了。问题似乎可以归结为三件事:

  • Magento并不能真正生成可靠有效的XHTML。例如,在Javascript中使用CDATA部分存在一些不一致性。我遇到了一些无效的页面,毫无疑问还有很多
  • 页面的生成是以纯文本的方式完成的。由于服务器操作的是字符串,而不是DOM,因此在服务器端可靠地插入标记并不容易。此外,还不能保证块的
    toHtml()
    方法将始终生成整个元素的集合。例如,没有什么能阻止您(我认为)拥有一个生成文本的块并将其嵌入父块的属性值中,或者在父块中打开一个XHTML元素并在子块中关闭它(尽管这会很糟糕)
  • 将内容类型切换到XHTML,即使服务器被说服生成正确有效的标记,也会完全破坏站点上的javascript,我不准备为了使用XHTML而对其进行全面更新
  • 我认为以下方法可以解决这些问题:

  • 在服务器端使用
    PHP::Tidy
    ,强制服务器生成有效的XHTML。我尝试了一下,在
    controller\u front\u send\u response\u
    处理程序之前运行
    tidy\u parse\u string()
  • 与在客户端处理Block类插入的blockStart/blockEnd标记不同,在发送响应之前,在服务器端使用SAXXML解析器处理响应。我可以在标记之间运行子字符串,在运行时将每个子字符串传递给SAX解析器(并省略标记)。这应该允许我保持状态并构建