CakePHP 2.0 - How to make custom error pages?
Asked Answered
S

7

31

I read that the AppError class is now for backwards compatibility and that Exceptions should be used instead. How does one go about creating custom error pages for things like 404 errors, or completely custom errors?

Squirmy answered 8/3, 2012 at 15:39 Comment(0)
B
47

Try this:

/app/Config/core.php

Exception render need to set as an AppExceptionRender. Example:

Configure::write('Exception', array(
        'handler' => 'ErrorHandler::handleException',
        'renderer' => 'AppExceptionRenderer',
        'log' => true
));

/app/Controller/ErrorsController.php

class ErrorsController extends AppController {
    public $name = 'Errors';

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('error404');
    }

    public function error404() {
        //$this->layout = 'default';
    }
}

/app/Lib/Error/AppExceptionRenderer.php

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

class AppExceptionRenderer extends ExceptionRenderer {

    public function notFound($error) {
        $this->controller->redirect(array('controller' => 'errors', 'action' => 'error404'));
    }
}

/app/View/Errors/error404.ctp

<div class="inner404">
    <h2>404 Error - Page Not Found</h2>
</div>

Insert it where you need: throw new NotFoundException();

Beloved answered 30/4, 2012 at 6:11 Comment(6)
Also, to get this to work, you need to specify the Exception renderer as AppExceptionRenderer in the core.php file.Few
Thanks @JonathanCairns, I forgot to mention that nuance. Added to code example.Beloved
Thanks, this works. If you only want to customize the content of your page and don't need custom logic, it's sufficient to omit the creation of a designated erros controller and redirect to the Pages-Controller in your AppExceptionRenderer instead.Kulsrud
Also you need to make sure the Renderer knows about your ErrorsController controller. Override _getController in AppExceptionRenderer. book.cakephp.org/2.0/en/development/…Pogey
Another answer on this page only, is an elegant way, and how CakePHP intended it to be.Lummox
@plenix I tried all you said but still not applied and i got other errors like mising customer and othersMulatto
K
40

To customize the content of a 404-error page and don't need custom logic, simply edit the contents of app/View/Errors/error400.ctp.

This seems not to be documented properly anywhere.

Kulsrud answered 10/9, 2012 at 15:16 Comment(3)
Throwing an exceptions is enough to load this error page - throw new NotFoundException();Cacilia
Relevant links (ExceptionRenderer) in documentation for 2.x and documentation for 3.xLummox
And if you have multiple themes?Polypary
Z
8

If you're only looking to use another layout instead of the default, just add $this->layout = 'your_error_layout'; inside your error400.ctp (or any other error page you create under View/Errors).

Zetta answered 26/6, 2013 at 22:50 Comment(0)
B
6

Create a layout with name 404 or anything and use in app controller

function _setErrorLayout() {
    if ($this->name == 'CakeError') { 
        $this->layout = '404';
    }
}
function beforeRender () {
    $this->_setErrorLayout();
}
Bohannan answered 26/1, 2013 at 3:28 Comment(1)
awesome answer :)Enclitic
B
2

The accepted answer is not the best option because they redirect the url of your browser to http://example.com.br/error/error404 and the user can't follow what page he inputed to generate this error.

The better way to handle this situation is edit file on View/Errors/error400.ctp, so when you input a not found url like http:example.com/crazy-wrong-url, the browser will keep this url but render the content of the error400.ctp file that you edit.

If you want change the layout that the view will be rendered you can type this in your view <?php $this->layout = 'error'; ?>

Blastula answered 18/7, 2014 at 1:17 Comment(0)
A
0

You can create CustomErrorPages or Exeptions by simply creating a class of your error your going to show. This class needs to extend CakeExeption. Then build your exeptionlogic and your set. Now you can just throw new <YourExeptionClass>() and it will display an error.

Documentation: CakeExceptions

Aleda answered 10/4, 2012 at 10:3 Comment(1)
But when would I throw that error for a 404? I mean how does one customise the app 404 page now?Squirmy
M
0

Had discovered today that is possible to get excpetion code in ctp file using $error->getCode() (in CakePHP 2.x, at least).

The $error is were Cake puts the exception object...

Now you should be able to change the content of your view with an if/else conditional block, based in this value.

Maxinemaxiskirt answered 31/10, 2014 at 21:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.