我正在构建一个扩展,在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>
Run Code Online (Sandbox Code Playgroud)
myextension/block.phtml现在只是一个简单的文本块.我知道一般语法是正确的,因为我能够将<block>添加到checkout_cart_index并且看得很清楚.我错过了什么基本的东西?
谢谢!
并非所有块都自动输出子块.只有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>
Run Code Online (Sandbox Code Playgroud)
唯一的问题是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 ?>
Run Code Online (Sandbox Code Playgroud)
如果要在协议之后添加块,在"下订单"按钮之前,而不更改模板,并且不重写协议块,则可以尝试将其他项添加到checkout/agreements集合的末尾,并is_html设置为是的,你的输出是content.
但事实证明这是有问题的,因为协议模型,资源和集合不提供自定义事件前缀.
这归结为,如果提供的checkout.onepage.review.info.items.after块不起作用,则以下选项.每个人都以自己的方式丑陋,所以选择最小的邪恶是你的:
core_block_abstract_to_html_before评论中链接的帖子中提到的内容core_collection_abstract_load_before事件并动态添加HTML协议checkout/agreements块并重载该_toHtml()方法我的建议是以某种方式利用checkout.onepage.review.info.items.after块 - 这个解决方案会更好.
| 归档时间: |
|
| 查看次数: |
5237 次 |
| 最近记录: |