Nikudator
@Nikudator
Немножко программирую на PHP

Как правильно сделать свою themes для проекта на yii2?

Почитал документацию.
Шаблон базовый.
Создал папку themes в ней mythemes, в неё перенес стандартную layouts с main.php из views.
В конфиге:
'view' => [
            'theme' => [
                'pathMap' => ['@app/views' => '@app/themes/mythemes'],
                'baseUrl' => '@web/themes/mythemes',
                'basePath' => '@app/themes/mythemes',
            ],
        ],

Впринципе тема работает, views из корня вообще выпилил.
Пробую добавить свой css для простой смены цвета. Создаю /themes/mythemes/css/style.css, в /themes/mythemes/layouts/main.php добавил:
<link href="<?php echo $this->theme->baseUrl ?>/css/style.css" rel="stylesheet" media="screen" title="default">

Вместо /themes/mythemes/css/style.css отдает страницу с 404 ошибкой.
Перепробовал кучу вариантов, не работает, блин.
Как правильно "прокинуть" статичные файлы из @app в @web? Не только CSS, но и картинки, например. Либо подскажите другой способ, что бы тема лежала в одной папке.
  • Вопрос задан
  • 5237 просмотров
Решения вопроса 1
DmitryVoronkov
@DmitryVoronkov
Python Developer
Это в первой версии так работает. Во второй версии скриптами и стилями рулит assets/AppAsset.php
Дока
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Nikudator
@Nikudator Автор вопроса
Немножко программирую на PHP
В общем последовательность на которой я остановился - такая:
Создаем themes/mytheme
В неё копируем из view папку layouts с содержащимся в ней main.php
В config/web.php
'components' => [
        'view' => [
            'theme' => [
                'pathMap' => ['@app/views' => '@app/themes/mytheme'],
            ],
        ],
    ],

Создаем themes/mytheme/css/style.css
И в assets/AppAsset.php меняем содержимое класса на:
class AppAsset extends AssetBundle
{
    public $sourcePath = '@app/themes/mytheme';
    public $css = [
        'css/style.css',
    ];
    public $js = [
    ];
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];
}
Ответ написан
Комментировать
sanchezzzhak
@sanchezzzhak
Ля ля ля...
я юзаю костыль
<?php
namespace app\components;
use Yii;
use yii\base\InvalidConfigException;
use yii\helpers\ArrayHelper;
use yii\helpers\FileHelper;

class Theme extends \yii\base\Theme
{

    public $active;
    /**
     * @inheritdoc
     */
    public function applyTo($path)
    {

        $pathMap = ArrayHelper::getValue($this->pathMap,$this->active,$this->pathMap);

        if (empty($pathMap)) {
            if (($basePath = $this->getBasePath()) === null) {
                throw new InvalidConfigException('The "basePath" property must be set.');
            }
            $pathMap = [Yii::$app->getBasePath() => [$basePath]];
        }


        $path = FileHelper::normalizePath($path);
        foreach ($pathMap as $from => $tos) {
            $from = FileHelper::normalizePath(Yii::getAlias($from)) . DIRECTORY_SEPARATOR;
            if (strpos($path, $from) === 0) {
                $n = strlen($from);
                foreach ((array) $tos as $to) {
                    $to = FileHelper::normalizePath(Yii::getAlias($to)) . DIRECTORY_SEPARATOR;
                    $file = $to . substr($path, $n);
                    if (is_file($file)) {
                        return $file;
                    }
                }
            }
        }
        return $path;
    }
}


так как переключение шаблонов из контроллера не работает, карл!!!
в конфигах
'view'=>[

            'theme' => [
                'class'=>'app\components\Theme',
                'active'=>'theme-default',
                'pathMap' => [
                    'theme-default' => [
                        '@app/views' => ['@app/themes/theme-default/views']
                    ],
                    'theme-dashboard' => [
                        '@app/views' => ['@app/themes/theme-dashboard/views']
                    ]
                ]
            ],
        ],


В контролере тема указывается так
$this->view->theme->active = 'theme-dashboard';
Если вьюхи нету в папке темы то поиск будет искаться в стандартных папках views

Про стили вам ответили
Ответ написан
Комментировать
есть еще вот такие костыли
list($path, $webPath) = Yii::$app->getAssetManager()->publish(__DIR__."/assets");
$this->getView()->registerJsFile($webPath."/js/login.js",['depends' => ['yii\bootstrap\BootstrapAsset']]);

Но это не лучший вариант. К тому же при разработке крайне неудобно удалять каждый раз assets т.к. таким методом они не обновляются при изменении.

А вообще да лучший вариант это AppAsset.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы