Sending content to the layout using Cake 2.x
This post is based on Robert Conner’s code for CakePHP 1.x., and I made some changes to get it to work on CakePHP 2.x and add some explanations on how to use it. The original post is on https://bakery.cakephp.org/articles/rtconner/2007/08/28 /anything_for_layout-making-html-from-the-view-available-to-the-layout Maybe many people have faced the problem for sending some content to the layout on CakePHP. By saying content I mean not only a simple string but a whole a piece of HTML code. To solve this, we can create a Helper on CakePHP 2.x, according to the following steps:
1. Create the Helper
On the Views/Helpers folder, you need to create the .php file for the helper. In this case we will call it LayoutHelper.php
class LayoutHelper extends AppHelper {
var $__blockName = null;
function blockStart($name) {
if (empty($name)) trigger_error('LayoutHelper::blockStart - name is a required parameter');
if (!is_null($this->__blockName))
trigger_error('LayoutHelper::blockStart - Blocks cannot overlap');
$this->__blockName = $name; ob_start();
return null;
}
function blockEnd(&$view) {
$buffer = @ob_get_contents();
@ob_end_clean();
$out = $buffer;
$view->viewVars[$this->__blockName . '_for_layout'] = $out; $this->__blockName = null;
}
function output($var) {
if (isset($var) && $var != null)
echo $var;
}
}
2. Setting up the content
For setting up the content that we want to send to the layout, we use the Helper
$layout = $this->Helpers->load('Layout');
$layout->blockStart('custom_content');
right after this, we specify the content that will be sent to the layout
<div>
Custom content
</div>
and we close the block
$layout->blockEnd($this);
3. Show the content
For showing the content on the layout, we add the following
$layout = $this->Helpers->load('Layout');
$layout->output($custom_content_for_layout);
As we can see, this is really simple and also very useful when trying to customize the content on the layout according to the view we are loading