Php 在Magento'中添加块;s Checkout';审查';阶段

Php 在Magento'中添加块;s Checkout';审查';阶段,php,xml,magento,Php,Xml,Magento,我正在构建一个扩展,在Magento的Onepage签出中的“下订单”按钮之前添加一个特定的块。我很难找到正确的咒语来简单地将一个块附加到此部分,更不用说在另一个句柄之前/之后获取它了。目标是在不更改模板的情况下启用此替代 在我的扩展XML中,我有: <checkout_onepage_review> <reference name="root"> <block type="myextension/blockname" name="myext

我正在构建一个扩展,在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只是一个简单的文本块。我知道一般语法是正确的,因为我能够添加我的到checkout\u cart\u索引,并且可以很好地看到它。 我缺少一些基本的东西吗

谢谢

背景 并非所有块都自动输出其子块。仅调用
core/text\u列表的块和模板,其中
echo$this->getChildHtml()
(无参数)。
模板块的子级通过调用
echo$this->getChildHtml('child\u alias')
呈现
如果您仔细想想,这是有意义的-模板块的子项需要定位在模板HTML上下文中的某个位置。
关于您的问题,布局句柄
checkout\u onepage\u review
checkout\u cart\u index
之间没有功能上的区别,除了它们指的是不同的页面

向签出审阅添加内容 签出审阅块包含两个
核心/text\u列表
子项,您可以使用将自动显示的布局XML向其添加子项。

如果您想在协议之后,即“下订单”按钮之前添加一个块,而不更改模板,也不重写协议块,您可以尝试在
签出/协议
集合的末尾添加一个附加项,将
is_html
设置为true,并将您的输出作为
内容

不过,这是有问题的,因为协议模型、资源和集合没有提供自定义事件前缀

如果提供的
checkout.onepage.review.info.items.after
块不起作用,那么这归结为以下选项。每个人都有自己的丑陋之处,所以你可以选择最小的邪恶:

  • 注意评论中链接到的帖子中提到的
    核心块\u摘要\u到\u html\u之前的
  • 观察
    core\u collection\u abstract\u load\u before
    事件并动态添加html协议
  • 重写
    签出/协议
    块并重载
    \u toHtml()
    方法

我的建议是以某种方式使用
checkout.onepage.review.info.items.after
block-这种解决方案会更好。

+1对于“咒语”一词的用法,checkout Vinai的答案:我已经读过了,但这不一定能提供一个明确的答案,因为链接的帖子是关于adminhtml的。但我认为它可以提供一个可行的选择(如果不是有点混乱的话),谢谢你的意见,@Vinai。然而,这并不能解释这与checkout.xml有什么不同,我可以毫无问题地更新checkout.xml。可以说,所有的布局不都应该被创建为相等的吗?和之间有什么神奇的不同?布局声明应该放在模块布局XML文件中,而不是checkout.XML文件中。布局句柄
checkout\u onepage\u review
checkout\u cart\u index
之间的区别在于,一个在onepage签出的审阅步骤中处理,另一个在购物车页面上处理。我想我不明白你的意思,当然。我意识到它们在我的扩展布局中,它们就在那里。:)在我的问题中,我想问的是,当我使用
签出购物车索引进行布局更新时,为什么您要为
签出\u onepage\u review
建议一个特定的解决方案。是否有一个实际的文档说明了为什么需要区别对待
结帐\u onepage\u review
,或者您只是提供了一个解决方法(我很感激),因为您不确定为什么它不能按应有的方式工作?如果我正确地阅读了问题(请重新阅读以确定),您希望影响onepage签出页面上查看块底部的更改。您的这些评论是第一次提到
checkout\u cart\u index
页面(或句柄)。那么,你想在购物车页面上进行更改吗(与你原来的问题形成对比)?我的任务(你的第一句话)正确。然而,在我的原始问题中(尽管没有格式化),但是我的目标不是影响这个句柄,我只是提供了一个布局更新的示例,它只是一个工作(TM)的布局更新。因此,目前我的问题是,为什么我能够在
签出购物车索引
上设置相同的布局更新并获得输出,而不是使用
签出onepage\u review
——这是一个布局文件,应该以相同的方式工作,是吗?
<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>
<?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 ?>