【发布时间】:2011-04-23 09:12:51
【问题描述】:
我想为找不到 404 页面的页面设置不同的布局。如何为该页面设置不同的布局?
【问题讨论】:
标签: cakephp cakephp-1.3
我想为找不到 404 页面的页面设置不同的布局。如何为该页面设置不同的布局?
【问题讨论】:
标签: cakephp cakephp-1.3
来自 IRC 的 Savant 帮助了我,他建议在 app_controller 中使用 beforeRender(){}
// Before Render
function beforeRender() {
if($this->name == 'CakeError') {
//$this->layout = 'error';
}
}
CakeError 是错误的 catchAll :D
【讨论】:
在 CakePHP 2.2.2 中,我用自己的方式更改了 core.php 中的 ExceptionRenderer,如下所示:
app/Config/core.php:
Configure::write('Exception', array(
'handler' => 'ErrorHandler::handleException',
'renderer' => 'MyExceptionRenderer', // this is ExceptionRenderer by default
'log' => true
));
app/Lib/Error/MyExceptionRenderer.php:
App::uses('ExceptionRenderer', 'Error');
class MyExceptionRenderer extends ExceptionRenderer {
protected function _outputMessage($template) {
$this->controller->layout = 'error';
parent::_outputMessage($template);
}
}
【讨论】:
error 的旧方法。
只需要在 /app/View/Errors/error400.ctp 下的 error400.ctp 文件中进行布局更改
打开该文件并设置布局
<?php $this->layout=''; //set your layout here ?>
【讨论】:
最好在你的 app 文件夹中创建一个 error.php 文件
class AppError extends ErrorHandler {
function error404($params) {
$this->controller->layout = 'error';
parent::error404($params);
}
}
这样您就可以避免在专家解决方案引入的每个页面呈现时进行 if 测试
【讨论】:
我对 CakePHP 2.3
的解决方案更改 core.php 中的 ExceptionRenderer 以使用您自己的渲染器。
app/Config/core.php:
Configure::write('Exception', array(
'handler' => 'ErrorHandler::handleException',
'renderer' => 'MyExceptionRenderer',
'log' => true
));
app/Lib/Error/MyExceptionRenderer.php:
App::uses('ExceptionRenderer', 'Error');
class MyExceptionRenderer extends ExceptionRenderer
{
/**
* Overrided, to always use a bare controller.
*
* @param Exception $exception The exception to get a controller for.
* @return Controller
*/
protected function _getController($exception) {
if (!$request = Router::getRequest(true)) {
$request = new CakeRequest();
}
$response = new CakeResponse(array('charset' => Configure::read('App.encoding')));
$controller = new Controller($request, $response);
$controller->viewPath = 'Errors';
$controller->layout = 'error';
return $controller;
}
}
这种方法的优点是它确保从 AppController 抛出的任何异常在呈现异常时不会导致无限循环。每次都强制对异常消息进行基本呈现。
【讨论】:
我知道的最简单的方法是在你的AppController 中创建这个函数:
function appError($method, $messages)
{
}
然后你可以对错误做任何你想做的事情,随意显示它,或者根本不显示它,发送电子邮件等。(我不确定这个方法是否仍然有效。)
还有一个选项可以在您的应用根目录中创建app_error.php,其中包含class AppError extends ErrorHandler,这使您能够覆盖各种错误。但是我还没有这样做,所以我不能告诉你更多关于它的信息。
请参阅cake/libs/error.php 和cake/libs/object.php,当然还有The Book 了解更多信息。
编辑:忘了提一下,一旦你发现错误,没有什么可以阻止你——例如——将错误存储在会话中,重定向到你的“错误处理控制器”,然后显示它在您的控制器中随心所欲。
【讨论】: