在Magento Checkout'Review'阶段添加块

时间:2012-03-02 21:15:52

标签: php xml magento

我正在构建一个扩展,以便在Magento的Onepage结帐中的“下订单”按钮之前添加一个特定的块。我在找到正确的咒语时遇到一些麻烦,只需在这个部分附加一个块,更不用说在另一个句柄之前/之后得到它了。对象是在没有任何模板更改的情况下使用此覆盖。

在我的扩展程序的XML中,我有:

<checkout_onepage_review>
    <reference name="root">
        <block type="myextension/blockname" name="myextension.block" template="myextension/block.phtml" before="checkout.onepage.review.button" />
    </reference>
</checkout_onepage_review>

myextension / block.phtml现在只是一个简单的文本块。我知道一般语法是正确的,因为我能够添加我的&lt; block&gt; checkout_cart_index并看到它就好了。 我错过了一些基本的东西吗?

谢谢!

1 个答案:

答案 0 :(得分:7)

背景

并非所有块都会自动输出子块。仅调用core/text_list类型的块和调用echo $this->getChildHtml()(无参数)的模板 通过调用echo $this->getChildHtml('child_alias')呈现模板块的子项 如果你考虑它是有道理的 - 模板块的孩子需要被放置在模板HTML的上下文中 参考您的问题,布局句柄checkout_onepage_reviewcheckout_cart_index之间没有功能差异,除了它们引用不同的页面。

向结帐审核添加内容

结帐审核区块包含两个core/text_list子项,您可以使用将自动显示的布局XML添加子项。

<checkout_onepage_review>
    <reference name="checkout.onepage.review.info.items.before">
        <block type="core/text" name="review.test.1">
            <action method="setText">
                <text>Test Block Before</text>
            </action>
        </block>
    </reference>
    <reference name="checkout.onepage.review.info.items.after">
        <block type="core/text" name="review.test.2">
            <action method="setText">
                <text>Test Block After</text>
            </action>
        </block>
    </reference>
</checkout_onepage_review>

唯一的问题是在协议阻止之前呈现checkout.onepage.review.info.items.after块,所以在你的情况下它可能不够好。
协议使用以下代码呈现:

<?php foreach ($this->getAgreements() as $_a): ?>
    <li>
        <div class="agreement-content"<?php echo ($_a->getContentHeight() ? ' style="height:' . $_a->getContentHeight() . '"' : '')?>>
            <?php if ($_a->getIsHtml()):?>
                <?php echo $_a->getContent() ?>
            <?php else:?>
                <?php echo nl2br($this->htmlEscape($_a->getContent())) ?>
            <?php endif; ?>
        </div>
        <p class="agree">
            <input type="checkbox" id="agreement-<?php echo $_a->getId()?>" name="agreement[<?php echo $_a->getId()?>]" value="1" title="<?php echo $this->htmlEscape($_a->getCheckboxText()) ?>" class="checkbox" /><label for="agreement-<?php echo $_a->getId()?>"><?php echo $_a->getIsHtml() ? $_a->getCheckboxText() : $this->htmlEscape($_a->getCheckboxText()) ?></label>
        </p>
    </li>
<?php endforeach ?>

如果您想在协议之后添加一个块,就在“下订单”按钮之前,而不更改模板,并且不重写协议块,您可以尝试在{{的末尾添加一个额外的项目1}}集合,checkout/agreements设置为true,输出为is_html 但事实证明这是有问题的,因为协议模型,资源和集合不提供自定义事件前缀。

如果提供的content块不起作用,可归结为以下选项。每个人都以自己的方式丑陋,所以选择最小的邪恶是你的:

  • 观察评论中链接的帖子中提到的checkout.onepage.review.info.items.after
  • 观察core_block_abstract_to_html_before事件并动态添加HTML协议
  • 重写core_collection_abstract_load_before块并重载checkout/agreements方法

我的建议是以某种方式利用_toHtml()块 - 该解决方案会更好。