Merge pull request #930 from LiquidityC/2.3_3315_viewblock_startifempty

Added: View::startIfEmpty($name)
This commit is contained in:
José Lorenzo Rodríguez 2012-12-01 14:06:55 -08:00
commit 99e84b8a08
3 changed files with 82 additions and 1 deletions

View file

@ -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.
*

View file

@ -624,6 +624,17 @@ class View extends Object {
return $this->Blocks->start($name);
}
/**
* 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.

View file

@ -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();