Browse Source

Fix a few outstanding issues with blocks.

- Blocks left open after rendering files should trigger
  an exception.
- Fix strict errors.
- Correct doc blocks.
mark_story 14 years ago
parent
commit
f0f3eb9ba9

+ 16 - 3
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());
 
@@ -1035,6 +1037,17 @@ class ViewTest extends CakeTestCase {
 	}
 
 /**
+ * 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.
  *
  * @return void

+ 3 - 0
lib/Cake/Test/test_app/View/Posts/open_block.ctp

@@ -0,0 +1,3 @@
+<?php
+$this->start('no_close');
+echo 'This block has no close :(';

+ 7 - 4
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) {
 	}
 
 /**

+ 5 - 0
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),

+ 9 - 0
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;
+	}
 }