在Observer中输入404页面
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Observer中输入404页面相关的知识,希望对你有一定的参考价值。
我有一个观察者:<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();
}
但在我的观察者中,我不能称之为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页面而不是目录布局,但我该怎么做?
任何建议将不胜感激。
回答:
我不能马上使用->_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);
希望这有助于某人:)
我能够实现这一点而不会弄乱请求对象,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;
}
}
}
以上是关于在Observer中输入404页面的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的IE在输入格中随便输入啥都是404页面如:中国,百度。360浏览器确没问题. 求高人解决 .
Fragment Recreation 导致 Observer 使用 Androidx Navigation 库触发 onChanged()