Я хочу иметь разный макет страницы, не найденной на странице 404. Как я могу установить другой макет для этой страницы?Cakephp - как сделать страницы ошибок имеют свои собственные макеты?
ответ
Савант из IRC помог мне, и он предложить в использовании beforeRender(){}
в app_controller
// Before Render
function beforeRender() {
if($this->name == 'CakeError') {
//$this->layout = 'error';
}
}
CakeError является Catchall ошибок: D
Это самый простой способ я знаю, чтобы создать эту функцию в AppController
:
function appError($method, $messages)
{
}
Вы можете делать все, что вы хотите с ошибкой, показать его, как вам нравится, или не отображать его на всех, отправьте электронное письмо и т. д. (я не уверен, если этот метод, если он все еще действителен.)
Существует также возможность создания app_error.php
в корне вашего приложения с class AppError extends ErrorHandler
, в котором вы можете переопределить все виды ошибки. Но я еще этого не сделал, поэтому больше не могу рассказать об этом.
См. cake/libs/error.php и cake/libs/object.php и, конечно, The Book для получения дополнительной информации.
Редактировать: Запомнилось, что после того, как вы поймали ошибку, вам нечего мешать - например, сохранить ошибку в сеансе, перенаправить на ваш «контроллер обработки ошибок», а затем отобразить его на контроллере вы хотите.
Большое спасибо: D –
лучше создать файл error.php в приложении папка
class AppError extends ErrorHandler {
function error404($params) {
$this->controller->layout = 'error';
parent::error404($params);
}
}
так что вы можете избежать, если тестирование на каждой странице делают это решение Savants' представляет
В 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);
}
}
Невозможно выдвинуть это достаточно, бьет мой старый подход, дублируя каждое представление ошибки и устанавливая макет 'error' вверху. – Matthew
Мое решение для CakePHP 2,3
Ch ange 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 не вызывайте бесконечный цикл при выполнении исключения. Заставляет базовую визуализацию сообщения об исключениях каждый раз.
Просто вам нужно внести изменения в файл error400.ctp в/app/View/Errors/error400.не CTP
Открыть этот файл и установить расположение по
<?php $this->layout=''; //set your layout here ?>
Этот метод больше не действует с CakePHP 2.x. И я понятия не имею, как это сделать сейчас ... lol –
Я могу подтвердить, что этот метод работает с Cake 2.2.1. – bancer
Я не подтверждаю в пироге 2.2.1. Я отлаживаю $ this-> layout внутри beforeRender, я получаю ожидаемый «public_layout», но он по-прежнему отображается в default.ctp. DEBUG установлен в 0. –