diff --git a/lib/Cake/Test/Case/View/ViewTest.php b/lib/Cake/Test/Case/View/ViewTest.php index 0d45add8f..eab49e6ca 100644 --- a/lib/Cake/Test/Case/View/ViewTest.php +++ b/lib/Cake/Test/Case/View/ViewTest.php @@ -580,7 +580,7 @@ class ViewTest extends CakeTestCase { */ public function testHelperCallbackTriggering() { $View = new View($this->PostsController); - $View->helpers = array('Html', 'Session'); + $View->helpers = array(); $View->Helpers = $this->getMock('HelperCollection', array('trigger'), array($View)); $View->Helpers->expects($this->at(0))->method('trigger') @@ -588,7 +588,8 @@ class ViewTest extends CakeTestCase { $View->Helpers->expects($this->at(1))->method('trigger') ->with('beforeRenderFile', $this->anything()); $View->Helpers->expects($this->at(2))->method('trigger') - ->with('afterRenderFile', $this->anything()); + ->with('afterRenderFile', $this->anything()) + ->will($this->returnValue('')); $View->Helpers->expects($this->at(3))->method('trigger') ->with('afterRender', $this->anything()); @@ -597,7 +598,8 @@ class ViewTest extends CakeTestCase { $View->Helpers->expects($this->at(5))->method('trigger') ->with('beforeRenderFile', $this->anything()); $View->Helpers->expects($this->at(6))->method('trigger') - ->with('afterRenderFile', $this->anything()); + ->with('afterRenderFile', $this->anything()) + ->will($this->returnValue('')) ; $View->Helpers->expects($this->at(7))->method('trigger') ->with('afterLayout', $this->anything()); @@ -1034,6 +1036,17 @@ class ViewTest extends CakeTestCase { $this->assertEquals(array('test', 'test1'), $this->View->blocks()); } +/** + * Test that an exception gets thrown when you leave a block open at the end + * of a view. + * + * @expectedException CakeException + * @return void + */ + public function testExceptionOnOpenBlock() { + $this->View->render('open_block'); + } + /** * Test nested extended views. * diff --git a/lib/Cake/Test/test_app/View/Posts/open_block.ctp b/lib/Cake/Test/test_app/View/Posts/open_block.ctp new file mode 100644 index 000000000..edd595f64 --- /dev/null +++ b/lib/Cake/Test/test_app/View/Posts/open_block.ctp @@ -0,0 +1,3 @@ +start('no_close'); +echo 'This block has no close :('; diff --git a/lib/Cake/View/Helper.php b/lib/Cake/View/Helper.php index e51f0917b..074a80097 100644 --- a/lib/Cake/View/Helper.php +++ b/lib/Cake/View/Helper.php @@ -754,7 +754,8 @@ class Helper extends Object { } /** - * Before render file callback. Called before any view fragment is rendered. + * Before render file callback. + * Called before any view fragment is rendered. * * Overridden in subclasses. * @@ -765,14 +766,16 @@ class Helper extends Object { } /** - * After render file callback. Called before any view fragment is rendered. + * After render file callback. + * Called after any view fragment is rendered. * * Overridden in subclasses. * - * @param string $viewFile The file about to be rendered. + * @param string $viewFile The file just be rendered. + * @param string $content The content that was rendered. * @return void */ - public function afterRenderFile($viewfile) { + public function afterRenderFile($viewfile, $content) { } /** diff --git a/lib/Cake/View/View.php b/lib/Cake/View/View.php index 3f15e742f..dd05dc997 100644 --- a/lib/Cake/View/View.php +++ b/lib/Cake/View/View.php @@ -43,6 +43,7 @@ App::uses('ViewBlock', 'View'); * @property SessionHelper $Session * @property TextHelper $Text * @property TimeHelper $Time + * @property ViewBlock $Blocks */ class View extends Object { @@ -755,6 +756,7 @@ class View extends Object { * @param string $viewFile Filename of the view * @param array $data Data to include in rendered view. If empty the current View::$viewVars will be used. * @return string Rendered output + * @throws CakeException when a block is left open. */ protected function _render($viewFile, $data = array()) { if (empty($data)) { @@ -764,6 +766,9 @@ class View extends Object { $this->Helpers->trigger('beforeRenderFile', array($viewFile)); $content = $this->_evaluate($viewFile, $data); + if ($this->Blocks->active()) { + throw new CakeException(__d('cake_dev', 'The "%s" block was left open.', $this->Blocks->active())); + } $content = $this->Helpers->trigger( 'afterRenderFile', array($viewFile, $content), diff --git a/lib/Cake/View/ViewBlock.php b/lib/Cake/View/ViewBlock.php index a46b35d3b..740d3fdb2 100644 --- a/lib/Cake/View/ViewBlock.php +++ b/lib/Cake/View/ViewBlock.php @@ -135,4 +135,13 @@ class ViewBlock { public function keys() { return array_keys($this->_blocks); } + +/** + * Get the name of the currently open block. + * + * @return mixed Either null or the name of the open block. + */ + public function active() { + return $this->_active; + } }