Я хочу иметь другой макет страницы, не найденной на странице 404. Как я могу установить другой макет для этой страницы?
CakePHP - как сделать страницы ошибок имеют свои собственные макеты?
Ответ 1
Savant из IRC помог мне и предложил использовать beforeRender(){}
в app_controller
// Before Render
function beforeRender() {
if($this->name == 'CakeError') {
//$this->layout = 'error';
}
}
CakeError является catchAll для ошибок: D
Ответ 2
В CakePHP 2.2.2 я изменил ExceptionRenderer в core.php своим собственным, например:
приложение/Config/core.php:
Configure::write('Exception', array(
'handler' => 'ErrorHandler::handleException',
'renderer' => 'MyExceptionRenderer', // this is ExceptionRenderer by default
'log' => true
));
Приложение/Lib/Error/MyExceptionRenderer.php:
App::uses('ExceptionRenderer', 'Error');
class MyExceptionRenderer extends ExceptionRenderer {
protected function _outputMessage($template) {
$this->controller->layout = 'error';
parent::_outputMessage($template);
}
}
Ответ 3
лучше создать файл error.php в папке вашего приложения
class AppError extends ErrorHandler {
function error404($params) {
$this->controller->layout = 'error';
parent::error404($params);
}
}
чтобы вы могли избежать проверки if на странице КАЖДОЙ страницы, которую предоставляет решение savants
Ответ 4
Просто вам нужно внести изменения макета в файл error400.ctp в /app/View/Errors/error 400.ctp
Откройте этот файл и установите макет
<?php $this->layout=''; //set your layout here ?>
Ответ 5
Самый простой способ, которым я знаю, - создать эту функцию в AppController
:
function appError($method, $messages)
{
}
Затем вы можете делать все, что хотите, с ошибкой, отображать ее, как вам нравится, или вообще не отображать ее, отправлять электронную почту и т.д. (я не уверен, что этот метод, если он все еще действителен.)
Существует также возможность создания app_error.php
в корне вашего приложения с class AppError extends ErrorHandler
в нем, что позволяет вам переопределять все виды ошибок. Но я еще этого не сделал, поэтому я не могу больше рассказать об этом.
См. cake/libs/error.php и cake/libs/object.php и конечно The Book для получения дополнительной информации.
Изменить: Забыл упомянуть, как только вы поймали ошибку, ничего не мешает вам - например - сохранить ошибку в сеансе, перенаправить на ваш "контроллер обработки ошибок", а затем отобразить его в вашем контроллере, однако вы хотите.
Ответ 6
Мое решение для CakePHP 2.3
Измените ExceptionRenderer в core.php, чтобы использовать собственный рендеринг.
приложение/Config/core.php:
Configure::write('Exception', array(
'handler' => 'ErrorHandler::handleException',
'renderer' => 'MyExceptionRenderer',
'log' => true
));
Приложение/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;
}
}
Преимущество такого подхода заключается в том, что он гарантирует, что исключения, выброшенные из AppController, не приводят к бесконечному циклу при визуализации исключения. Заставляет базовую визуализацию сообщения об исключениях каждый раз.