Reputation: 14544
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?
Upvotes: 31
Views: 42113
Reputation: 1852
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).
Upvotes: 8
Reputation: 163
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();
}
Upvotes: 6
Reputation: 1
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.
Upvotes: 0
Reputation: 55
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
Upvotes: 0
Reputation: 1484
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'; ?>
Upvotes: 2
Reputation: 10316
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.
Upvotes: 40
Reputation: 2092
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();
Upvotes: 47