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

Har*_*M V 13 cakephp cakephp-1.3

我想为找不到404页面的页面设置不同的布局.如何为该页面设置不同的布局?

Har*_*M V 26

来自IRC的Savant帮助了我,他建议在beforeRender(){}app_controller 中使用

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

CakeError是一个错误的catchAll:D

  • 我可以确认这个方法适用于Cake 2.2.1. (3认同)

exp*_*ora 15

在CakePHP 2.2.2中,我用自己的方式更改了core.php中的ExceptionRenderer,如下所示:

应用程序/配置/ core.php文件:

Configure::write('Exception', array(
  'handler' => 'ErrorHandler::handleException',
  'renderer' => 'MyExceptionRenderer', // this is ExceptionRenderer by default
  'log' => true
));
Run Code Online (Sandbox Code Playgroud)

应用程序/库/错误/ MyExceptionRenderer.php:

App::uses('ExceptionRenderer', 'Error');

class MyExceptionRenderer extends ExceptionRenderer {

  protected function _outputMessage($template) {
    $this->controller->layout = 'error';
    parent::_outputMessage($template);
  }

}
Run Code Online (Sandbox Code Playgroud)


pti*_*ica 11

最好在app文件夹中创建一个error.php文件

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

所以你可以避免在savants的解决方案引入的每个页面渲染中进行if-testing


Yas*_*eja 11

只需要在/app/View/Errors/error400.ctp下的error400.ctp文件中进行布局更改

打开该文件并设置布局

<?php $this->layout=''; //set your layout here ?>
Run Code Online (Sandbox Code Playgroud)


Rea*_*lar 5

我对CakePHP 2.3的解决方案

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

应用程序/配置/ core.php文件:

Configure::write('Exception', array(
  'handler' => 'ErrorHandler::handleException',
  'renderer' => 'MyExceptionRenderer',
  'log' => true
));
Run Code Online (Sandbox Code Playgroud)

应用程序/库/错误/ 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;
    }
 }
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是它确保从AppController抛出的任何异常在呈现异常时不会导致无限循环.每次都强制执行异常消息的基本呈现.