我正在构建一个扩展,以便在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并看到它就好了。 我错过了一些基本的东西吗?
谢谢!
答案 0 :(得分:7)
并非所有块都会自动输出子块。仅调用core/text_list
类型的块和调用echo $this->getChildHtml()
(无参数)的模板
通过调用echo $this->getChildHtml('child_alias')
呈现模板块的子项
如果你考虑它是有道理的 - 模板块的孩子需要被放置在模板HTML的上下文中
参考您的问题,布局句柄checkout_onepage_review
和checkout_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()
块 - 该解决方案会更好。