Browse Source

ViewBuilder::build() builds view instances now.

Mark Story 10 years ago
parent
commit
e575b2226f

+ 1 - 0
src/Controller/Controller.php

@@ -212,6 +212,7 @@ class Controller implements EventListenerInterface, EventDispatcherInterface
      * Holds all passed params.
      *
      * @var mixed
+     * @TODO Deprecate and replace with __get + warning
      */
     public $passedArgs = [];
 

+ 1 - 0
src/View/View.php

@@ -99,6 +99,7 @@ class View implements EventDispatcherInterface
      * Current passed params. Passed to View from the creating Controller for convenience.
      *
      * @var array
+     * @TODO Deprecate and replace with __get + warning
      */
     public $passedArgs = [];
 

+ 23 - 0
src/View/ViewBuilder.php

@@ -15,6 +15,7 @@
 namespace Cake\View;
 
 use Cake\Core\App;
+use Cake\Event\EventManager;
 use Cake\Network\Request;
 use Cake\Network\Response;
 use Cake\View\View;
@@ -305,5 +306,27 @@ class ViewBuilder
      */
     public function build($vars = [], Request $request = null, Response $response = null, EventManager $events = null)
     {
+        if ($this->className === 'View') {
+            $className = App::className($this->className, 'View');
+        } else {
+            $className = App::className($this->className, 'View', 'View');
+        }
+        if (!$className) {
+            throw new Exception\MissingViewException([$this->className]);
+        }
+        $data = [
+            'name' => $this->name,
+            'viewPath' => $this->viewPath,
+            'view' => $this->template,
+            'plugin' => $this->plugin,
+            'theme' => $this->theme,
+            'layout' => $this->layout,
+            'autoLayout' => $this->autoLayout,
+            'layoutPath' => $this->layoutPath,
+            'helpers' => $this->helpers,
+            'viewVars' => $vars,
+        ];
+        $data += $this->options;
+        return new $className($request, $response, $events, $data);
     }
 }

+ 36 - 2
tests/TestCase/View/ViewBuilderTest.php

@@ -108,7 +108,39 @@ class ViewBuilderTest extends TestCase
      */
     public function testBuildComplete()
     {
-        $this->markTestIncomplete('not done');
+        $request = $this->getMock('Cake\Network\Request');
+        $response = $this->getMock('Cake\Network\Response');
+        $events = $this->getMock('Cake\Event\EventManager');
+
+        $builder = new ViewBuilder();
+        $builder->name('Articles')
+            ->className('Ajax')
+            ->template('edit')
+            ->layout('default')
+            ->viewPath('Articles/')
+            ->helpers(['Form', 'Html'])
+            ->layoutPath('Admin/')
+            ->theme('TestTheme')
+            ->plugin('TestPlugin');
+        $view = $builder->build(
+            ['one' => 'value'],
+            $request,
+            $response,
+            $events
+        );
+        $this->assertInstanceOf('Cake\View\AjaxView', $view);
+        $this->assertEquals('edit', $view->view);
+        $this->assertEquals('default', $view->layout);
+        $this->assertEquals('Articles/', $view->viewPath);
+        $this->assertEquals('Admin/', $view->layoutPath);
+        $this->assertEquals('TestPlugin', $view->plugin);
+        $this->assertEquals('TestTheme', $view->theme);
+        $this->assertSame($request, $view->request);
+        $this->assertSame($response, $view->response);
+        $this->assertSame($events, $view->eventManager());
+        $this->assertSame(['one' => 'value'], $view->viewVars);
+        $this->assertInstanceOf('Cake\View\Helper\HtmlHelper', $view->Html);
+        $this->assertInstanceOf('Cake\View\Helper\FormHelper', $view->Form);
     }
 
     /**
@@ -120,6 +152,8 @@ class ViewBuilderTest extends TestCase
      */
     public function testBuildMissingViewClass()
     {
-        $this->markTestIncomplete('not done');
+        $builder = new ViewBuilder();
+        $builder->className('Foo');
+        $builder->build();
     }
 }