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-&gt;getChild())。

如果您想将块添加到不符合这些条件的块下方,则需要修改模板以回显该块。

【讨论】:

还有。我们能否以某种方式检测哪个块可以在没有 getChildHtml() 的情况下在布局配置中用作输出的参考,而哪个块不能?谢谢 检查core/text_list的块类型是第一步。否则,grep 调用 $this-&gt;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" 属性添加到它,则块可以在不被模板调用的情况下输出自身,但正如其他一些人指出的那样,这将导致块在&lt;/html&gt; 标记之后呈现。这是正常的,因为 output="toHtml" 是使根块工作的原因。根块不能包含在模板中,因为它没有父级,因此它使用output="toHtml" 属性并使其出现。之所以有效,是因为当 Magento 呈现其布局(构建页面的 HTML)时,它调用 Mage_Core_Model_Layout 类的 getOutput() 方法,并且该方法实际上只是获取所有具有输出参数的块,并将它们一一排到页面上. 通常你应该只有2个这样的块,root和“core_profiler”。 (是的,这意味着分析器将在结束 HTML 标记之后显示)。

【讨论】:

以上是关于Magento。将块插入另一个而不更改模板代码的主要内容,如果未能解决你的问题,请参考以下文章

xml 将块移动到其他容器: - Magento 2

在 Magento 后端添加自定义仪表板“框”而不编辑默认模板的正确方法是啥?

Magento - 客户登录页面更改

Magento:在Magento模板中插入静态块

以编程方式将块插入页面,由于其ID

将块传递给方法传递给Ruby中的另一个方法