Cakephp - как сделать так, чтобы страницы ошибок имели собственные макеты? - PullRequest
13 голосов
/ 10 октября 2010

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

Ответы [ 6 ]

26 голосов
/ 10 октября 2010

Савант из IRC помог мне, и он предлагает использовать beforeRender(){} в app_controller

// Before Render
function beforeRender() {
    if($this->name == 'CakeError') {
        //$this->layout = 'error';
    }
}

CakeError - это ловушка для ошибок: D

15 голосов
/ 24 сентября 2012

В 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);
  }

}
11 голосов
/ 26 апреля 2012

лучше создать файл error.php в папке вашего приложения

class AppError extends ErrorHandler { 
    function error404($params) { 
            $this->controller->layout = 'error'; 
            parent::error404($params); 
    } 
}

, чтобы вы могли избежать тестирования if на КАЖДОЙ странице, которую предлагает решение savants

10 голосов
/ 22 октября 2013

Просто вам нужно внести изменения в макет в файле error400.ctp в /app/View/Errors/error400.ctp

Открыть этот файл и установить макет с помощью

<?php $this->layout=''; //set your layout here ?>
5 голосов
/ 11 января 2013

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

4 голосов
/ 10 октября 2010

Это самый простой способ, который я знаю, это создать эту функцию в вашем AppController:

function appError($method, $messages)
{
}

После этого вы можете делать с ошибкой все, что хотите, отображать ее так, как вам нравится, или не отображать еевообще, отправьте электронное письмо и т. д. (я не уверен, если этот метод все еще действителен.)

Существует также возможность создания app_error.php в корне вашего приложения, с class AppError extends ErrorHandler в нем, что позволяет переопределить все виды ошибок.Но я этого еще не сделал, поэтому не могу рассказать вам больше об этом.

См. cake / libs / error.php и cake / libs / object.php и, конечно, Книга для получения дополнительной информации.

Редактировать: Забыл упомянуть, как только вы поймали ошибку, ничто не мешает вам - дляпример - сохранить ошибку в сеансе, перенаправить на свой «контроллер обработки ошибок», а затем отобразить ее в своем контроллере так, как вы хотите.

...