Browse Source

Added View::startIfEmpty($name)

Linus Probert 13 years ago
parent
commit
43d766f45c
2 changed files with 46 additions and 1 deletions
  1. 12 1
      lib/Cake/View/View.php
  2. 34 0
      lib/Cake/View/ViewBlock.php

+ 12 - 1
lib/Cake/View/View.php

@@ -599,7 +599,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

+ 34 - 0
lib/Cake/View/ViewBlock.php

@@ -52,6 +52,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'
  *
  * Blocks allow you to create slots or blocks of dynamic content in the layout.
@@ -69,12 +78,37 @@ class ViewBlock {
 	}
 
 /**
+ * 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()
  *
  * @return void
  * @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();