管理者で[設定を保存]をクリックした後にアクションを呼び出す


7

[システム]-> [構成]-> [カタログ]で[構成の保存]をクリックした後、カスタムモジュールでコントローラーのアクションを呼び出すにはどうすればよいですか?(画像

モジュールの設定はそのセクション内にあり、構成が保存された直後にアクションを起動する必要があります。管理パネルのそのセクションでのみアクションを呼び出す必要があります-管理の別のセクションで[構成を保存]をクリックした場合、アクションを呼び出す必要はありません。

編集:

アクションは、モジュールの保存された設定が正しいかどうかを確認し、構成が保存されるたびに他の計算を行う必要があります。

編集2:

Fabian Blechschmidtが投稿した解決策を試しました。「構成の保存」をクリックした後、オブザーバーは機能しています(ログファイルにテキストが表示されます)。

config.xml:

<config>
...
    <global>
        <events>
            <admin_system_config_changed_section_mysection>
                <observers>
                    <mymodule>
                        <type>singleton</type>
                        <class>mymodule/observer</class>
                        <method>handle_adminSystemConfigChangedSection</method>
                    </mymodule>
                </observers>
            </admin_system_config_changed_section_mysection>
        </events>
    </global>
...
</config>

Model / Observer.php:

class My_Module_Model_Observer
{
    public function handle_adminSystemConfigChangedSection()
    {
        Mage::log('Test: oberver is working!');

        //I tried this but it doesn't actually trigger the action:
        $url = Mage::getUrl('myrouter/adminhtml_test/validate');
        Mage::app()->getResponse()->setRedirect($url);
    }
}

しかし、今は行き詰まっています。

そのオブザーバー内でアクションメソッドをトリガーする方法がわかりません。コントローラは次のようになり、正常に動作します。

config.xml:

<admin>
    <routers>
        <mymodule>
            <use>admin</use>
            <args>
                <module>My_Module</module>
                <frontName>myrouter</frontName>
            </args>
        </mymodule>
    </routers>
</admin>

controllers / Adminhtml / TestController.php:

class My_Module_Adminhtml_TestController extends Mage_Adminhtml_Controller_Action
{   
    public function validateAction()
    {
        //validate config settings here
    }
}

編集3:

イベントオブザーバーソリューションは正常に機能するため、アクションへのリダイレクトに関する別の質問を作成 しました。モジュール/コントローラー/アクションにリダイレクトします

回答:


10

あなたの問題は正確には何ですか?あなたの道:

  1. オブザーバーを登録し、に耳を傾けadmin_system_config_changed_section_{$section}/app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php:177
  2. 好きなことをして

ありがとうございました。1)<events>セクションは<global>config.xml内またはどこかにある必要がありますか?2)オブザーバー内で自分の行動を呼び出す方法がわかりません。正しい方向に向けてもらえますか?@ファビアン
zitix

イベントを追加するには、global、frontend、adminhtmlの3つのオプションがあります。グローバルは常に呼び出され、フロントエンドではフロントエンドのみ、バックエンドではadminhtmlのみが呼び出されます。したがって、adminhtmlは適切なはずです
Fabian Blechschmidt 2013

そして、どのようにオブザーバーメソッドでコントローラー/アクションにリダイレクトするのですか?
zitix 2013

Mage :: app()-> getRequest()-> setRedirect( 'checkout / index')
Fabian Blechschmidt

6

バックエンドモデルを構成設定の1つに設定できます。このモデルでは_beforeSave_afterSaveおよびのようなメソッドを追加でき、POST変数にアクセスすることもできます。このように、設定を追加する場所に関係なく、モデルメソッドがトリガーされます。
例を見るにはapp/code/code/Mage/Core/etc/syste.xml、パスでMagentoがどのように実行するかを確認してくださいtrans_email/ident_custom1/email
これにはバックエンドモデル<backend_model>adminhtml/system_config_backend_email_address</backend_model>
がありMage_Adminhtml_Model_System_Config_Backend_Email_Address_beforeSaveメソッドでは入力された電子メールアドレスを検証します。


1

config.xmlの名前空間/オブザーバー構文ではなく、完全なクラス名を使用する場合、私にとってはうまくいきます。これを試して。

config.xml

<config>
...
    <global>
        <events>
            <admin_system_config_changed_section_mysection>
                <observers>
                    <mymodule>
                        <type>singleton</type>
                        <class>Namespace_Mymodule_Model_Observer</class>
                        <method>handle_adminSystemConfigChangedSection</method>
                    </mymodule>
                </observers>
            </admin_system_config_changed_section_mysection>
        </events>
    </global>
...
</config>

Model / Observer.php

class Namespace_Mymodule_Model_Observer
{
    public function handle_adminSystemConfigChangedSection()
    {
        die('I have called the admin config changed observer');
        // Web browse to admin config section, change something, then save it
        // Program should die with above message
        // Then replace these lines with whatever you want it to do, eg

        // If option 1 is switched to false, then switch option 2 to false
        $switch1 = Mage::getStoreConfig('mysection/mytab/myoption1', Mage::app()->getStore());
        if (!$switch1) {
            Mage::getConfig()->saveConfig('mysection/mytab/myoption2', false);
            Mage::getConfig()->reinit();
            Mage::app()->reinitStores();
        }
    }
}

0

Mage.phpイベントディスパッチで一時的なログを使用した後、controller_action_postdispatch_adminhtml_catalog_product_saveイベントを使用しました。これは、管理者で本当に発生した唯一のイベントでしたが、すべての製品の保存では発生しませんでした(たとえば、API製品の保存が使用されている場合は発生しません)。

オブザーバー関数でvar_dumpを使用して、必要なデータを掘り出すことができました。

オブザーバーでは、このようなことを行うことができます。オブジェクトの詳細を調べて、探し方を学んだら、探しているほとんどすべてのデータを見つける方法があります。

public function syncProducts($observer) {
   $event = $observer->getEvent();

   // After var_dump($event) i learned that params were available in the controller
   $controllerAction = $event->getControllerAction();

   // Then I saw that the original request was available
   $request = $controllerAction->getRequest()

   // Then i noticed that the params were available from the save event
   $params = $request->getParams();

   // From there, it was just a simple array
   $product = $params["product"];
   $sku = $product["sku"];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.