我是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,这确实允许我的机制成功运行。但是,它有一些严重的缺点:
有没有人知道我的方法对这些问题的任何解决方案,或者知道将输出中的HTML元素链接到生成它们的Magento块的任何更简单的方法?
答案 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/)的风格做一些事情。
我会链接到一篇关于它如何工作的文章,并在完成后更新并接受这个答案 - 如果其他人之前没有提出更好的解决方案,当然。
我想我正在接近解决这个问题的方法。看起来问题实际上归结为三件事:
toHtml()
方法将始终生成整个元素的集合。例如,没有什么能阻止你(我认为)有一个产生文本的块并将其嵌入父块的属性值中,或者在父块中打开一个XHTML元素并在子块中关闭它(尽管如此)是严峻的。)我认为以下方法可以解决这些问题:
PHP::Tidy
强制服务器生成有效的XHTML。我通过在tidy_parse_string()
处理程序中运行controller_front_send_response_before
来试一试,它似乎有用。这有点痛苦,但它似乎应该适用于我的所有扩展,避免破坏javascript并避免对块产生什么样的输出做出任何假设。我只尝试过第一步 - 一旦我遇到了棘手的问题就会更新: - )