13 Stimmen

Cakephp - wie man Fehler Seiten haben ihre eigenen Layouts?

Ich möchte ein anderes Layout für die 404-Seite "Seite nicht gefunden" haben. Wie kann ich ein anderes Layout für diese Seite festlegen?

26voto

Harsha M V Punkte 52163

Savant aus dem IRC half mir und schlug vor, mit beforeRender(){} im app_controller

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

CakeError ist ein CatchAll für Fehler :D

15voto

expora Punkte 591

In CakePHP 2.2.2 habe ich den ExceptionRenderer in der core.php durch meinen eigenen ersetzt, etwa so:

app/Config/core.php:

Configure::write('Exception', array(
  'handler' => 'ErrorHandler::handleException',
  'renderer' => 'MyExceptionRenderer', // this is ExceptionRenderer by default
  'log' => true
));

app/Lib/Fehler/MyExceptionRenderer.php:

App::uses('ExceptionRenderer', 'Error');

class MyExceptionRenderer extends ExceptionRenderer {

  protected function _outputMessage($template) {
    $this->controller->layout = 'error';
    parent::_outputMessage($template);
  }

}

12voto

Yashrajsinh Jadeja Punkte 1559

Sie müssen lediglich Änderungen am Layout Ihrer Datei error400.ctp unter /app/View/Errors/error400.ctp vornehmen.

Öffnen Sie diese Datei und legen Sie das Layout mit

<?php $this->layout=''; //set your layout here ?>

11voto

ptica Punkte 751

Erstellen Sie besser eine Datei error.php in Ihrem Anwendungsordner

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

so können Sie die if-Prüfung bei JEDER Seitenwiedergabe vermeiden, die die Lösung von Savants mit sich bringt

5voto

Reactgular Punkte 47678

Meine Lösung für CakePHP 2.3

Ändern Sie den ExceptionRenderer in core.php, um Ihren eigenen Renderer zu verwenden.

app/Config/core.php:

Configure::write('Exception', array(
  'handler' => 'ErrorHandler::handleException',
  'renderer' => 'MyExceptionRenderer',
  'log' => true
));

app/Lib/Fehler/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;
    }
 }

Der Vorteil dieses Ansatzes ist, dass er sicherstellt, dass Ausnahmen, die von AppController ausgelöst werden, keine Endlosschleife beim Rendern der Ausnahme verursachen. Erzwingt jedes Mal ein einfaches Rendering der Ausnahmemeldung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X