注:これは、コントローラーの書き換えがどのように機能するかを完全に説明する正規の質問であり、より具体的な「コントローラーXをオーバーライドする方法」または「書き換えが機能しない理由」の質問の重複ターゲットとして使用できます。
たとえば、カスタムモジュールのコアコントローラークラスを変更する必要があるとします(メソッドの変更またはメソッドの追加)。これをどのようにして、段階的に行いますか?
注:これは、コントローラーの書き換えがどのように機能するかを完全に説明する正規の質問であり、より具体的な「コントローラーXをオーバーライドする方法」または「書き換えが機能しない理由」の質問の重複ターゲットとして使用できます。
たとえば、カスタムモジュールのコアコントローラークラスを変更する必要があるとします(メソッドの変更またはメソッドの追加)。これをどのようにして、段階的に行いますか?
回答:
複数のアプローチがありますが、いくつかの一般的な誤解を明確にするために、それが行われていない方法から始めます。
app/code/local
。これは、コントローラークラスがによって読み込まれるのVarien_Autoload
ではなく、ファイルが明示的に含まれるためです。<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
追加のアクションや応答の変更を実行したい場合は、オブザーバーを追加することもできます。
リライト:
クラスで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/