質問

私は魔術師のコントローラーをオーバーライドしようとしています 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>

カタログルーターを書き換えずにモジュールが機能しているかどうかを確認してください。

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top