3

magento 1.7 ストアに拡張機能 CreativeStyle CheckoutByAmazon がインストールされており、CheckoutController クラスをオーバーライドしようとしていますが、magento はオーバーライドを無視しているようです。どんな提案でも大歓迎です。キャッシュもクリアしましたが、まだ機能しません

(アプリ/コード/ローカルフォルダー内)

MyModule \CheckoutByAmazon \controllers \CheckoutController.php \etc \config.xml

(アプリ/etc/config.xml)

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyModule_CheckoutByAmazon>
            <version>0.1.0</version>
        </MyModule_CheckoutByAmazon>
    </modules>
    <frontend>
        <routers>
            <checkoutbyamazon>
                <args>
                    <modules>
                        <MyModule_CheckoutByAmazon before="Creativestyle_CheckoutByAmazon">MyModule_CheckoutByAmazon</MyModule_CheckoutByAmazon>
                    </modules>
                </args>
            </checkoutbyamazon>
        </routers>
    </frontend>
</config>

(app/code/local/MyModule/CheckoutByAmazon/controllers/CheckoutController 内)

<?php
//Controllers are not autoloaded so we will have to do it manually:
require_once 'Creativestyle/CheckoutByAmazon/controllers/CheckoutController.php';

class MyModule_CheckoutByAmazon_CheckoutController extends Creativestyle_CheckoutByAmazon_CheckoutController {

    public function indexAction() {
       exit('I am here');
        parent::indexAction();
    }

    //i want to override this function
      public function saveShippingAction() {
       //insert my overriding code
        exit('saveShipping');
        }

}
?>

(etc/modules/MyModule_CheckoutByAmazon.xml 内)

<?xml version="1.0"?>
<config>
    <modules>
        <MyModule_CheckoutByAmazon>
            <active>true</active>
            <codePool>local</codePool>
        </MyModule_CheckoutByAmazon>
    </modules>
</config>

どこが間違っていますか?

4

3 に答える 3

9

tl;dr: 元の拡張機能の構成に問題がある可能性がありますが、トラブルシューティングの方法は次のとおりです。

デバッグを開始するには、何をしようとしているのかを理解する必要があります。カスタム モジュールが存在しない場合、Magento はリクエスト パスのフロント名「checkout」を取得し、それをディレクトリ./app/code/core/Mage/Checkout/controllers/に一致させてから、2 番目と 3 番目のパラメーターの一致を次のように探します。ファイル、そのファイル内のクラス定義、およびそのクラス内のアクション メソッドの組み合わせ。推奨されていない書き換え構文 (モジュールで実行しようとしているもの) は、単に一致するディレクトリを追加するだけです。これをデバッグする前に、基本をカバーするのが最善です。これは、コントローラーのオーバーライドをデバッグする良い機会です。

満たさなければならない前提条件がいくつかあります (モジュールのconfig.xmlがマージされている、正しい構文とファイル構造など)。これらが機能していることを最初にテストすることをお勧めします。これにより、デバッグが必要な領域が減り、特定されるからです。

Magento ルートのtest.phpファイルで、次の操作を行います。

<?php
ini_set('display_errors',1);
error_reporting(E_ALL^E_STRICT);
include 'app/Mage.php';
Mage::setIsDeveloperMode(true);
Mage::app();

$origDir = Mage::getModuleDir('controllers','Creativestyle_CheckoutByAmazon').DS;
require_once $origDir.'CheckoutController.php';

$controller = new MyModule_CheckoutByAmazon_CheckoutController(
    Mage::app()->getRequest(),    //required constructor arg
    Mage::app()->getResponse()    //required constructor arg
);

echo get_class($controller);

yoursite.com/test.php にアクセスすると、コントローラーのクラス名が表示されます。エラーが表示される場合、または何も表示されない場合は、かなり低レベルの何かが壊れています。エラー メッセージが直感的でない場合は、モジュール構成がマージされていることを確認し、そこから移動してください。

クラスがインスタンス化される場合、次のことがわかります。

  1. ベースモジュールの構成は良好です
  2. ファイル構造は構成に適しています
  3. 明示的なインクルードは良い

問題は構成に基づいていると私は信じているので、あなたはここまでやってくれるのではないかと思います。いくつかの可能性があります。洞察を得るために、 test.phpを次のように修正します (PHP >= 5.3 を想定)。

<?php
ini_set('display_errors',1);
error_reporting(E_ALL^E_STRICT);
include 'app/Mage.php';
Mage::setIsDeveloperMode(true);
Mage::app();

$router = Mage::app()->getFrontController()->getRouter('standard');
/* @var $router Mage_Core_Controller_Varien_Router_Standard */

$reflection = new ReflectionClass($router);
$modules = $reflection->getProperty('_modules');
$modules->setAccessible(true);

var_dump($modules->getValue($router));

出力は次のようになります。

array(35) {
  ["core"]=>
  array(1) {
    [0]=>
    string(9) "Mage_Core"
  }
  ["install"]=>
  array(1) {
    [0]=>
    string(12) "Mage_Install"
  }
  ["directory"]=>
  array(1) {
    [0]=>
    string(14) "Mage_Directory"
  }
  // ...
  ["checkout"]=>
  array(2) {
    [0]=>
    string(25) "MyModule_CheckoutByAmazon"
    [1]=>
    string(13) "Mage_Checkout"
  }
  // ...
}

複数のサブアレイが表示される場合は常に、コントローラ ディレクトリの書き換えがあります。

于 2013-04-05T12:54:11.717 に答える