Magento-查找与HTML片段对应的块
我是Magento的新手,在探索系统时,我发现有一件事很尴尬,那就是将生成的(X)HTML页面中的给定元素与创建它的块的名称绑定。我知道系统->配置->模板路径提示。但是,它非常难看,有时会改变页面上元素的布局,并且不会显示所有块(我认为它只包含模板块) 我尝试过的一种方法是修改Mage_Core_Block_Abstract中的Magento-查找与HTML片段对应的块,magento,Magento,我是Magento的新手,在探索系统时,我发现有一件事很尴尬,那就是将生成的(X)HTML页面中的给定元素与创建它的块的名称绑定。我知道系统->配置->模板路径提示。但是,它非常难看,有时会改变页面上元素的布局,并且不会显示所有块(我认为它只包含模板块) 我尝试过的一种方法是修改Mage_Core_Block_Abstract中的toHtml()方法,在内容前后添加空元素,例如 <blockStart xmlns="http://some/url" name="the_block_name
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,这确实允许我的机制成功运行。但是,它有一些严重的缺点:
有没有人知道我的方法有什么解决这些问题的方法,或者有没有更简单的方法将输出中的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解析器(并省略标记)。这应该允许我保持状态并构建