Browse Source

Add support for "_serialized" = true for XmlView.

ADmad 11 years ago
parent
commit
62f75376ea
2 changed files with 52 additions and 49 deletions
  1. 21 49
      src/View/XmlView.php
  2. 31 0
      tests/TestCase/View/XmlViewTest.php

+ 21 - 49
src/View/XmlView.php

@@ -20,6 +20,7 @@ use Cake\Network\Request;
 use Cake\Network\Response;
 use Cake\Utility\Hash;
 use Cake\Utility\Xml;
+use Cake\View\SerializeView;
 
 /**
  * A view class that is used for creating XML responses.
@@ -55,7 +56,7 @@ use Cake\Utility\Xml;
  * If you don't use the `_serialize` key, you will need a view. You can use extended
  * views to provide layout like functionality.
  */
-class XmlView extends View
+class XmlView extends SerializedView
 {
 
     /**
@@ -73,60 +74,18 @@ class XmlView extends View
     public $subDir = 'xml';
 
     /**
-     * Constructor
+     * Response type.
      *
-     * @param \Cake\Network\Request|null $request Request instance
-     * @param \Cake\Network\Response|null $response Response instance
-     * @param \Cake\Event\EventManager|null $eventManager Event Manager
-     * @param array $viewOptions View options.
-     */
-    public function __construct(
-        Request $request = null,
-        Response $response = null,
-        EventManager $eventManager = null,
-        array $viewOptions = []
-    ) {
-        parent::__construct($request, $response, $eventManager, $viewOptions);
-
-        if ($response && $response instanceof Response) {
-            $response->type('xml');
-        }
-    }
-
-    /**
-     * Skip loading helpers if this is a _serialize based view.
-     *
-     * @return void
+     * @var string
      */
-    public function loadHelpers()
-    {
-        if (isset($this->viewVars['_serialize'])) {
-            return;
-        }
-        parent::loadHelpers();
-    }
+    public $_responseType = 'xml';
 
     /**
-     * Render a XML view.
-     *
-     * Uses the special '_serialize' parameter to convert a set of
-     * view variables into a XML response. Makes generating simple
-     * XML responses very easy. You can omit the '_serialize' parameter,
-     * and use a normal view + layout as well.
+     * List of special view vars.
      *
-     * @param string|null $view The view being rendered.
-     * @param string|null $layout The layout being rendered.
-     * @return string The rendered view.
+     * @var array
      */
-    public function render($view = null, $layout = null)
-    {
-        if (isset($this->viewVars['_serialize'])) {
-            return $this->_serialize($this->viewVars['_serialize']);
-        }
-        if ($view !== false && $this->_getViewFileName($view)) {
-            return parent::render($view, false);
-        }
-    }
+    protected $_specialVars = ['_serialize', '_rootNode', '_xmlOptions'];
 
     /**
      * Serialize view vars.
@@ -142,6 +101,19 @@ class XmlView extends View
     {
         $rootNode = isset($this->viewVars['_rootNode']) ? $this->viewVars['_rootNode'] : 'response';
 
+        if ($serialize === true) {
+            $serialize = array_diff(
+                array_keys($this->viewVars),
+                $this->_specialVars
+            );
+
+            if (empty($serialize)) {
+                $serialize = null;
+            } elseif (count($serialize) === 1) {
+                $serialize = current($serialize);
+            }
+        }
+
         if (is_array($serialize)) {
             $data = [$rootNode => []];
             foreach ($serialize as $alias => $key) {

+ 31 - 0
tests/TestCase/View/XmlViewTest.php

@@ -244,6 +244,37 @@ class XmlViewTest extends TestCase
     }
 
     /**
+     * test rendering with _serialize true
+     *
+     * @return void
+     */
+    public function testRenderWithSerializeTrue()
+    {
+        $Request = new Request();
+        $Response = new Response();
+        $Controller = new Controller($Request, $Response);
+        $data = ['users' => ['user' => ['user1', 'user2']]];
+        $Controller->set(['users' => $data, '_serialize' => true]);
+        $Controller->viewClass = 'Xml';
+        $View = $Controller->createView();
+        $output = $View->render();
+
+        $this->assertSame(Xml::build($data)->asXML(), $output);
+        $this->assertSame('application/xml', $Response->type());
+
+        $data = ['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']];
+        $Controller->viewVars = [];
+        $Controller->set($data);
+        $Controller->set('_serialize', true);
+        $View = $Controller->createView();
+        $output = $View->render();
+        $expected = [
+            'response' => $data
+        ];
+        $this->assertSame(Xml::build($expected)->asXML(), $output);
+    }
+
+    /**
      * testRenderWithView method
      *
      * @return void