Proper Way to Fork Layouts

I want to have a different layout for users who are logged in versus the general public. Where is the best place to make this decision? How/where would I tell the app to use layouts/main.php versus, say, layouts/genpublic.php?


Hi Queej,

You can set which layout to use in your controller like this:

class ClientsController extends CController {

    //set default layout

    public $layout='loggedin';


In the ‘/protected/views/layouts/’ folder, you should have a view (layout) by the same name, in this example that would be ‘/protected/views/layouts/loggedin.php’.

The access rules in your controller class would take care of who can access the controller.


A bit more info…

You can also set the layout in the ‘action’ of a controller like this:

public function actionAdmin()


    //set layout



Hope this points you in the right direction.

Yes, thanks. Just what I needed to get moving again!


Good luck and have fun with Yii.

Alternatively you might want to use a BaseController that all your controllers extend from. If you add a beforeAction() to that controller, it will be executed before every action. That way you have to implement the user status check only once:

// Make your controllers extend from this class

class BaseController extends CController


    public function beforeAction($action)


        if (Yii::app()->user->isGuest)


        return true; // If false, the action would not be executed...



Not tested though. ;)

That is a cool idea. I can see where that may come in handy in another place in my app. I am using one data model, but presenting it in several different ways, based on a "type" column. This could help me set up type shared information before invocation of a specific controller.