Permalink
Browse files

Adding tests and functionality for nested blocks.

  • Loading branch information...
1 parent f0f3eb9 commit 46bb6c8ad63a5128ee47670d8c95f2c51eb9778d @markstory markstory committed Dec 13, 2011
Showing with 29 additions and 10 deletions.
  1. +18 −0 lib/Cake/Test/Case/View/ViewTest.php
  2. +11 −10 lib/Cake/View/ViewBlock.php
@@ -1037,6 +1037,24 @@ public function testBlocks() {
}
/**
+ * Test that blocks can be nested.
+ *
+ * @return void
+ */
+ public function testNestedBlocks() {
+ $this->View->start('first');
+ echo 'In first ';
+ $this->View->start('second');
+ echo 'In second';
+ $this->View->end();
+ echo 'In first';
+ $this->View->end();
+
+ $this->assertEquals('In first In first', $this->View->fetch('first'));
+ $this->assertEquals('In second', $this->View->fetch('second'));
+ }
+
+/**
* Test that an exception gets thrown when you leave a block open at the end
* of a view.
*
@@ -31,11 +31,11 @@ class ViewBlock {
protected $_blocks = array();
/**
- * The active block being captured.
+ * The active blocks being captured.
*
- * @var string
+ * @var array
*/
- protected $_active = null;
+ protected $_active = array();
/**
* Start capturing output for a 'block'
@@ -50,7 +50,7 @@ class ViewBlock {
* @return void
*/
public function start($name) {
- $this->_active = $name;
+ $this->_active[] = $name;
ob_start();
}
@@ -62,13 +62,14 @@ public function start($name) {
*/
public function end() {
if (!empty($this->_active)) {
+ $active = end($this->_active);
$content = ob_get_clean();
- if (!isset($this->_blocks[$this->_active])) {
- $this->_blocks[$this->_active] = '';
+ if (!isset($this->_blocks[$active])) {
+ $this->_blocks[$active] = '';
}
- $this->_blocks[$this->_active] .= $content;
+ $this->_blocks[$active] .= $content;
+ array_pop($this->_active);
}
- $this->_active = null;
}
/**
@@ -139,9 +140,9 @@ public function keys() {
/**
* Get the name of the currently open block.
*
- * @return mixed Either null or the name of the open block.
+ * @return mixed Either null or the name of the last open block.
*/
public function active() {
- return $this->_active;
+ return end($this->_active);
}
}

0 comments on commit 46bb6c8

Please sign in to comment.