Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 马根托。在不更改模板代码的情况下将块插入到另一个块中_Php_Xml_Layout_Magento - Fatal编程技术网

Php 马根托。在不更改模板代码的情况下将块插入到另一个块中

Php 马根托。在不更改模板代码的情况下将块插入到另一个块中,php,xml,layout,magento,Php,Xml,Layout,Magento,我试图找到解决办法,但没有结果。 我的任务是编写模块。它应该在现有块中插入一些html 我注意到,当我使用layout.xml文件时,我可以将块插入到一些引用中,如 <reference name="product.info"> <block type='googlethis/link' name="googlethis" template="catalog/product/googlethis.phtml"/> </referenc

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

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

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

我的方块也显示出来了

在其他情况下,我应该调用
getChildHtml()
方法,但这并不好,因为它会导致更改template.phtml文件


因此,有没有一种方法可以在不调用
getChildHtml()
的情况下将我的phtml块插入任何其他phtml块?

没有,没有一种通用方法可以将块添加到任何其他块。它偶尔对您起作用的原因是,有些块类型只枚举它们的子项(
core/text\u list
就是其中之一),有些模板手动执行相同的操作(使用
$this->getChild()


如果要将块添加到不符合这两个条件的块下面,则需要修改模板以响应该块。

有一种方法可以做到这一点,尽管这不是一个完全优雅的解决方案。不过,它在大多数情况下都会起作用,而且有时也被证明是有用的

其基本思想是,在布局XML中替换要在之前/之后渲染块的块,将该块作为子块放置在块中,然后在您的块之前/之后渲染其输出

假设您想在cart details页面上的totals块之前输出一个块,您可以在扩展的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>

全口
totalsmyextension.block
然后在template.phtml文件中,您将有:

<div id="myextension">
    // Your template code
</div>

// Render the totals block that you placed inside your block
<?php echo $this->getChildHtml('totals'); ?>

//您的模板代码
//渲染放置在块内的totals块
正如我所说的,这并不适合所有情况,也不是非常优雅,但确实有效


Jon

您可以尝试添加到xml中-以下方法将块放到父块中 但是


使用布局中的方法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结束后呈现了我的块

我使用Observer找到了一个优雅的解决方案,并在公司博客上写了一篇文章:

翻译成英文:


通过添加到xml是可能的-下面的方法output=“toHtml”将块放入父块

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

我相信如果没有显示在模板中的块,就无法输出它。因此,如果在创建块的基础上进行扩展,则需要在所需的模板中调用它。不幸的是,这意味着有人可以在他们的网站上添加你的扩展名,如果他们创建了他们自己的模板文件副本,因为他们想在他们的主题中修改你的块,那么你的块将不会显示在那里。他们必须自己弄清楚您的模块需要修改模板,并将修改放在他们自己的模板中


如果向块添加
output=“toHtml”
属性,则块可以输出自身而不在模板中调用,但正如其他一些人指出的那样,这将导致块在
标记之后呈现。这是正常的,因为根块工作的原因是
output=“toHtml”
。根块不能包含在模板中,因为它没有父块,所以它使用
output=“toHtml”
属性并将其显示出来。这是因为当Magento呈现其布局(构建页面的HTML)时,它调用Mage_Core_Model_layout类的getOutput()方法,该方法实际上只是获取所有具有输出参数的块,并在页面上逐1吐出它们。通常,您应该只有两个这样的块,root和“core_profiler”。(是的,这意味着探查器将在关闭HTML标记后显示)。

另外。我们是否可以检测出在布局配置中,哪个块可以在没有getChildHtml()的情况下用作输出的引用,而哪个块不能?首先要感谢检查
核心/文本列表的块类型。否则,grep
$this->getChild()调用的模板目录。这是一个整洁的解决方案,我喜欢它!这就是我一直在寻找的!请在这里写下你的答案,而不是张贴链接,谢谢!
<reference name="product.info">
    <block type='googlethis/link' name="googlethis" as="googlethis" output="toHtml" template="catalog/product/googlethis.phtml"/>
</reference>