コントローラーをオーバーライドしようとしています
-
16-10-2019 - |
質問
私は魔術師のコントローラーをオーバーライドしようとしています Mage/Catalog/controllers/CategoryController.php
.
上記のコントローラーをオーバーライドしようとする際に作成したフォルダー構造は次のとおりです。
--> app
--> code
--> core
--> local
--> Edge
--> AjaxCatalog
--> controllers
--> CategoryController.php
--> etc
--> config.xml
--> etc
--> modules
--> EdgeAjaxCatalog.xml
Edge/ajaxcatalog/controllers/categorycontroller.php:
<?php
require_once Mage::getModuleDir('controllers', 'Mage_Catalog').DS.'CategoryController.php';
class Edge_AjaxCatalog_CategoryController extends Mage_Catalog_CategoryController
{
public function viewAction()
{
echo "alert('hi')"; //even tried Mage::log("controller..");
}
}
Edge/ajaxcatalog/etc/config.xml
<config>
<frontend>
<routers>
<catalog>
<args>
<modules>
<edge_ajaxcatalog before="Mage_Catalog_CategoryController">Edge_AjaxCatalog</edge_ajaxcatalog>
</modules>
</args>
</catalog>
</routers>
</frontend>
</config>
Edge_ajaxcatalog.xml
<?xml version="1.0"?>
<!--we need to enable this module as any other if-->
<!--you wish to do it as standalone module extension-->
<config>
<modules>
<edge_ajaxcatalog>
<active>true</active>
<codePool>local</codePool>
</edge_ajaxcatalog>
</modules>
</config>
それでも、system.logファイルにログメッセージが表示されません。 (ログが有効になっています)
このコントローラーをオーバーライドするには、もっとどうすればよいですか?
助けてください
解決
私の愚見で:
コントローラーの書き換えは災害のレシピであり、コード管理を悪夢にします。すべてのプラグイン開発者(またはすべてのストア開発者 /システムインテグレーター)は、それを本当に信じています 同じコントローラーを書き換える別のプラグインは決してありません. 。しかし、実際には、いつかそれが起こるということです(cartcontroller.phpの場合、それはあまりにも頻繁に起こります)。私の経験では、2つのプラグインを書き直して、鎖で継承された継承を作成する必要があります。 これは最適ではありません。
それで。私の意見では、代わりに、常にコントローラーディスパッチイベントを使用する必要があります。あなたの場合、イベントは次のようになります:
<?xml version="1.0"?>
<config>
<global>
<events>
<controller_action_predispatch_catalog_category_view>
<observers>
<yourcompany_capccv_predispatch>
<class>YourCompany_YourModule_Model_Observer</class>
<method>catalogCategoryViewPredispatch</method>
</yourcompany_capccv_predispatch>
</observers>
</controller_action_predispatch_catalog_category_view>
</events>
</global>
</config>
そしてオブザーバーモデル:
<?php
class YourCompany_YourModule_Model_Observer
{
public function catalogCategoryViewPredispatch($observer)
{
$helper = Mage::helper('core');
$controller = $observer->getEvent()->getControllerAction();
Mage::log("this works");
//you can intercept and massage data on the request object
$request = $controller->getRequest();
$params = $request->getParams();
$request->setParam('escapeme', $helper->escapeHtml($params['escapeme']));
}
}
他のヒント
コントローラークラスには、適切に動作するために呼び出されるメソッドが必要です。また、元のコントローラーを含めるパスは正しくありません。
require_once Mage::getModuleDir('controllers', 'Mage_Catalog').DS.'CategoryController.php';
class Edge_AjaxCatalog_CategoryController extends Mage_Catalog_CategoryController
{
public function viewAction()
{
Mage::log("controller..");
parent::viewAction();
}
}
コアコントローラーの拡張の詳細については、チェックアウトをご覧ください Magentoコアコントローラーを拡張する方法 inchooによって
フロントエンドルーターは次のとおりです。
<frontend>
<routers>
<catalog>
<args>
<modules>
<Edge_AjaxCatalog before="Mage_Catalog">Edge_AjaxCatalog</Edge_AjaxCatalog>
</modules>
</args>
</catalog>
</routers>
</frontend>
カタログルーターを書き換えずにモジュールが機能しているかどうかを確認してください。