我有一个自定义的info.phtml文件,如果放在app\design\frontend\default\default\template\sales\order\info.phtml中,该文件已经可以使用了.
但是,我不想使用这种方法,因为这是模块的一部分,因此如果稍后其他人覆盖此文件,它将制动功能.我读过有关使用自定义块的内容,但我尝试了许多不同的方法而没有成功.
实际上,您引用的路径仅在主题包设置为时才有效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>
要问的第一个问题是,"我需要改变什么,在哪里?" 如果答案在于子块的输出(例如输出$this->getChildHtml('buttons')),则自定义输出意味着指定备用子(具有多种自定义可能性).如果不是,则更改可能是模板/块环境的本地更改.
对于第三方开发人员,理想的解决方案是尽可能避免与主题相关的输出.例如,如果您需要直接从其中一个组成对象更改或添加可用数据,则可以使用基于配置的重写或通过事件 - 观察器体系结构,通过Magento的配置XML修改该对象或其行为.在当前示例中,$this->getOrder()是一个实例Mage_Sales_Model_Order,$this是一个实例Mage_Sales_Block_Order_Info,并且可以将其中任何一个重写为不同的类.此外,sales_order_load_after可以观察该方法来修改订单对象的属性.
如果需要仅修改字符串,通常可以通过Magento的翻译功能实现此更改.在模板中,通过__()方法呈现的任何字符串都通过转换传递.这对于特定于主题的translate.csv文件中的最终实现者来说非常容易修改.对于第三方开发人员,一点配置XML允许指定其他转换CSV文件,即使对于核心模块也是如此.
如果需要更改正在显示的视图标记,则需要修改标记的来源,通常是模板文件.这可以通过几种方式实现.在订单信息块的情况下,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/*for 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. -->
然后可以使用句柄和名称来更新_template模块的自定义布局更新XML文件中的块属性,例如:
<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和模板目录以从库存模板自定义/更改,并向管理员发送通知.
| 归档时间: | 
 | 
| 查看次数: | 6777 次 | 
| 最近记录: |