Киньте 404 страницу в Observer

1

У меня есть наблюдатель: <controller_action_predispatch_catalog_category_view> который запускает функцию в моем наблюдателе для проверки пользовательских ограничений.

Если клиенту не разрешено просматривать эту категорию, я хочу показать им страницу ошибок Magento 404 по умолчанию. Здесь я застрял в данный момент.

Когда я смотрю на 404-страничный контроллер: <Mage_Cms_IndexController> он показывает мне этот форвард для функции defaultDdex:

$this->_forward('defaultIndex');

которая является этой функцией:

public function defaultIndexAction()
{
    $this->getResponse()->setHeader('HTTP/1.1','404 Not Found');
    $this->getResponse()->setHeader('Status','404 File not found');

    $this->loadLayout();
    $this->renderLayout();
}

Но в моем наблюдателе я не могу назвать методы loadLayout и renderLayout что совершенно очевидно.

Я не хочу использовать перенаправление 301/302 на страницу 404, я хочу показать ее непосредственно пользователю без какого-либо перенаправления.

Что у меня есть сейчас:

Mage::app()->getFrontController()->getResponse()->setHeader('HTTP/1.1','404 Not Found');
Mage::app()->getFrontController()->getResponse()->setHeader('Status','404 File not found');

- Мне нужно отобразить страницу 404 вместо макета каталога, но как мне это сделать?

Любые предложения будут высоко ценится.

  • 0
    У тебя есть ответ на это? Мне нужно знать, как тебе это удалось. Пожалуйста, оставьте ответ
Теги:
magento
http-status-code-404
magento-1.9
observers

2 ответа

2

Я смог достичь этого, не вникая в объект запроса, Фу!

$exception = new Mage_Core_Controller_Varien_Exception("404 THIS REQUEST");
$exception->prepareForward('norouteAction');
throw $exception;

Это успешно досталось моим магазинам 404 страницы :)

Причина в том, что он подхвачен catch в Mage_Core_Controller_Varien_Action::dispatch который обрабатывает переадресацию к norouteAction

public function dispatch($action)
{
    try {
        $actionMethodName = $this->getActionMethodName($action);
        if (!method_exists($this, $actionMethodName)) {
            $actionMethodName = 'norouteAction';
        }

        Varien_Profiler::start(self::PROFILER_KEY.'::predispatch');
        $this->preDispatch();
        Varien_Profiler::stop(self::PROFILER_KEY.'::predispatch');

        if ($this->getRequest()->isDispatched()) {
            /**
             * preDispatch() didn't change the action, so we can continue
             */
            if (!$this->getFlag('', self::FLAG_NO_DISPATCH)) {
                $_profilerKey = self::PROFILER_KEY.'::'.$this->getFullActionName();

                Varien_Profiler::start($_profilerKey);
                $this->$actionMethodName();
                Varien_Profiler::stop($_profilerKey);

                Varien_Profiler::start(self::PROFILER_KEY.'::postdispatch');
                $this->postDispatch();
                Varien_Profiler::stop(self::PROFILER_KEY.'::postdispatch');
            }
        }
    }
    catch (Mage_Core_Controller_Varien_Exception $e) {
        // set prepared flags
        foreach ($e->getResultFlags() as $flagData) {
            list($action, $flag, $value) = $flagData;
            $this->setFlag($action, $flag, $value);
        }
        // call forward, redirect or an action
        list($method, $parameters) = $e->getResultCallback();
        switch ($method) {
            case Mage_Core_Controller_Varien_Exception::RESULT_REDIRECT:
                list($path, $arguments) = $parameters;
                $this->_redirect($path, $arguments);
                break;
            case Mage_Core_Controller_Varien_Exception::RESULT_FORWARD:
                list($action, $controller, $module, $params) = $parameters;
                $this->_forward($action, $controller, $module, $params);
                break;
            default:
                $actionMethodName = $this->getActionMethodName($method);
                $this->getRequest()->setActionName($method);
                $this->$actionMethodName($method);
                break;
        }
    }
}
2

ОТВЕТ:

Я не мог сразу использовать ->_forward. Сначала его необходимо инициализировать.

Mage::app()->getFrontController()->getResponse()->setHeader('HTTP/1.1','404 Not Found');
Mage::app()->getFrontController()->getResponse()->setHeader('Status','404 File not found');

$request = Mage::app()->getRequest();
$request->initForward()
    ->setControllerName('indexController')
    ->setModuleName('Mage_Cms')
    ->setActionName('defaultNoRoute')
    ->setDispatched(false);

Надеюсь, это поможет кому-то :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню