3

Magento の history.phtml を変更して、制限された Web サイトの制限なしですべての注文を表示できるようにしました。これは機能していますが、注文を印刷または表示しようとしたときに問題が発生しました。デバッグしましたが、問題は 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では、まずコントローラーを使用しOrderController、バックアップとして使用するように Magento に指示しています。オーバーライドした関数は 1 つだけなので、既存のコードはすべて変更されません。

<?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て修正します。

ただし、アップグレードに関しては少し面倒になる可能性があるため、このアプローチは可能な限り避けてください。考慮したいオプションの 1 つは、 を拡張しているコントローラーを変更し、そのメソッドをMage_Sales_Controller_Abstractオーバーライドすることです。_canViewOrderここを参照してください: http://drupal.org/project/magento

于 2012-12-21T08:28:08.453 に答える