diff --git a/lib/Cake/Controller/CakeErrorController.php b/lib/Cake/Controller/CakeErrorController.php index fea081b616d..d38118a2198 100644 --- a/lib/Cake/Controller/CakeErrorController.php +++ b/lib/Cake/Controller/CakeErrorController.php @@ -42,9 +42,17 @@ class CakeErrorController extends AppController { */ public function __construct($request = null, $response = null) { parent::__construct($request, $response); + if (count(Router::extensions())) { + $this->components[] = 'RequestHandler'; + } $this->constructClasses(); $this->Components->trigger('initialize', array(&$this)); + $this->_set(array('cacheAction' => false, 'viewPath' => 'Errors')); + + if (isset($this->RequestHandler)) { + $this->RequestHandler->startup($this); + } } /** diff --git a/lib/Cake/Controller/Component/RequestHandlerComponent.php b/lib/Cake/Controller/Component/RequestHandlerComponent.php index dbdaa8dd614..e4408098b7b 100644 --- a/lib/Cake/Controller/Component/RequestHandlerComponent.php +++ b/lib/Cake/Controller/Component/RequestHandlerComponent.php @@ -556,7 +556,12 @@ public function renderAs($controller, $type, $options = array()) { } $controller->ext = '.ctp'; - if (empty($this->_renderType)) { + $viewClass = ucfirst($type); + App::uses($viewClass . 'View', 'View'); + + if (class_exists($viewClass . 'View')) { + $controller->viewClass = $viewClass; + } elseif (empty($this->_renderType)) { $controller->viewPath .= DS . $type; } else { $remove = preg_replace("/([\/\\\\]{$this->_renderType})$/", DS . $type, $controller->viewPath); diff --git a/lib/Cake/Error/ExceptionRenderer.php b/lib/Cake/Error/ExceptionRenderer.php index a2de723dd39..a9d2f8c9fab 100644 --- a/lib/Cake/Error/ExceptionRenderer.php +++ b/lib/Cake/Error/ExceptionRenderer.php @@ -181,6 +181,7 @@ protected function _cakeError(CakeException $error) { 'url' => h($url), 'name' => $error->getMessage(), 'error' => $error, + 'serialize' => array('code', 'error', 'name', 'url') )); try { $this->controller->set($error->getAttributes()); @@ -208,7 +209,8 @@ public function error400($error) { $this->controller->set(array( 'name' => $message, 'url' => h($url), - 'error' => $error, + 'error' => $error, + 'serialize' => array('error', 'name', 'url') )); $this->_outputMessage('error400'); } @@ -231,6 +233,7 @@ public function error500($error) { 'name' => $message, 'message' => h($url), 'error' => $error, + 'serialize' => array('error', 'name', 'url') )); $this->_outputMessage('error500'); } @@ -250,6 +253,7 @@ public function pdoError(PDOException $error) { 'url' => h($url), 'name' => $error->getMessage(), 'error' => $error, + 'serialize' => array('code', 'error', 'name', 'url') )); try { $this->_outputMessage($this->template); diff --git a/lib/Cake/View/JsonView.php b/lib/Cake/View/JsonView.php new file mode 100644 index 00000000000..a058d03a1c3 --- /dev/null +++ b/lib/Cake/View/JsonView.php @@ -0,0 +1,27 @@ +viewVars['serialize'])) { + $vars = array_intersect_key( + $this->viewVars, + array_flip($this->viewVars['serialize']) + ); + return json_encode($vars); + } + return parent::render($view, $layout); + } +}