【问题标题】:Magento. Insert block into another without change template codeMagento。将块插入另一个而不更改模板代码
【发布时间】: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 块中?

【问题讨论】:

    标签: php xml layout magento


    【解决方案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】:

        【讨论】:

        • 请在此处写下您的答案,而不是发布链接,谢谢!
        【解决方案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 标记之后显示)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-14
            • 1970-01-01
            • 1970-01-01
            • 2014-01-24
            • 1970-01-01
            • 2019-07-18
            • 1970-01-01
            相关资源
            最近更新 更多