Добрый день.
Когда-то тоже интересовался этой темой. Есть несколько вариантов решения проблемы.
Например, в 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';