вторник, 27 декабря 2011 г.

Magento. Редиректы. Суровая правда.

Хм... Что, Вас опять мучает, уже который час, надоедливый вопрос: как же все таки отправить пользователя на другую страницу админки (обрабатываемую другим контоллером)?
Небольшие пояснения по этому поводу.
Существует несколько методов для редиректа. Это редирект на определенный URL например http://www.example.com/test/foo. И редирект с параметрами, но в этом случае необходимо использовать путь распознаваемый роутером (наверняка вы встречали в коде контроллеров редиректы с такими путями */* или */index и пр.).
Код применим в методах контроллеров:
Первый способ.
$this->_redirectUrl($url);
Второй способ.
$params = array ("arg1" => "foo", "arg2" => "bar");
$this->_redirect($path, $params);
Надо заметить, если вы включили в админке безопасные ссылки то для редиректа в админ-панели, надо сгенерировать безопасную ссылку следующим способом:
Оговорюсь сразу, тут надо применить костыль, т.к. ссылку то мы получим, но генератор вырежет из нее часть ссылающуюся на админку. Я не нашел элегантного способа обойти это, поэтому не привожу пример костыля, ибо считаю что код-костыль не имеет право на публикацию :).
// Может принимать значения и по маске роутера, например */*
$path = 'admin/system_convert_profile/run' // Этот путь, к примеру, на запуск профиля импорта/экспорта
$params = array ("id" => 8);
$url = Mage::helper('adminhtml')->getUrl($path, $params);
// Дальше код-костыль которые возвращает утеряное
$this->_redirectUrl($url);
Чтобы установить редирект не в контроллере надо обратиться к объекту Response.
// Для первого способа, с указанием URL
$url = "http://www.example.com/";
Mage::app()->getFrontController()->getResponse()->setRedirect($url);
// Для второго способа, с указанием пути (в формате роутера магенты и параметров)
$path   = "news/archive";
$params = array ("arg1" => "foo", "arg2" => "bar");
Mage::app()->getFrontController()->getResponse()->setRedirect(Mage::getUrl($path, $params));

2 комментария:

  1. Долго разбирался с редиректом в Magento, тоже использовал костыли, но решение есть, пробовал и нашел! вот solution!

    $path = 'admin/system_convert_profile/run';
    вместо этого пути нужно использовать такой

    $path = 'adminhtml/system_convert_profile/run';
    тогда ссылка получится с admin/, и костылей не надо :)

    ОтветитьУдалить
    Ответы
    1. Да, забавно, главное действительно красиво и просто.

      Удалить