Skip to content

Commit

Permalink
It should be possible to set the template from the action of the cell
Browse files Browse the repository at this point in the history
  • Loading branch information
HavokInspiration committed Feb 4, 2016
1 parent 7cb7c1a commit 225e8dd
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 11 deletions.
22 changes: 11 additions & 11 deletions src/View/Cell.php
Expand Up @@ -176,6 +176,17 @@ public function render($template = null)
}

$render = function () use ($template) {
try {
$reflect = new ReflectionMethod($this, $this->action);
$reflect->invokeArgs($this, $this->args);
} catch (ReflectionException $e) {
throw new BadMethodCallException(sprintf(
'Class %s does not have a "%s" method.',
get_class($this),
$this->action
));
}

if ($template !== null &&
strpos($template, '/') === false &&
strpos($template, '.') === false
Expand All @@ -194,17 +205,6 @@ public function render($template = null)
$name = substr($className, 0, -4);
$builder->templatePath('Cell' . DS . $name);

try {
$reflect = new ReflectionMethod($this, $this->action);
$reflect->invokeArgs($this, $this->args);
} catch (ReflectionException $e) {
throw new BadMethodCallException(sprintf(
'Class %s does not have a "%s" method.',
get_class($this),
$this->action
));
}

$this->View = $this->createView();
try {
return $this->View->render($template);
Expand Down
42 changes: 42 additions & 0 deletions tests/TestCase/View/CellTest.php
Expand Up @@ -132,6 +132,24 @@ public function testDefaultCellAction()
$this->assertEquals('display', $pluginCell->template);
}

/**
* Tests that cell action setting the template renders the correct template
*
* @return void
*/
public function testSettingCellTemplateFromAction()
{
$appCell = $this->View->cell('Articles::customTemplate');

$this->assertContains('This is the alternate template', "{$appCell}");
$this->assertEquals('alternate_teaser_list', $appCell->template);

$appCell = $this->View->cell('Articles::customTemplate');

$this->assertContains('This is the alternate template', $appCell->render());
$this->assertEquals('alternate_teaser_list', $appCell->template);
}

/**
* Tests manual render() invocation.
*
Expand Down Expand Up @@ -361,4 +379,28 @@ public function testCachedRenderArrayConfig()
$this->assertEquals("dummy\n", $result);
Cache::drop('cell');
}

/**
* Test cached render.
*
* @return void
*/
public function testCachedRenderSimpleCustomTemplate()
{
$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_customTemplate', "<h1>This is the alternate template</h1>\n");
Cache::config('default', $mock);

$cell = $this->View->cell('Articles::customTemplate', [], ['cache' => true]);
$result = $cell->render();
$this->assertContains('This is the alternate template', $result);

Cache::drop('default');
}
}
@@ -0,0 +1 @@
<h1>This is the alternate template</h1>
16 changes: 16 additions & 0 deletions tests/test_app/TestApp/View/Cell/ArticlesCell.php
Expand Up @@ -51,6 +51,22 @@ public function teaserList()
]);
}

/**
* Renders articles in teaser view mode.
*
* @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'],
]);
}

/**
* Simple echo.
*
Expand Down

0 comments on commit 225e8dd

Please sign in to comment.