How to pass variable to a layout?

Hello, I’m a little new to Yii. I’m wondering what is the best way to pass variables to a layout from an action.


you can pass it when you call the render method like

$message = 'hello world';


and in your view_file view file you can echo out the message

<?php echo $message; ?>

Thanks for your response. You can access the variable in a view like a local variable, but not in a layout right? I was asking about passing variables to the default layout.

in controller

public $param = ‘value’;

in layout

echo $this->param


In YII you cannot pass variables to a layout. This is by design.

Layout is a site-wide entity and therefore must not rely on any

particular controller. So, while your approach is working, it’s

not clean in the way of architecture. I recommend you one of the


  1. Implement method of your BaseController.

  2. Reuse CApplication::getParams.

Hi! I had a similar problem because I had to put a banner in the layout… and the banner had to be different in the home page. I solved the problem in this way:

if (($this->id=='site')&&($this->action->id=='index')){

// Here the HOME banner

} else {

// Here the other banners


It’s obviously more clean and elegant that using a new variable!

Hello, I have another question…

How can I pass variable from static page file to layout. Like we can set $this->pageTitle in static page file, and then that variable is available in layout. My question is how can I pass another variable?


I recently ran into this problem myself - I’ve inadvertently created a dependency between my controllers and layout, which turns out to be highly impractical, because I have certain controllers I reuse between projects. By creating a dependency on certain properties or methods of your controller to complete your layout, you lose that flexibility.

Seeing the other ideas posted here, I’m thinking I should have used the clips feature. Since we’re dealing with a layout, most likely you’re just trying to have multiple areas you can populate with content, like for example a left, right and center column?

If so, in your view, you should be able to capture a piece of content for the left column, for example, by using $this->beginClip(‘left’) and $this->endClip() … the capture snippet of content is now stored in the $clips collection of your Controller, and should be available when your layout renders.

In your layout, you can then do something like: if ($this->clips->contains(‘left’)) echo $this->clips[‘left’];

Because clips are available in any controller, this is a cleaner approach that does not create any dependecy on any particular controller or base-controller.

Conceivably, you could even use $clips->contains() to make you layout flexible - e.g. if there’s no content for the left column, you might add a class to the <body> tag and CSS that makes your center column wider.

Also note, you don’t need a clip for the center column - as the main content from your view (outside any clip area) will of course still be captured and passed as $content to your layout.

Hope this is useful… personally, I have some refactoring to do myself tomorrow morning… :wink:

For the record, I did my refactoring, and this approach works well.

I was hoping to use beginContent() to actually render the main template from my invidual layouts, but that approach is no good, because the content renders in the context of a widget, so at that point it’s too late to use CClientScript to add your styles and scripts - since the widget renders the template, you also don’t have direct access to clips captured by your controller’s view.

So the approach I ended up with is this.

Here’s a “three-column” layout:

<? $this->beginClip('content'); ?>

  <div id="layout-left">

    <? Yii::app()->getCategoryList()->run(); ?>


  <div id="layout-center"><?=$content?></div>

  <div id="layout-right">

    <? Yii::app()->getCalendar()->run(); ?>


<? $this->endClip(); ?>

<? $this->renderPartial('application.views.layouts._page', $this->clips['content']); ?>

The parent layout is "_page", which goes something like this:


$cs = Yii::app()->getClientScript();



$cs->registerScriptFile('/js/common.js', CClientScript::POS_HEAD);


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">

<html xmlns="" xml:lang="en" lang="en">


<title><?= CHtml::encode(Yii::app()->name.' - '.Yii::app()->pageTitle); ?></title>

<meta http-equiv="Content-Type" content="text/html; charset=<?=Yii::app()->charset?>" />


<body class="<?=$this->layout?>">

<div id="layout-page">

  <div id="layout-header">




  <div id="layout-menu"><? Yii::app()->getMenu()->run(); ?></div>


  <?php if(Yii::app()->user->hasFlash('success')):?>

    <div class="flash flash-success">

      <?= Yii::app()->user->getFlash('success'); ?>


  <?php endif; ?>

  <?php if(Yii::app()->user->hasFlash('error')):?>

    <div class="flash flash-error">

      <?= Yii::app()->user->getFlash('error'); ?>


  <?php endif; ?>




  <br style="clear:both"/>

  <div id="layout-footer">






Note how I’m using CController::$layout directly as the class-name for my <body> element.

As you can see, my views have dependencies on a number of widgets, obtained using for example Yii::app()->getMenu() … this is implemented as a behavior, attached to the application - so in my application config:


return array(


  'behaviors' => array(

    'layout' => 'LayoutBehavior',




The layout behavior adds getMenu() and other pre-configured components required to render my pages, like so:



 * This behavior adds layout-related functions to the application


class LayoutBehavior extends CBehavior


  public $pageTitle = 'My Fancy Page';



   * @return Menu configured Menu Widget for the top menu


  public function getMenu()


    static $menu;

    if (!isset($menu)) $menu = Yii::createComponent(array(

      'class' => 'Menu',

      'id' => 'menu',

      'items' => Yii::app()->params['Menu.items'],



    return $menu;






As you can see, I also took my $pageTitle out of the controller, and placed it in the layout behavior - I can access this as Yii::app()->pageTitle … that was the last and only controller-dependency my layout had, so now it’s completely unshackled and can be rendered from any controller!

Hope this is useful! :slight_smile:

Thx mindplay, that was helpful :)

The previous approach:

in controller

public $param = 'value';

in layout

echo $this->param 

should NOT be disregarded I believe.

It does the job when you have exactly the same shared elements, with minor changes here and there.

For example:

The same header, with a different color logo for each page.