我有一个自定义的info.phtml文件,如果放在app \ design \ frontend \ default \ default \ template \ sales \ order \ info.phtml中已经有效。
但是,我不想使用这种方法,因为这是模块的一部分,因此如果稍后其他人覆盖此文件,它将制动功能。我读过有关使用自定义块的内容,但我尝试了许多不同的方法但没有成功。
答案 0 :(得分:5)
实际上,您引用的路径仅在主题包设置为default
时才有效。自CE1.4以来所有文件的预期回退主题是base/default
。这里需要考虑很多,所以让我们分解一下。当然,作为Magento实例的最终实现者的是奢侈的,因为您可以使用任意数量的自定义选项,而无需担心如何支持其他开发人员'需要即可。但是,当开发第三方模块以供其他人发布/消费时(看起来似乎如此),那么如果您希望确保以模块的方式修改输出,则需要做出一些艰难的决定。拟/需求即可。让我们看看你提到的模板,它是生成输出的手段的一部分。此示例包含生成输出所涉及的几个因素。
app/design/frontend/base/default/template/sales/order/info.phtml
:
<?php $_order = $this->getOrder() ?>
<?php echo $this->getMessagesBlock()->getGroupedHtml() ?>
<div class="page-title title-buttons">
<h1><?php echo $this->__('Order #%s - %s', $_order->getRealOrderId(), $_order->getStatusLabel()) ?></h1>
<?php echo $this->getChildHtml('buttons') ?>
</div>
要问的第一个问题是,&#34;我需要改变什么,以及在哪里?&#34;如果答案在于子块的输出(例如$this->getChildHtml('buttons')
的输出),则自定义输出意味着指定备用子(具有多种自定义可能性)。如果没有,则更改可能是模板/块环境的本地。
对于第三方开发人员,理想的解决方案是尽可能避免与主题相关的输出。例如,如果您需要直接从其中一个组成对象更改或添加可用数据,则可以使用基于配置的重写或通过事件通过Magento的配置XML修改该对象或其行为。观察者的架构。在当前示例中,$this->getOrder()
是Mage_Sales_Model_Order
的实例,$this
是Mage_Sales_Block_Order_Info
的实例,可以将其中任何一个重写为其他类。此外,可以观察到sales_order_load_after
方法来修改订单对象的属性。
如果只需要修改字符串,通常可以通过Magento的翻译功能实现此更改。在模板中,通过__()
方法呈现的任何字符串都通过转换传递。对于特定于主题的 translate.csv
文件中的最终实现者,这非常容易修改。对于第三方开发者a little configuration XML allows to specify an additional translation CSV file, even for a core module。
如果需要更改正在显示的视图标记,则需要修改标记源,这通常是模板文件。这可以通过几种方式实现。对于订单信息块, sales/order/info.phtml
模板在Magento构造函数中定义:
class Mage_Sales_Block_Order_Info extends Mage_Core_Block_Template
{
//snip...
protected function _construct()
{
parent::_construct();
$this->setTemplate('sales/order/info.phtml');
}
//snip...
}
这通常意味着布局XML中没有指定的模板。下一步是确定块是否实际上是通过布局XML或控制器实例化的。对于后者,无法通过布局XML操作块,因此您需要使用许多可能的Magento / PHP选项之一来更改_template
属性。如果通过布局XML实例化块,那么很容易 指定一些自定义布局XML指向一个不会出现在任何主题中的备用模板 ;您只需要知道块已经给出的句柄和名称,这可以通过搜索块实例化标记来确定(例如,搜索app/design/frontend/*
type="sales/order_info"
。这将引导您到* .../base/default/layout/sales.xml*
:
<sales_order_view translate="label">
<label>Customer My Account Order View</label>
<update handle="customer_account"/>
<reference name="my.account.wrapper">
<block type="sales/order_info" as="info" name="sales.order.info">
<block type="sales/order_info_buttons" as="buttons" name="sales.order.info.buttons" />
</block>
<!-- etc. -->
然后可以使用句柄和名称更新模块的自定义布局更新XML文件中的块_template
属性,例如:
<sales_order_view>
<reference name="sales.order.info">
<action method="setTemplate"><tpl>my/custom/template.phtml</...>
<!--
Instead of <reference> you can use the 'block' attribute:
<action method="setTemplate" block="sales.order.info"><tpl>my/custom/template.phtml</...>
-->
这样您就可以将自定义模板放在它所属的base/default
模板目录中。但是,您会注意到此块在多个句柄中实例化:
您可能希望使用实用程序句柄和<update />
指令将指令封装到一个位置并将其提供给所有库存句柄。
这是几种方法之一,但它并非万无一失。根据您的扩展消费者受众,您可能希望扫描布局XML和模板目录,以便从库存模板中自定义/更改,并向管理员发送通知。
答案 1 :(得分:0)
如果您需要将自定义info.phtml作为模块的一部分,请在模块的xml中声明它。然后,您可以将自定义的phtml文件放在app \ design \ frontend \ whatever \ somethingelse \ template \ sales \ order中,它将覆盖它。例如,请参阅此主题关于how to override existing template file。
答案 2 :(得分:0)
这是从模块的布局xml完成的。
根据调用该文件的命名空间,模块和控制器操作,将下面的代码放在布局xml中,并根据需要进行更改:
<checkout_onepage_index>//Use correct Controller action
<reference name="checkout.onepage.payment">//Change reference name as per your need
<action method="setTemplate">
<template>giftcard/checkout/onepage/payment.phtml</template>//Path of phtml file in yourmodule template folder
</action>
</reference>
</checkout_onepage_index>