Browse Source

Allow content to be added before existing content in view block.

ADmad 13 years ago
parent
commit
47708c52cd
3 changed files with 85 additions and 9 deletions
  1. 24 0
      lib/Cake/Test/Case/View/ViewTest.php
  2. 17 3
      lib/Cake/View/View.php
  3. 44 6
      lib/Cake/View/ViewBlock.php

+ 24 - 0
lib/Cake/Test/Case/View/ViewTest.php

@@ -1258,6 +1258,19 @@ class ViewTest extends CakeTestCase {
 	}
 
 /**
+ * Test prepending to a block with append.
+ *
+ * @return void
+ */
+	public function testBlockPrepend() {
+		$this->View->assign('test', 'Block');
+		$this->View->prepend('test', 'Before ');
+
+		$result = $this->View->fetch('test');
+		$this->assertEquals('Before Block', $result);
+	}
+
+/**
  * You should be able to append to undefined blocks.
  *
  * @return void
@@ -1269,6 +1282,17 @@ class ViewTest extends CakeTestCase {
 	}
 
 /**
+ * You should be able to prepend to undefined blocks.
+ *
+ * @return void
+ */
+	public function testBlockPrependUndefined() {
+		$this->View->prepend('test', 'Unknown');
+		$result = $this->View->fetch('test');
+		$this->assertEquals('Unknown', $result);
+	}
+
+/**
  * setting an array should cause an exception.
  *
  * @expectedException CakeException

+ 17 - 3
lib/Cake/View/View.php

@@ -599,17 +599,31 @@ class View extends Object {
 	}
 
 /**
- * Append to an existing or new block.  Appending to a new
+ * Append to an existing or new block. Appending to a new
  * block will create the block.
  *
  * @param string $name Name of the block
  * @param string $value The content for the block.
  * @return void
  * @throws CakeException when you use non-string values.
- * @see ViewBlock::append()
+ * @see ViewBlock::concat()
  */
 	public function append($name, $value = null) {
-		return $this->Blocks->append($name, $value);
+		return $this->Blocks->concat($name, $value);
+	}
+
+/**
+ * Prepend to an existing or new block. Prepending to a new
+ * block will create the block.
+ *
+ * @param string $name Name of the block
+ * @param string $value The content for the block.
+ * @return void
+ * @throws CakeException when you use non-string values.
+ * @see ViewBlock::concat()
+ */
+	public function prepend($name, $value = null) {
+		return $this->Blocks->concat($name, $value, ViewBlock::PREPEND);
 	}
 
 /**

+ 44 - 6
lib/Cake/View/ViewBlock.php

@@ -24,6 +24,20 @@
 class ViewBlock {
 
 /**
+ * Append content
+ *
+ * @constant APPEND
+ */
+	const APPEND = 'append';
+
+/**
+ * Prepend content
+ *
+ * @constant PREPEND
+ */
+	const PREPEND = 'prepend';
+
+/**
  * Block content.  An array of blocks indexed by name.
  *
  * @var array
@@ -73,19 +87,21 @@ class ViewBlock {
 	}
 
 /**
- * Append to an existing or new block.  Appending to a new
- * block will create the block.
+ * Concat content to an existing or new block.
+ * Concating to a new block will create the block.
  *
- * Calling append() without a value will create a new capturing
+ * Calling concat() without a value will create a new capturing
  * block that needs to be finished with View::end(). The content
  * of the new capturing context will be added to the existing block context.
  *
  * @param string $name Name of the block
- * @param string $value The content for the block.
+ * @param string $value The content for the block
+ * @param string $mode If ViewBlock::APPEND content will be appended to existing content.
+ *   If ViewBlock::PREPEND it will be prepended.
  * @return void
  * @throws CakeException when you use non-string values.
  */
-	public function append($name, $value = null) {
+	public function concat($name, $value = null, $mode = ViewBlock::APPEND) {
 		if (isset($value)) {
 			if (!is_string($value)) {
 				throw new CakeException(__d('cake_dev', '$value must be a string.'));
@@ -93,13 +109,35 @@ class ViewBlock {
 			if (!isset($this->_blocks[$name])) {
 				$this->_blocks[$name] = '';
 			}
-			$this->_blocks[$name] .= $value;
+			if ($mode === ViewBlock::PREPEND) {
+				$this->_blocks[$name] = $value . $this->_blocks[$name];
+			} else {
+				$this->_blocks[$name] .= $value;
+			}
 		} else {
 			$this->start($name);
 		}
 	}
 
 /**
+ * Append to an existing or new block.  Appending to a new
+ * block will create the block.
+ *
+ * Calling append() without a value will create a new capturing
+ * block that needs to be finished with View::end(). The content
+ * of the new capturing context will be added to the existing block context.
+ *
+ * @param string $name Name of the block
+ * @param string $value The content for the block.
+ * @return void
+ * @throws CakeException when you use non-string values.
+ * @deprecated As of 2.3 use ViewBlock::concat() instead.
+ */
+	public function append($name, $value = null) {
+		$this->concat($name, $value);
+	}
+
+/**
  * Set the content for a block.  This will overwrite any
  * existing content.
  *