Cakephp - how to make error pages have its own layouts?

北慕城南 提交于 2019-12-21 03:53:31

问题


I wanna have a different layout for the page not found 404 page. How can i set a different layout for that page?


回答1:


Savant from the IRC helped me out and he suggest in using beforeRender(){} in the app_controller

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

CakeError is a catchAll for errors :D




回答2:


In CakePHP 2.2.2 I changed the ExceptionRenderer in core.php with my own, like this:

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

}



回答3:


better to create an error.php file in your app folder

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

so you can avoid the if-testing at EVERY page render that savants' solution introduces




回答4:


Just you need to make layout changes in your error400.ctp file under /app/View/Errors/error400.ctp

Open that file and set layout by

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



回答5:


My solution for CakePHP 2.3

Change the ExceptionRenderer in core.php to use your own renderer.

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

The advantage to this approach is that it ensures any exceptions thrown from AppController don't cause an endless loop when rendering the exception. Forces a basic rendering of the exception message every time.




回答6:


This simplest way I know of is to create this function in your AppController:

function appError($method, $messages)
{
}

You can then do whatever you want with the error, display it however you like, or not display it at all, send an email etc.. (I'm not sure if this method if still valid.)

There is also an option of creating app_error.php in your app root, with class AppError extends ErrorHandler in it, which enables you to override all kinds of errors. But I haven't done this yet, so I can't tell you more about it.

See cake/libs/error.php and cake/libs/object.php and of course The Book for more info.

Edit: Forgot to mention, once you caught the error, there's nothing preventing you to - for example - store the error in session, redirect to your "error handling controller", and then display it in your controller however you want.



来源:https://stackoverflow.com/questions/3899130/cakephp-how-to-make-error-pages-have-its-own-layouts

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!