Подтвердить что ты не робот

CakePHP - как сделать страницы ошибок имеют свои собственные макеты?

Я хочу иметь другой макет страницы, не найденной на странице 404. Как я могу установить другой макет для этой страницы?

4b9b3361

Ответ 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, не приводят к бесконечному циклу при визуализации исключения. Заставляет базовую визуализацию сообщения об исключениях каждый раз.