Cuộc gọi hành động sau khi Lưu Lưu cấu hình, đã được nhấp vào quản trị viên


7

Làm cách nào tôi có thể gọi một hành động của bộ điều khiển của mình trong mô-đun tùy chỉnh sau khi nhấp vào "Lưu cấu hình" trong Hệ thống -> Cấu hình -> Danh mục? ( hình ảnh )

Các cài đặt của mô-đun của tôi nằm trong phần đó và tôi cần kích hoạt hành động của mình ngay sau khi cấu hình được lưu. Tôi chỉ cần gọi hành động trong phần đó của bảng quản trị - nếu nhấp vào "Lưu cấu hình" trong một phần khác của quản trị viên, thì không cần phải gọi hành động đó.

BIÊN TẬP:

Hành động phải kiểm tra xem các cài đặt đã lưu của mô-đun có chính xác không và thực hiện một số tính toán khác mỗi khi cấu hình được lưu.

EDIT 2:

Tôi đã thử giải pháp được đăng bởi Fabian Blechschmidt. Observer đang hoạt động sau khi nhấp vào "Lưu cấu hình" (Tôi thấy văn bản trong tệp nhật ký):

cấu hình:

<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);
    }
}

Nhưng bây giờ tôi bị mắc kẹt.

Tôi không biết làm thế nào để kích hoạt phương thức hành động bên trong người quan sát đó. Bộ điều khiển trông như thế này và nó hoạt động tốt:

cấu hình:

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

bộ điều khiển / adminhtml / TestControll.php:

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

EDIT 3:

Giải pháp quan sát sự kiện hoạt động tốt, vì vậy tôi đã tạo một câu hỏi riêng về việc chuyển hướng đến các hành động: Chuyển hướng đến mô-đun / bộ điều khiển / hành động

Câu trả lời:


10

Chính xác thì vấn đề của bạn là gì? Con đường của bạn:

  1. Đăng ký một người quan sát, lắng nghe admin_system_config_changed_section_{$section},/app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php:177
  2. làm bất cứ điều gì bạn muốn

Cảm ơn bạn. 1) <events>Phần có phải ở bên trong <global>hoặc ở nơi nào khác trong config.xml không? 2) Tôi không biết cách gọi hành động của mình trong người quan sát, bạn có thể chỉ cho tôi đi đúng hướng không? @Fabian
zitix

Có ba tùy chọn để thêm các sự kiện: toàn cầu, frontend và adminhtml. Toàn cầu được gọi mọi lúc, frontend chỉ ở frontend, adminhtml chỉ trong phần phụ trợ. Vì vậy, adminhtml nên tốt
Fabian Blechschmidt

Và làm thế nào để chuyển hướng đến bộ điều khiển / hành động trong phương thức quan sát viên?
zitix

Mage :: app () -> getRequest () -> setRedirect ('thanh toán / chỉ mục')
Fabian Blechschmidt

6

Bạn có thể đặt mô hình phụ trợ cho một trong các cài đặt cấu hình của mình. Trong mô hình này bạn có thể thêm các phương pháp như _beforeSave_afterSavevà bạn cũng có thể sử dụng POST vars. Bằng cách này, nó không phải là nơi bạn thêm cài đặt của mình, các phương thức mô hình sẽ được kích hoạt.
Để xem một ví dụ kiểm tra cách Magento thực hiện app/code/code/Mage/Core/etc/syste.xml, đường dẫn trans_email/ident_custom1/email.
Nó có các mô hình backend <backend_model>adminhtml/system_config_backend_email_address</backend_model>
Và trong Mage_Adminhtml_Model_System_Config_Backend_Email_Addresscác _beforeSavexác nhận phương pháp địa chỉ email đã nhập vào.


1

Nó hoạt động với tôi nếu tôi sử dụng tên lớp đầy đủ thay vì cú pháp không gian tên / quan sát viên trong config.xml. Thử cái này.

cấu hình

<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

Tôi đã sử dụng sự kiện control_action_postdispatch_adminhtml_catalog_product_save, sau khi sử dụng một số đăng nhập tạm thời trong công văn sự kiện Mage.php. Đó là sự kiện duy nhất thực sự bị sa thải trong quản trị viên, nhưng không phải trên tất cả các lần lưu sản phẩm (ví dụ: nó không kích hoạt khi sử dụng lưu sản phẩm api).

Tôi đã có thể sử dụng var_dump trong chức năng quan sát viên của mình để khai thác dữ liệu tôi muốn.

Trong bộ quan sát của bạn, bạn có thể làm những việc như thế này ..... Có nhiều cách để tìm hiểu sâu về các đối tượng và tìm thấy hầu hết mọi dữ liệu bạn đang tìm kiếm, một khi bạn học cách tìm kiếm.

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"];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.