Switch Yii layout based on user role

You can assign different layouts to different users using following filter class

1. Add LayoutFilter.php to your protected/components/ folder

class LayoutFilter extends CFilter
{
 
    protected function preFilter($filterChain)
    {
        // logic being applied before the action is executed
        $roles = Yii::app()->user->getState('roles');
        if (!is_array($roles))
            $roles = array();
 
        if (in_array(User::ROLE_ADMIN, $roles))
        {
            $filterChain->controller->layout = 'admin/column2';
        } else
        {
            $filterChain->controller->layout = '//layouts/column2';
        }
 
        return parent::preFilter($filterChain);
    }
 
    protected function postFilter($filterChain)
    {
    // logic being applied after the action is executed
        return parent::postFilter($filterChain);
    }
 
}

2. Update protected/components/Controller.php and add following filters

public function filters()
{
    return array(
        'rights',
        array('application.components.LayoutFilter'),
    );
}

3. Update all controllers and add following filters

public function filters()
{
    return parent::filters() + array(
        'postOnly + delete', // we only allow deletion via POST request
    );
}