Browse Source

Starting content type specific error pages.

- Adding RequestHandler to the error controller.  This allows reuse
  of all of Cake's internals.
- Adding a simple JsonView class to do serialized JSON views.
- Adding serialize hooks, and wiring things together.
mark_story 14 years ago
parent
commit
cfbc43671e

+ 8 - 0
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);
+		}
 	}
 
 /**

+ 6 - 1
lib/Cake/Controller/Component/RequestHandlerComponent.php

@@ -556,7 +556,12 @@ class RequestHandlerComponent extends Component {
 		}
 		$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);

+ 5 - 1
lib/Cake/Error/ExceptionRenderer.php

@@ -181,6 +181,7 @@ class ExceptionRenderer {
 			'url' => h($url),
 			'name' => $error->getMessage(),
 			'error' => $error,
+			'serialize' => array('code', 'error', 'name', 'url')
 		));
 		try {
 			$this->controller->set($error->getAttributes());
@@ -208,7 +209,8 @@ class ExceptionRenderer {
 		$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 @@ class ExceptionRenderer {
 			'name' => $message,
 			'message' => h($url),
 			'error' => $error,
+			'serialize' => array('error', 'name', 'url')
 		));
 		$this->_outputMessage('error500');
 	}
@@ -250,6 +253,7 @@ class ExceptionRenderer {
 			'url' => h($url),
 			'name' => $error->getMessage(),
 			'error' => $error,
+			'serialize' => array('code', 'error', 'name', 'url')
 		));
 		try {
 			$this->_outputMessage($this->template);

+ 27 - 0
lib/Cake/View/JsonView.php

@@ -0,0 +1,27 @@
+<?php
+
+class JsonView extends View {
+
+/**
+ * Render a JSON view.
+ *
+ * Uses the special 'serialize' parameter to convert a set of
+ * view variables into a JSON response.  Makes generating simple 
+ * JSON responses very easy.  You can omit the 'serialize' parameter, 
+ * and use a normal view + layout as well.
+ *
+ * @param string $view The view being rendered.
+ * @param string $layout The layout being rendered.
+ * @return The rendered view.
+ */
+	public function render($view = null, $layout = null) {
+		if (isset($this->viewVars['serialize'])) {
+			$vars = array_intersect_key(
+				$this->viewVars,
+				array_flip($this->viewVars['serialize'])
+			);
+			return json_encode($vars);
+		}
+		return parent::render($view, $layout);
+	}
+}