Browse Source

It is now possible to set the template a cell uses using the ViewBuilder

Yves P 10 years ago
parent
commit
77df8b46e3

+ 1 - 1
src/View/Cell.php

@@ -194,7 +194,7 @@ abstract class Cell
                 $template = Inflector::underscore($template);
             }
             if ($template === null) {
-                $template = $this->template;
+                $template = $this->viewBuilder()->template() ?: $this->template;
             }
 
             $builder = $this->viewBuilder();

+ 45 - 1
tests/TestCase/View/CellTest.php

@@ -133,7 +133,7 @@ class CellTest extends TestCase
     }
 
     /**
-     * Tests that cell action setting the template renders the correct template
+     * Tests that cell action setting the template using the property renders the correct template
      *
      * @return void
      */
@@ -143,11 +143,31 @@ class CellTest extends TestCase
 
         $this->assertContains('This is the alternate template', "{$appCell}");
         $this->assertEquals('alternate_teaser_list', $appCell->template);
+        $this->assertEquals('alternate_teaser_list', $appCell->viewBuilder()->template());
 
         $appCell = $this->View->cell('Articles::customTemplate');
 
         $this->assertContains('This is the alternate template', $appCell->render());
         $this->assertEquals('alternate_teaser_list', $appCell->template);
+        $this->assertEquals('alternate_teaser_list', $appCell->viewBuilder()->template());
+    }
+
+    /**
+     * Tests that cell action setting the template using the ViewBuilder renders the correct template
+     *
+     * @return void
+     */
+    public function testSettingCellTemplateFromActionViewBuilder()
+    {
+        $appCell = $this->View->cell('Articles::customTemplateViewBuilder');
+
+        $this->assertContains('This is the alternate template', "{$appCell}");
+        $this->assertEquals('alternate_teaser_list', $appCell->viewBuilder()->template());
+
+        $appCell = $this->View->cell('Articles::customTemplateViewBuilder');
+
+        $this->assertContains('This is the alternate template', $appCell->render());
+        $this->assertEquals('alternate_teaser_list', $appCell->viewBuilder()->template());
     }
 
     /**
@@ -403,4 +423,28 @@ class CellTest extends TestCase
 
         Cache::drop('default');
     }
+
+    /**
+     * Test cached render.
+     *
+     * @return void
+     */
+    public function testCachedRenderSimpleCustomTemplateViewBuilder()
+    {
+        $mock = $this->getMock('Cake\Cache\CacheEngine');
+        $mock->method('init')
+            ->will($this->returnValue(true));
+        $mock->method('read')
+            ->will($this->returnValue(false));
+        $mock->expects($this->once())
+            ->method('write')
+            ->with('cell_test_app_view_cell_articles_cell_customTemplateViewBuilder', "<h1>This is the alternate template</h1>\n");
+        Cache::config('default', $mock);
+
+        $cell = $this->View->cell('Articles::customTemplateViewBuilder', [], ['cache' => true]);
+        $result = $cell->render();
+        $this->assertContains('This is the alternate template', $result);
+
+        Cache::drop('default');
+    }
 }

+ 14 - 7
tests/test_app/TestApp/View/Cell/ArticlesCell.php

@@ -52,19 +52,26 @@ class ArticlesCell extends \Cake\View\Cell
     }
 
     /**
-     * Renders articles in teaser view mode.
+     * Renders a view using a different template than the action name
+     * The template is set using the ``Cell::$template`` property
      *
      * @return void
      */
     public function customTemplate()
     {
         $this->template = 'alternate_teaser_list';
-        $this->set('articles', [
-            ['title' => 'Lorem ipsum', 'body' => 'dolorem sit amet'],
-            ['title' => 'Usectetur adipiscing eli', 'body' => 'tortor, in tincidunt sem dictum vel'],
-            ['title' => 'Topis semper blandit eu non', 'body' => 'alvinar diam convallis non. Nullam pu'],
-            ['title' => 'Suspendisse gravida neque', 'body' => 'pellentesque sed scelerisque libero'],
-        ]);
+    }
+
+    /**
+     * Renders a view using a different template than the action name
+     * The template is set using the ViewBuilder bound to the Cell
+     *
+     * @return void
+     */
+    public function customTemplateViewBuilder()
+    {
+        $this->template = 'derp';
+        $this->viewBuilder()->template('alternate_teaser_list');
     }
 
     /**