我有一个观察者:<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页面而不是目录布局,但我该怎么做?
我们非常感谢任何建议。
答案 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