diff --git a/lib/Cake/Test/Case/View/ViewTest.php b/lib/Cake/Test/Case/View/ViewTest.php index 17b10ce8c..e9f1fea1e 100644 --- a/lib/Cake/Test/Case/View/ViewTest.php +++ b/lib/Cake/Test/Case/View/ViewTest.php @@ -1259,6 +1259,42 @@ class ViewTest extends CakeTestCase { $this->assertEquals('Block content', $result); } +/** + * Test block with startIfEmpty + * + * @return void + */ + public function testBlockCaptureStartIfEmpty() { + $this->View->startIfEmpty('test'); + echo "Block content 1"; + $this->View->end(); + + $this->View->startIfEmpty('test'); + echo "Block content 2"; + $this->View->end(); + + $result = $this->View->fetch('test'); + $this->assertEquals('Block content 1', $result); + } + +/** + * Test block with startIfEmpty + * + * @return void + */ + public function testBlockCaptureStartStartIfEmpty() { + $this->View->start('test'); + echo "Block content 1"; + $this->View->end(); + + $this->View->startIfEmpty('test'); + echo "Block content 2"; + $this->View->end(); + + $result = $this->View->fetch('test'); + $this->assertEquals('Block content 1', $result); + } + /** * Test appending to a block with capturing output. * diff --git a/lib/Cake/View/View.php b/lib/Cake/View/View.php index ef959fc2a..e8bdb3064 100644 --- a/lib/Cake/View/View.php +++ b/lib/Cake/View/View.php @@ -625,7 +625,18 @@ class View extends Object { } /** - * Append to an existing or new block. Appending to a new + * Start capturing output for a 'block' if it has no content + * + * @param string $name The name of the block to capture for. + * @return void + * @see ViewBlock::startIfEmpty() + */ + public function startIfEmpty($name) { + return $this->Blocks->startIfEmpty($name); + } + +/** + * Append to an existing or new block. Appending to a new * block will create the block. * * @param string $name Name of the block diff --git a/lib/Cake/View/ViewBlock.php b/lib/Cake/View/ViewBlock.php index 34182d137..cf04e6968 100644 --- a/lib/Cake/View/ViewBlock.php +++ b/lib/Cake/View/ViewBlock.php @@ -51,6 +51,15 @@ class ViewBlock { */ protected $_active = array(); +/** + * Should the currently captured content be discarded on ViewBlock::end() + * + * @var boolean + * @see ViewBlock::end() + * @see ViewBlock::startIfEmpty() + */ + protected $_discardActiveBufferOnEnd = false; + /** * Start capturing output for a 'block' * @@ -68,6 +77,26 @@ class ViewBlock { ob_start(); } +/** + * Start capturing output for a 'block' if it is empty + * + * Blocks allow you to create slots or blocks of dynamic content in the layout. + * view files can implement some or all of a layout's slots. + * + * You can end capturing blocks using View::end(). Blocks can be output + * using View::get(); + * + * @param string $name The name of the block to capture for. + * @return void + */ + public function startIfEmpty($name) { + if (empty($this->_blocks[$name])) { + return $this->start($name); + } + $this->_discardActiveBufferOnEnd = true; + ob_start(); + } + /** * End a capturing block. The compliment to ViewBlock::start() * @@ -75,6 +104,11 @@ class ViewBlock { * @see ViewBlock::start() */ public function end() { + if ($this->_discardActiveBufferOnEnd) { + $this->_discardActiveBufferOnEnd = false; + ob_end_clean(); + return; + } if (!empty($this->_active)) { $active = end($this->_active); $content = ob_get_clean();