当我进入观察者方法时,如何重定向到模块/控制器/操作?我需要重定向到myrouter/adminhtml_test/validate。

为什么我需要这个:我尝试发射控制器的动作,该操作必须在 “保存配置” 被单击 System -> Configuration -> Mysection. 。我为活动注册了观察员 admin_system_config_changed_section _ {$ section}.

用我的方法 handle_adminSystemConfigChangedSection()型号/observer.php 我试图发射我的动作,但并没有重定向到该动作:

class My_Module_Model_Observer
{
    public function handle_adminSystemConfigChangedSection()
    {
        //I tried this code but it doesn't trigger the action:
        $url = Mage::helper('adminhtml')->getUrl("myrouter/adminhtml_test/validate");
        Mage::log($url); //To check if URL is correct (and it is correct)
        Mage::app()->getResponse()->setRedirect($url);
    }
}

观察者方法和控制器工作正常(以下是配置详细信息)。我用此代码替换了观察者方法(来自 Magento论坛) 使用 header() 它有效:

public function handle_adminSystemConfigChangedSection()
{
    $url = Mage::helper('adminhtml')->getUrl("myrouter/adminhtml_test/validate");
    Mage::log($url);
    header( 'Location: ' . $url );
    exit();
}

但这似乎并不是重定向到动作的正确方法。应该如何完成?

配置详细信息:

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>
    <admin>
        <routers>
            <mymodule>
                <use>admin</use>
                <args>
                    <module>My_Module</module>
                    <frontName>myrouter</frontName>
                </args>
            </mymodule>
        </routers>
    </admin>
...
</config>

控制器/adminhtml/testcontroller.php中的控制器:

class My_Module_Adminhtml_TestController extends Mage_Adminhtml_Controller_Action
{   
    public function validateAction()
    {
        Mage::log('Test: action is working!'); //To check if action is working
        //do something here...
    }
}
有帮助吗?

解决方案

再次,你想什么 ?将某人从Sysconfig重定向到您的控制器充其量是奇怪的UX,即使您在执行代码后将其重定向回到Sysconfig。如果这就是您的全部工作,那么您应该消耗帖子,让Sysconfig的行为正常。

您(第一个)重定向不起作用的原因是之后 这个事件开火, ,执行流回控制器动作, 然后设置自己的重定向 往常:

class Mage_Adminhtml_System_ConfigController extends Mage_Adminhtml_Controller_Action
{
    public function saveAction()
    {
        // snip ...
        try {
            // snip ...
            Mage::dispatchEvent("admin_system_config_changed_section_{$section}",
                array('website' => $website, 'store' => $store)
            );
            // snip ...            }
        catch (Mage_Core_Exception $e) {
            // snip ...
        }
        catch (Exception $e) {
            // snip ...
        }
            // snip ...

        $this->_redirect('*/*/edit', array('_current' => array('section', 'website', 'store')));
    }

您可以通过几种方式解决这个问题:

  1. (不是理想的)在将重定向设置在浏览器中后冲洗响应;虽然这遵守您当前的意图,但请知道您正在阻止后续的本机代码在操作和中执行 postDispatch().
  2. (更好但仍然很丑 controller_action_postdispatch_adminhtml_system_config_save 使用不同的方法将您的重定向设置。

例如

public function checkShouldRedirect()
{
    $response = Mage::app()->getResponse();

    //use 'mysection' to check we are in correct section
    if (self::$flag==true && $this->getRequest()->getParam('section') == 'mysection') {
        $response->setRedirect(
            Mage::helper('adminhtml')->getUrl('myrouter/adminhtml_test/validate')
        );
        //below is only necessary for option 1
        //$response->sendResponse();
    }
}

如果您要参与第二种选项 - 并且前提您不反对保存开放面板状态的动作 - 您不妨将观察者设置为消费 只要 dostdispatch事件,因为您可以通过测试来测试您要保存的部分 section 参数。

许可以下: CC-BY-SA归因
scroll top