Switching themes dynamically

View themes are useful for overriding extension views and making special view versions. Official Yii guide describes static usage and configuration of views well so in this recipe we'll learn how to switch themes dynamically.

Preparations

We'll start with the basic project template. Make sure it is installed and works well.

The goal

For simplicity, let's switch theme based on a GET parameter i.e. themed=1.

How to do it

Theme could be switched at any moment before view template is rendered. For clarity sake let's do it right in index action of controllers/SiteController.php:

public function actionIndex()
{
    if (Yii::$app->request->get('themed')) {
        Yii::$app->getView()->theme = new Theme([
            'basePath' => '@app/themes/basic',
            'baseUrl' => '@web/themes/basic',
            'pathMap' => [
                '@app/views' => '@app/themes/basic',
            ],
        ]);
    }
    return $this->render('index');
}

If there's a themed GET parameter we're configuring current a theme which takes view templates from themes/basic directory. Let's add customized template itself in themes/basic/site/index.php:

Hello, I'm a custom theme!

That's it. Now try accessing homepage with and without themed GET parameter.