0

Mage_Adminhtml_Catalog_Productを上書きして、[製品の管理]ページのグリッドにいくつかのアクションを追加する機能を追加しようとしています。他の拡張機能(Enhanced Admin Product Gridなど)との競合を防ぐために、ルーターとリダイレクトを正しく取得する方法を知りたいです。

私は2つのオプションを考え出しましたが、どちらも機能しますが、その影響についてはよくわかりません。

オプション1

標準のadminhtml/catalog_productルーターを使用して、モジュールを追加するだけです。これはPOST、への新しいグリッドアクションになりwww.mysite.com/index.php/admin/catalog_product/exampleます。

からの抜粋config.xml

<config>
   ...
   <admin>
      <routers>
         <adminhtml>
            <args>
               <modules>
                  <mymodule before="Mage_Adminhtml">MyCompany_MyModule</mymodule>
               </modules>
            </args>
         </adminhtml>
      </routers>
   </admin>
</config>

グリッドにアクションを追加するオブザーバー:

class MyCompany_MyModule_Model_Observer {

   public function addExampleAction($observer) {
      $block = $observer->getEvent()->getBlock();
      if(get_class($block) =='Mage_Adminhtml_Block_Widget_Grid_Massaction'
         && $block->getRequest()->getControllerName() == 'catalog_product') {
         $block->addItem('example', array(
             'label' => 'execute exampleAction',
             'url' => $block->getUrl('adminhtml/*/example')
         ));
      }
   }

ステートメントadminhtmlの最初の部分として指定されていることに注意してください。$block->getUrl()を使用*/*/exampleすると、モジュールは「拡張管理製品グリッド」では機能POSTwww.mysite.com/index.php/enhancedgrid/catalog_product/exampleません。これは存在しないためです。(この問題は、ルートを書き換えるすべてのモジュールで発生すると思いますか?)

オプション2

モジュールに新しいルートを追加します。これはPOST、への新しいグリッドアクションになりwww.mysite.com/index.php/myrouter/catalog_product/exampleます。

からの抜粋config.xml

<config>
   ...
   <admin>
      <routers>
         <myroute>
            <use>admin</use>
            <args>
               <module>MyCompany_MyModule</module>
               <frontName>myroute</frontName>
            </args>
         </myroute>
      </routers>
   </admin>
</config>

グリッドにアクションを追加するオブザーバー:

class MyCompany_MyModule_Model_Observer {

   public function addExampleAction($observer) {
      $block = $observer->getEvent()->getBlock();
      if(get_class($block) =='Mage_Adminhtml_Block_Widget_Grid_Massaction'
         && $block->getRequest()->getControllerName() == 'catalog_product') {
         $block->addItem('example', array(
             'label' => 'execute exampleAction',
             'url' => $block->getUrl('myroute/*/example')
         ));
      }
   }

$block->getUrl()ステートメントの違いに注意してください。

質問

  1. 他の拡張機能との互換性を高めるオプションはどれですか?それとももっと良い方法はありますか?

  2. アクションが処理されたら、コントローラークラスのどこにリダイレクトしますか?これは私の単純化されたコントローラーです:

    class MyCompany_MyModule_Catalog_ProductController 
          extends Mage_Adminhtml_Catalog_ProductController {
    
        public function exampleAction() {
           ... do stuff ...
           $this->_redirect('*/*/index');
        }
    }
    

    Enhanced AdminProductGridもインストールされていると仮定しましょう。オプション1を使用すると、に*/*/indexリダイレクトされwww.mysite.com/index.php/admin/catalog_product/indexます。これは問題なく機能しますが、正しいURLはである必要があると思いますwww.mysite.com/index.php/enhancedgrid/catalog_product/index。しかし、それが本当に重要であるかどうか、そして他にどの拡張機能がインストールされているかわからない場合の方法がわかりません。

    オプション2を使用すると、MyCompany_MyModule_Catalog_ProductControllerにindexAction()がないため、ページが空になるように*/*/indexリダイレクトされます。www.mysite.com/index.php/myrouter/catalog_product/indexだから私はadminhtml/*/index代わりにリダイレクトするものを使用する必要がありますwww.mysite.com/index.php/admin/catalog_product/index-上記と同じ疑問...

この長い質問を読むのに時間を割いてくれた人に感謝します!!!

4

1 に答える 1

1

私はいくつかの調査を行い、質問に自分で答えようとしましたが、少なくとも1番については、今ではかなり自信があります。

  1. ここでAlan Storm によって説明されているように、オプション 1 (カスタムのものを定義するのではなく、標準の管理者フロント名 (adminhtml ルーター) を使用する) が推奨される方法です。

    「管理ルーターに複数のフロント名を定義することは可能ですが、そうしないことをお勧めします (以前のアドバイスにもかかわらず)。管理コンソール アプリケーションには、admin のフロント名を想定している部分があります。ページが読み込まれ、動作しますが、代替管理者のフロントネーム、特定の機能 (リッチ テキスト エディターのメディア ギャラリー統合など) は、そうでない場合があります。

    これらの特殊なケースを回避することは可能ですが、モジュールを admin フロント名/adminhtml 構成ルーター ノードに滑り込ませ、コントローラー名と Mage_Adminhtml モジュール コントローラー名が重複しないように注意することをお勧めします。」

  2. */*/index他のモジュールで定義された書き換えに関係なく、 www.mysite.com/index.php/admin/catalog_product/index にリダイレクトする理由はまだよくわかりません。しかし、それは機能するので、それはそのままにしておきます。

于 2013-03-14T21:55:47.120 に答える