在Observer中输入404页面

时间:2015-05-27 12:11:08

标签: php magento http-status-code-404 magento-1.9 observers

我有一个观察者:<controller_action_predispatch_catalog_category_view>在我的观察者中触发一个函数来检查用户限制。

如果不允许客户查看此类别,我想向他们显示默认的Magento 404错误页面。 这就是我现在陷入困境的地方。

当我查找404页面控制器时:<Mage_Cms_IndexController> 它向我展示了这个函数“defaultIndex”:

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

但在我的观察者中,我无法调用方法loadLayoutrenderLayout这是非常明显的。

我不想将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页面而不是目录布局,但我该怎么做?

我们非常感谢任何建议。

2 个答案:

答案 0 :(得分: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);

希望这有助于某人:)

答案 1 :(得分:2)

我能够在不弄乱请求对象的情况下实现这一点,p!

$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; } } } 的转发

span