Cakephp-如何使错误页面有自己的布局?

Cakephp-如何使错误页面有自己的布局?,cakephp,cakephp-1.3,Cakephp,Cakephp 1.3,我想有一个不同的页面布局找不到404页。如何为该页面设置不同的布局?我知道的最简单的方法是在您的AppController中创建此函数: function appError($method, $messages) { } 然后,您可以对错误执行任何您想要的操作,以您喜欢的方式显示它,或者根本不显示它,发送电子邮件等等。。(我不确定这个方法是否仍然有效。) 还有一个选项可以在应用程序根目录中创建app\u error.php,其中包含class AppError extensed ErrorHa

我想有一个不同的页面布局找不到404页。如何为该页面设置不同的布局?

我知道的最简单的方法是在您的
AppController中创建此函数:

function appError($method, $messages)
{
}
然后,您可以对错误执行任何您想要的操作,以您喜欢的方式显示它,或者根本不显示它,发送电子邮件等等。。(我不确定这个方法是否仍然有效。)

还有一个选项可以在应用程序根目录中创建
app\u error.php
,其中包含
class AppError extensed ErrorHandler
,这使您能够覆盖所有类型的错误。但我还没做过,所以我不能告诉你更多

有关更多信息,请参见和


编辑:忘了提及,一旦发现错误,就没有什么可以阻止您-例如-将错误存储在会话中,重定向到“错误处理控制器”,然后在控制器中以您想要的方式显示它。

来自IRC的Savant帮助了我,他建议使用
beforeRender(){}
在应用程序控制器中

// Before Render
function beforeRender() {
    if($this->name == 'CakeError') {
        //$this->layout = 'error';
    }
}

CakeError是错误的捕获工具:最好在应用程序文件夹中创建error.php文件

class AppError extends ErrorHandler { 
    function error404($params) { 
            $this->controller->layout = 'error'; 
            parent::error404($params); 
    } 
}

因此,您可以避免savants的解决方案在CakePHP 2.2.2中引入的每个页面呈现时进行if测试。我用自己的方法更改了core.php中的ExceptionRenderer,如下所示:

app/Config/core.php:

Configure::write('Exception', array(
  'handler' => 'ErrorHandler::handleException',
  'renderer' => 'MyExceptionRenderer', // this is ExceptionRenderer by default
  'log' => true
));
Configure::write('Exception', array(
  'handler' => 'ErrorHandler::handleException',
  'renderer' => 'MyExceptionRenderer',
  '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);
  }

}
 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;
    }
 }

我的CakePHP 2.3解决方案

将core.php中的ExceptionRenderer更改为使用您自己的渲染器

app/Config/core.php:

Configure::write('Exception', array(
  'handler' => 'ErrorHandler::handleException',
  'renderer' => 'MyExceptionRenderer', // this is ExceptionRenderer by default
  'log' => true
));
Configure::write('Exception', array(
  'handler' => 'ErrorHandler::handleException',
  'renderer' => 'MyExceptionRenderer',
  '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);
  }

}
 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抛出的任何异常在呈现异常时不会导致无休止的循环。每次强制基本呈现异常消息。

只需在/app/View/Errors/error400.ctp下的error400.ctp文件中更改布局即可

打开该文件并按设置布局

<?php $this->layout=''; //set your layout here ?>


此方法在CakePHP 2.x中不再有效。我现在不知道怎么做。。。lolI在蛋糕2.2.1中没有确认。我在PreRender中调试$this->layout,得到预期的“public_layout”,但它仍然在default.ctp中呈现。DEBUG设置为0。这还不够,这比我以前复制每个错误视图并在顶部将布局设置为
error
的方法要好。对于一个非常简单的解决方案,+1。工作的待遇,几乎不需要任何努力!(CakePHP 2.4.7)