3

我们已修改 Magento 的 history.phtml 以显示所有订单,对受限网站没有任何限制。这是有效的,但是当我们尝试打印或查看订单时遇到了问题。我已经调试过了,问题出在 Magento 的_canViewOrder(位于Mage_Sales_Controller_Abstract)上。在该功能中,执行了额外的逻辑检查,以检查登录的用户是否可以查看/打印请求的订单:

if ($order->getId() && $order->getCustomerId() && ($order->getCustomerId() == $customerId)
            && in_array($order->getState(), $availableStates, $strict = true)

由于我们这里有一些自定义开发,我们需要重写此方法以消除限制。不幸的是,我们在任何地方都找不到如何覆盖Controller类。

请注意,我们确实知道如何覆盖路由器/控制器,但是这个位于 Controller 文件夹中并且是一个抽象类。

谁能指出我正确的方向或为我提供示例 config.xml 来覆盖此类?

4

2 回答 2

3

毕竟我决定使用快速方法。我已经覆盖了Mage_Sales_OrderController

<?php
require_once Mage::getModuleDir('controllers', 'Mage_Sales') . DS . 'OrderController.php';
class MyCompany_MyModule_OrderController extends Mage_Sales_OrderController
{   
    /**
     * Check order view availability
     * Overridden from Mage_Sales_Controller_Abstract to
     * remove the customer restriction. We want to show all
     * orders to all customers on any time. 
     * 
     * TODO: Maybe in the future add a customer group restriction
     *
     * @param   Mage_Sales_Model_Order $order
     * @return  bool
     */
    protected function _canViewOrder($order)
    {
        $availableStates = Mage::getSingleton('sales/order_config')->getVisibleOnFrontStates();
        if ($order->getId() && in_array($order->getState(), $availableStates, $strict = true)) {
            return true;
        }

        return false;
    }
}

在我的config.xml中,我告诉 Magento 先使用我的控制器并将其OrderController用作备份。由于我只覆盖了一个函数,因此不会触及所有现有代码。

<?xml version="1.0"?>    
...

<frontend>
...
    <routers>
...
        <sales>
            <args>
                <modules>
                    <MyCompany_MyModule before="Mage_Sales_OrderController">MyCompany_MyModule_Sales</MyCompany_MyModule>
                </modules>
            </args>
        </sales>
    </routers>
...
</frontend>
...
于 2012-12-21T09:07:19.197 回答
2

您可以通过将任何类放在app/code/local. 加载一个类时,Magento 首先查看本地,然后是社区,然后是核心。要实现您想要的,请将文件复制到app/code/local/Mage/Sales/Controller/Abstract.php并进行修改。

但是,请尽量避免这种方法,因为在升级时它会使事情变得有点混乱。您可能要考虑的一种选择是修改正在扩展的控制器Mage_Sales_Controller_Abstract,并覆盖_canViewOrder它的方法。见这里:http ://drupal.org/project/magento

于 2012-12-21T08:28:08.453 回答