Magento。将块插入另一个而不更改模板代码
Posted
技术标签:
【中文标题】Magento。将块插入另一个而不更改模板代码【英文标题】:Magento. Insert block into another without change template code 【发布时间】:2011-08-27 22:54:42 【问题描述】:我试图找到解决方案,但没有结果。 我的任务是编写模块。它应该在现有块中插入一些 html。
我注意到当我使用布局 .xml 文件时,我可以将我的块插入到一些参考中,例如
<reference name="product.info">
<block type='googlethis/link' name="googlethis"
template="catalog/product/googlethis.phtml"/>
</reference>
我的块也显示了。
在其他情况下,我应该调用 getChildHtml()
方法,这不好,因为它会更改模板 .phtml 文件。
那么有没有办法在不调用getChildHtml()
的情况下将我的 phtml 块插入到 any 其他 phtml 块中?
【问题讨论】:
【参考方案1】:不,没有通用的方法可以将您的块添加到任何其他块。它偶尔为您工作的原因是有些块类型只是枚举它们的孩子(core/text_list
是其中之一),而一些模板手动执行相同操作(使用 $this->getChild()
)。
如果您想将块添加到不符合这些条件的块下方,则需要修改模板以回显该块。
【讨论】:
还有。我们能否以某种方式检测哪个块可以在没有 getChildHtml() 的情况下在布局配置中用作输出的参考,而哪个块不能?谢谢 检查core/text_list
的块类型是第一步。否则,grep 调用 $this->getChild()
的模板目录。【参考方案2】:
有一种方法可以做到这一点,尽管它不是一个完全优雅的解决方案。不过,它在大多数情况下都可以使用,并且有时会有所帮助。
基本上,这个想法是您在布局 XML 之前/之后替换要渲染块的块,将该块作为子块放置在块中,然后在您的块之前/之后渲染它的输出。
假设您想在购物车详细信息页面上的总计块之前输出一个块,您可以在扩展程序的 layout.xml 中执行以下操作
<checkout_cart_index>
<reference name="checkout.cart">
<block type="myextension/block" name="myextension.block" as="myextension_block" template="myextension/template.phtml">
<action method="setChild"><name>totals</name><block>totals</block></action>
</block>
<action method="setChild"><name>totals</name><block>myextension.block</block></action>
</reference>
</checkout_cart_index>
然后在您的 template.phtml 文件中,您将拥有:
<div id="myextension">
// Your template code
</div>
// Render the totals block that you placed inside your block
<?php echo $this->getChildHtml('totals'); ?>
正如我所说,这并不适合所有情况,也不是非常优雅,但确实有效。
乔恩
【讨论】:
这是一个很好的解决方案,我喜欢它 太棒了!这就是我一直在寻找的!【参考方案3】:您可以尝试添加到 xml - 以下方法 output="toHtml" - 将块放入父块 但是……
<reference name="product.info">
<block type='googlethis/link' name="googlethis" output="to Html" template="catalog/product/googlethis.phtml"/>
</reference>
【讨论】:
【参考方案4】:在布局中使用方法 output="toHtml" 会在文档末尾重新渲染块。 我测试了
<catalog_product_view>
<reference name="media">
<block type="pricetag/catalog_product_view" name="catalog.product.price.tag" template="pricetag/price.phtml" output="toHtml" />
</reference>
</catalog_product_view>
并且 magento 在标记 html 结束后渲染了我的块
【讨论】:
【参考方案5】:我使用 Observer 找到了一个优雅的解决方案,并在公司博客上写了一篇文章:http://www.fxplabs.com.br/blog/instanciando-blocos-em-qualquer-lugar-magento/
翻译成英文:
http://translate.google.com/translate?sl=pt&tl=en&js=n&prev=_t&hl=pt-BR&ie=UTF-8&eotf=1&u=http%3A%2F%2Fwww.fxplabs.com.br%2Fblog%2Finstanciando-blocos-em-qualquer-lugar-magento%2F
【讨论】:
请在此处写下您的答案,而不是发布链接,谢谢!【参考方案6】:可以通过添加到 xml 来限制 - 遵循方法 output="toHtml" - 将块放入父块
<reference name="product.info">
<block type='googlethis/link' name="googlethis" as="googlethis" output="toHtml" template="catalog/product/googlethis.phtml"/>
</reference>
【讨论】:
【参考方案7】:我相信如果没有显示的模板中的块,您将无法输出它。因此,如果您在创建块的基础上进行扩展,则需要在您想要的模板中调用它。不幸的是,这意味着有人可以在他们的网站上添加您的扩展程序,并且如果他们创建了自己的模板文件副本,因为他们想在他们的主题中修改它,那么您的块将不会显示在那里。他们必须自己弄清楚您的模块需要修改模板,然后自己将修改放入自己的模板中。
如果您将output="toHtml"
属性添加到它,则块可以在不被模板调用的情况下输出自身,但正如其他一些人指出的那样,这将导致块在</html>
标记之后呈现。这是正常的,因为 output="toHtml"
是使根块工作的原因。根块不能包含在模板中,因为它没有父级,因此它使用output="toHtml"
属性并使其出现。之所以有效,是因为当 Magento 呈现其布局(构建页面的 HTML)时,它调用 Mage_Core_Model_Layout 类的 getOutput() 方法,并且该方法实际上只是获取所有具有输出参数的块,并将它们一一排到页面上. 通常你应该只有2个这样的块,root和“core_profiler”。 (是的,这意味着分析器将在结束 HTML 标记之后显示)。
【讨论】:
以上是关于Magento。将块插入另一个而不更改模板代码的主要内容,如果未能解决你的问题,请参考以下文章