Skip to content

Commit

Permalink
Allow content to be added before existing content in view block.
Browse files Browse the repository at this point in the history
  • Loading branch information
ADmad committed Oct 1, 2012
1 parent 127b906 commit 47708c5
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 9 deletions.
24 changes: 24 additions & 0 deletions lib/Cake/Test/Case/View/ViewTest.php
Expand Up @@ -1257,6 +1257,19 @@ public function testBlockAppend() {
$this->assertEquals('Block content', $result);
}

/**
* 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.
*
Expand All @@ -1268,6 +1281,17 @@ public function testBlockAppendUndefined() {
$this->assertEquals('Unknown', $result);
}

/**
* 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.
*
Expand Down
20 changes: 17 additions & 3 deletions lib/Cake/View/View.php
Expand Up @@ -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);
}

/**
Expand Down
50 changes: 44 additions & 6 deletions lib/Cake/View/ViewBlock.php
Expand Up @@ -23,6 +23,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.
*
Expand Down Expand Up @@ -73,32 +87,56 @@ 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.'));
}
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.
Expand Down

0 comments on commit 47708c5

Please sign in to comment.