我试图找到解决方案,但没有结果。 我的任务是编写模块。它应该在现有块中插入一些html。
我注意到当我使用layout .xml文件时,我可以将我的块插入一些引用,如
<reference name="product.info">
<block type='googlethis/link' name="googlethis"
template="catalog/product/googlethis.phtml"/>
</reference>
我的街区也显示了。
在其他情况下,我应该调用getChildHtml()
方法并且它不好,因为它会更改模板.phtml文件。
那么有没有办法将我的phtml块插入任何其他phtml块而不调用getChildHtml()
?
答案 0 :(得分:21)
有一种方法可以做到这一点,虽然它不是一个完全优雅的解决方案。它在大多数情况下都会起作用,并且偶尔也证明是有用的。
基本上,您的想法是在布局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'); ?>
正如我所说,这不适合所有情况,并不是非常优雅,但确实有效。
乔恩
答案 1 :(得分:3)
不,没有将块添加到任何其他块的通用方法。偶尔为你工作的原因是有一些块类型只是枚举他们的孩子(core/text_list
就是其中之一)而一些模板手动做同样的事情(使用$this->getChild()
)。
如果要在不符合这些条件的块下添加块,则需要修改模板以回显该块。
答案 2 :(得分:2)
您可以尝试添加到xml - 以下方法 output =“toHtml” - 将块放到父块 但...
<reference name="product.info">
<block type='googlethis/link' name="googlethis" output="to Html" template="catalog/product/googlethis.phtml"/>
</reference>
答案 3 :(得分:2)
可以通过添加到xml来限制 - 以下方法 output =“toHtml” - 将块放到父块
<reference name="product.info">
<block type='googlethis/link' name="googlethis" as="googlethis" output="toHtml" template="catalog/product/googlethis.phtml"/>
</reference>
答案 4 :(得分:1)
在布局中使用方法output =“to Html”,块将在文档末尾呈现。 我用
进行了测试<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 :(得分:0)
我相信你不能在没有显示模板的情况下输出一个块。因此,如果您在创建块时进行扩展,则需要在模板中调用它。不幸的是,这意味着有人可以在他们的网站上添加您的扩展程序,如果他们创建了自己的模板文件副本,其中添加了您的块,因为他们想要在他们的主题中修改它,那么您的块将不会显示在那里。他们必须弄清楚自己模块需要修改模板并将修改放在自己的模板中。
如果您向其中添加output="toHtml"
属性,则块可以输出自身而不在模板中调用,但正如其他人指出的那样,这将导致在</html>
标记之后呈现块。这是正常的,因为output="toHtml"
是使root块工作的原因。根块不能包含在模板中,因为它没有父项,因此它使用output="toHtml"
属性并使其出现。这是有效的,因为当Magento渲染其布局(构建页面的HTML)时,它调用Mage_Core_Model_Layout类的getOutput()方法,并且此方法实际上只获取具有输出参数的所有块并在页面1上逐个输出它们通常你应该只有2个这样的块,root和&#34; core_profiler&#34;。 (是的,这意味着探查器将在关闭HTML标记之后显示)。
答案 6 :(得分:-2)
我使用Observer找到了一个优雅的解决方案,并在公司博客上写了一篇文章:http://www.fxplabs.com.br/blog/instanciando-blocos-em-qualquer-lugar-magento/
翻译成英文: