Skip to content
Browse files

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

  • Loading branch information...
1 parent 127b906 commit 47708c52cd3182ef21a67631f85ff2c4d9ed545f @ADmad ADmad committed
Showing 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
View
24 lib/Cake/Test/Case/View/ViewTest.php
@@ -1258,6 +1258,19 @@ public function testBlockAppend() {
}
/**
+ * 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 @@ public function testBlockAppendUndefined() {
}
/**
+ * 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
View
20 lib/Cake/View/View.php
@@ -599,17 +599,31 @@ public function start($name) {
}
/**
- * 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);
}
/**
View
50 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 @@ public function end() {
}
/**
- * 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 @@ public function append($name, $value = null) {
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.
*

0 comments on commit 47708c5

Please sign in to comment.
Something went wrong with that request. Please try again.