Magento 1:コアコントローラークラスをオーバーライド/書き換える方法


7

:これは、コントローラーの書き換えがどのように機能するかを完全に説明する正規の質問であり、より具体的な「コントローラーXをオーバーライドする方法」または「書き換えが機能しない理由」の質問の重複ターゲットとして使用できます。

参照:Magento 1のオーバーライドに関する正規の質問を探す

たとえば、カスタムモジュールのコアコントローラークラスを変更する必要があるとします(メソッドの変更またはメソッドの追加)。これをどのようにして、段階的に行いますか?


1
Magento 1にはすでに多くの包括的な回答があると思いませんか?PSあなたは私の最新の質問を見ることができます:)
Vishwas Bhatnagar

2
これについてどう思うかわからない。(これは非難でも賞賛でもありません。)
ベンマークス

1
@VishwasBhatnagarは、質問のリンクを確認して、そのような質問がなぜ行われるのかを完全に理解してください;)
Raphael at Digital Pianism

@benmarksは、uについてこれについて話し合いたい場合は、私に連絡してください。たぶん、ファビアンもそこにいるはずです
デジタルピアニズムのラファエル

回答:


11

複数のアプローチがありますが、いくつかの一般的な誤解を明確にするために、それ行われていない方法から始めます。

  1. それはだことはできないためにオーバーライドするには、それらをコピーすることによって、コントローラクラスをapp/code/local。これは、コントローラークラスがによって読み込まれるのVarien_Autoloadではなく、ファイルが明示的に含まれるためです。
  2. お勧めしません使用する<rewrite><controller><to>もう構文を。これは、Magento 1.3以降廃止された古い手法です(「コントローラの上書きvsアクションコントローラの要求の上書き」を参照)。

コントローラーアクションの追加/上書き

既存のコントローラーにコントローラーアクションを追加するには、config.xmlで以下を使用します。

<frontend>             <--- area (adminhtml or frontend)
    <routers>
        <checkout>     <--- front name (in admin always "adminhtml")
            <args>
                <modules>
                    <stack_checkout before="Mage_Checkout">Stack_Checkout</stack_checkout>
                                                  ^                ^
                                                  |                |
                                           module to override      |
                </modules>                 (in admin always        |
            </args>                        "Mage_Adminhtml")   your module
        </checkout>
    </routers>
</frontend>

次に、モジュールにコントローラを作成します

class Stack_Checkout_OnepageController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        // here you override checkout/onepage/index
    }
    public function helloAction()
    {
        // here you create a new action checkout/onepage/hello
    }
}

Magentoは両方のクラスを次のように定義された順序で検索するため、元のコントローラークラスを拡張する必要はありません。 before="..."

元のクラスから他のメソッドを再利用するために拡張する必要がある場合は、それを含める必要があります(コントローラーはオートロードされないことに注意してください)。

require_once(Mage::getModuleDir('controllers','Mage_Checkout') . DS . 'OnepageController.php');

オブザーバーを使用してコントローラーアクションを変更する

新しいアクションを追加しない場合の代替策は、オブザーバーを使用して既存のアクションの動作を変更することです。すべてのコントローラーアクションcontroller_action_predispatch_$FRONTNAME_$CONTROLLER_$ACTIONは、たとえば、フォームで動的な「事前ディスパッチ」イベントをトリガーします。controller_action_predispatch_checkout_onepage_index

オブザーバーでは、次を使用してコントローラークラス自体にアクセスできます。

$controller = $observer->getControllerAction();

元のメソッドがトリガーされないようにするには、アクションをさらにディスパッチしないようにMagentoに指示します。

$controller->setFlag('', Mage_Core_Controller_Front_Action::FLAG_NO_DISPATCH, true);

完全を期すために、同様の方法で「ディスパッチ後」イベントを防止することもできますが、これは通常は必要ありません(これが役立つ例です:XMLに追加のコンテンツがあります):

$controller->setFlag('', Mage_Core_Controller_Front_Action::FLAG_NO_POST_DISPATCH);

そういえば、元のアクションが実行された後にcontroller_action_postdispatch_$FRONTNAME_$CONTROLLER_$ACTION追加のアクションや応答の変更を実行したい場合は、オブザーバーを追加することもできます。


3

リライト:

クラスでmagento Coreクラスを書き換えると、書き換えが行われます。

1)書き換えの例: 書き換えでは、独自のクラスを作成してコアクラスを拡張する必要があり、magentoコア関数または独自の関数とロジックをそこで書き換えることができます

config.xmlファイル

<config>
<frontend>
    <routers>
        <tag>
            <args>
                <modules>
                    <inchoo_tag before="Mage_Tag">Inchoo_Tag</inchoo_tag>
                </modules>
            </args>
        </tag>
    </routers>
</frontend>

あなたのコントローラーファイル

require_once(Mage::getModuleDir('controllers','Mage_Tag').DS.'TagController.php');


class Inchoo_Tag_TagController extends Mage_Tag_TagController
{
// some code
}

Adminhtmlで

yourconfig.xmlで

<config>
<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <inchoo_tag before="Mage_Adminhtml">Inchoo_Tag_Adminhtml</inchoo_tag>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>

そしてあなたのコントローラークラスは

require_once(Mage::getModuleDir('controllers','Mage_Adminhtml').DS.'TagController.php');


class Inchoo_Tag_Adminhtml_TagController extends Mage_Adminhtml_TagController
{
// some code
}

Inchooチームに感謝しますこの素晴らしい記事のために

http://inchoo.net/magento/overriding-magento-blocks-models-helpers-and-controllers/


1
久しぶりですが、コードプールを介してコントローラークラスの定義をオーバーライドすることはできないと思います。
ベンマークス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.