首页 文章

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

提问于
浏览
9

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

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

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

我的街区也显示出来 .

在其他情况下,我应该调用 getChildHtml() 方法,这是不好的,因为它使更改模板.phtml文件 .

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

7 回答

  • 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'); ?>
    

    正如我所说,这不适合所有情况,并不是非常优雅,但确实有效 .

    乔恩

  • 1

    不,没有通用的方法将块添加到任何其他块 . 偶尔为你工作的原因是有一些块类型只是枚举它们的子节点( core/text_list 是其中之一),而一些模板手动执行相同的操作(使用 $this->getChild() ) .

    如果要在不符合这些条件的块下添加块,则需要修改模板以回显该块 .

  • -2

    您可以尝试添加到xml - 以下方法 output="toHtml" - 将块放到父块但是...

    <reference name="product.info">
        <block type='googlethis/link' name="googlethis" output="to Html" template="catalog/product/googlethis.phtml"/>
    </reference>
    
  • 3

    它可能通过添加到xml - 以下方法 output="toHtml" - 将块放到父块

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

    使用布局中的方法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>
    

    标签html结束后,magento渲染了我的块

  • 2

    我相信你不能在没有显示模板的情况下输出一个块 . 因此,如果您在创建块时进行扩展,则需要在模板中调用它 . 不幸的是,这意味着有人可以在他们的网站上添加您的扩展程序,如果他们已经创建了自己的模板文件副本,其中添加了您的块,因为他们想要在他们的主题中修改它,那么您的块将不会显示在那里 . 他们必须弄清楚自己模块需要修改模板并将修改放在自己的模板中 .

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

相关问题