Magento的。无需更改模板代码即可将块插入另一个

时间:2011-05-18 10:42:04

标签: php xml layout magento

我试图找到解决方案,但没有结果。 我的任务是编写模块。它应该在现有块中插入一些html。

我注意到当我使用layout .xml文件时,我可以将我的块插入一些引用,如

<reference name="product.info">
    <block type='googlethis/link' name="googlethis" 
           template="catalog/product/googlethis.phtml"/>
</reference>

我的街区也显示了。

在其他情况下,我应该调用getChildHtml()方法并且它不好,因为它会更改模板.phtml文件。

那么有没有办法将我的phtml块插入任何其他phtml块而不调用getChildHtml()

7 个答案:

答案 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)