@Leffken
Студент, как студент!

Как в yii2 создать несколько тем?

Всем привет.
Столкнулся с проблемой создания нескольких тем, сейчас в конфиге :
'components'=>[
'view' => [
            'theme' => [
                'basePath' => '@app/themes/theme1',
                'baseUrl' => '@app/themes/theme1/web',
                'pathMap' => [
                    '@app/views' => '@app/themes/theme1/views',
                ],
            ],
        ],
],

Как мне добавить theme2 ? basePath & baseUrl должны быть разные, т.к. в разных темах разные css и js файлы, которые хранятся в */web/css|js|image.
  • Вопрос задан
  • 810 просмотров
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Когда-то тоже интересовался этой темой. Есть несколько вариантов решения проблемы.
Например, в SiteController можно сделать так:
public function init() 
    {
        parent::init();
        // Вариант 1
        // Работает без компонента в конфигурации
        // 'view' => [
        //    'theme' => []
        // ]
        $theme = Yii::$app->request->get('theme');
        if($theme){
            $this->getView()->theme = Yii::createObject([
                'class' => '\yii\base\Theme',
                'baseUrl' => '@web/themes/'.$theme,
                'basePath' => '@app/themes/'.$theme,
                'pathMap' => ['@app/views' => '@app/themes/'.$theme],
             ]);
         }
        
        // Вариант 2
        //Работает, если в конфигурации есть компонент без параметров
        // 'view' => [
        //    'theme' => []
        // ]
        Yii::$app->view->theme->basePath = '@app/themes/admin';
        Yii::$app->view->theme->baseUrl = '@web/themes/admin';
        Yii::$app->view->theme->pathMap = ['@app/views' => '@app/themes/admin'];

    } 

    // Вариант 3
    // устанавливает тему на лету
    // вид ссылки
    // <a href="themeswitch/theme=theme_name">theme_name</a>
    // 
    public function actionThemeswitch($theme)
    {

        if($theme == 'default'){
            Yii::$app->response->cookies->remove('theme');
            return $this->redirect(['index']);
        }

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

        return $this->redirect(['index']);
    }

    public function beforeAction($action)
    {
        if (parent::beforeAction($action)) {
            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;
        }
    }

Ещё вариант Как правильно сделать свою themes для проекта на yii2?
Мой пример(вариант № 3)

P.S. Пример по варианту № 3 придуман не лично мной. Нашёл на просторах инета, может даже на toster.ru. Показал как demo.

P.S.S
Допустим тема Portfolio(по ссылке.)
Тема находится по пути themes/portfolio
Изображения для темы themes/portfolio/assets/ims (там же находятся css, js)
Виды темы в themes/portfolio/views/site
В файле index.php темы
use app\assets\PortfolioAsset;
 $image = PortfolioAsset::register($this);
 $theme = $this->theme;

Изображения в этом же файле подключаю так:
echo Html::img($image->baseUrl.'/img/portfolio-1.jpg',
                         ['alt' => '']);

И конечно же в PortfolioAsset такой параметр
public $sourcePath = '@app/themes/portfolio/assets';
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Как вариант:
'view' => [
     'theme' => require(__DIR__ . '/theme.php'),
]

там лежит конфиг и перезаписывается из админки
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы