Yii2动态主题

Yii2动态主题,yii2,Yii2,如何动态设置主题?我在用户配置文件中有一个允许选择主题的字段。我已经在@webroot中创建了一个主题文件夹和不同的主题 当用户查看其配置文件时,我需要设置他选择的主题或设置为默认主题。尝试更改视图组件的属性theme $主题详细信息 这篇文章也可能有所帮助 如果您想动态更改主题,可以这样做 切换主题的功能: public function actionThemeswitch($theme) { $options = ['name'=>'theme','value'=>$th

如何动态设置主题?我在用户配置文件中有一个允许选择主题的字段。我已经在@webroot中创建了一个主题文件夹和不同的主题


当用户查看其配置文件时,我需要设置他选择的主题或设置为默认主题。

尝试更改视图组件的属性
theme

$主题详细信息

这篇文章也可能有所帮助


如果您想动态更改主题,可以这样做

切换主题的功能:

public function actionThemeswitch($theme)
{
    $options = ['name'=>'theme','value'=>$theme,'expire'=>time()+86400*365];
    $cookie = new \yii\web\Cookie($options);
    Yii::$app->response->cookies->add($cookie);

    return $this->redirect(['backend/info']);
}
创建自定义控制器并使用以下内容扩展所有控制器:

<?php
namespace frontend\components;

class Controller extends \yii\web\Controller {
    public function beforeAction($action) 
    {
        if (parent::beforeAction($action)) {
            $theme = "blue";
            if (Yii::$app->request->cookies['theme']) {
                $theme = Yii::$app->request->cookies->getValue('theme');
            }
            Yii::$app->view->theme = new \yii\base\Theme([
                'pathMap' => ['@app/views' => '@app/themes/'.$theme],
                'baseUrl' => '@web',

            ]);
            return true;  // or false if needed
        } else {
            return false;
        }
    }
}

控制器中的
\abstract controller(我对所有控制器使用abstract controller)。我也用高级的Yii2做,但我不认为有什么问题。。。只需更改您需要的别名

 public function init()
    {
        parent::init();

        \Yii::$app->setLayoutPath('@backend/views/theme_'.$this->getView()->themeName.'/layouts');
        $this->setViewPath($this->module->getViewPath().'/theme_'.$this->getView()->themeName.'/'.$this->id);
    }
$this->getView()->themeName
是一个字符串,在我的例子中,它在扩展视图类中,但您可以根据自己的喜好加载\存储它。。。(从配置文件加载)

之后,在模块和基础应用程序中,您应该创建如下视图:

...
--views
----theme_b3
------controller1
--------action1
----------index.php
----------add.php
----------remove.php

----theme_adminLTE
------controller1
--------action1
----------index.php
----------add.php
----------remove.php
主要的一点是创建带有主题{themeName}(“b3”、“adminLTE”)的文件夹,并将我们需要的所有布局\视图存储在旧位置

因此,您不需要在根目录中创建“主题”文件夹,所有视图都将位于相同的位置,但位于子文件夹中

顺便说一下,在这种情况下,我们可以通过cookie或config轻松地切换主题,从旧主题切换到新主题

PS:如果你使用很多模块,这个解决方案是很好的。在base应用程序中,来自@Ravindra Bhalothia的解决方案就足够了