Темизация

Темизация — это способ заменить один набор представлений другим без переписывания кода, что замечательно подходит для изменения внешнего вида приложения.

Для того, чтобы начать использовать темизацию, настройте свойство theme компонента приложения view. Конфигурация настраивает объект yii\base\Theme, который отвечает за то, как именно заменяются файлы отображений. Главным образом, стоит настроить следующие свойства yii\base\Theme:

  • yii\base\Theme::basePath: базовая директория, в которой размещены темизированные ресурсы (CSS, JS, изображения, и так далее).
  • yii\base\Theme::baseUrl: базовый URL для доступа к темизированным ресурсам.
  • yii\base\Theme::$pathMap: правила замены файлов представлений. Подробно описаны далее.

Например, если вы вызываете $this->render('about') в SiteController, то будет использоваться файл отображения @app/views/site/about.php. Тем не менее, если вы включите темизацию как показано ниже, то вместо него будет использоваться @app/themes/basic/site/about.php.

return [
    'components' => [
        'view' => [
            'theme' => [
                'basePath' => '@app/themes/basic',
                'baseUrl' => '@web/themes/basic',
                'pathMap' => [
                    '@app/views' => '@app/themes/basic',
                ],
            ],
        ],
    ],
];

Info: При настройке тем поддерживаются псевдонимы пути. При замене отображений они преобразуются в реальные пути в файловой системе или URL.

Вы можете обратиться к объекту yii\base\Theme через свойство yii\base\View::$theme. Например, в файле отображения, это будет выглядеть следующим образом (объект view доступен как $this):

$theme = $this->theme;

// возвращает: $theme->baseUrl . '/img/logo.gif'
$url = $theme->getUrl('img/logo.gif');

// возвращает: $theme->basePath . '/img/logo.gif'
$file = $theme->getPath('img/logo.gif');

Свойство yii\base\Theme::$pathMap определяет то, как заменяются файлы представлений. Свойство принимает массив пар ключ-значение, где ключи являются путями к оригинальным файлам, которые мы хотим заменить, а значения — соответствующие пути к файлам из темы. Замена основана на частичном совпадении: если путь к представлению начинается с любого из ключей массива pathMap, то соответствующая ему часть будет заменена значением из того же массива. Для приведённой выше конфигурации @app/views/site/about.php частично совпадает с ключом @app/views и будет заменён на @app/themes/basic/site/about.php.

Темизация модулей

Для того, чтобы темизировать модули, свойство yii\base\Theme::$pathMap может быть настроено следующим образом:

'pathMap' => [
    '@app/views' => '@app/themes/basic',
    '@app/modules' => '@app/themes/basic/modules', // <-- !!!
],

Это позволит вам темизировать @app/modules/blog/views/comment/index.php в @app/themes/basic/modules/blog/views/comment/index.php.

Темизация виджетов

Для того, чтобы темизировать виджеты вы можете настроить свойство yii\base\Theme::$pathMap следующим образом:

'pathMap' => [
    '@app/views' => '@app/themes/basic',
    '@app/widgets' => '@app/themes/basic/widgets', // <-- !!!
],

Это позволит вам темизировать @app/widgets/currency/views/index.php в @app/themes/basic/widgets/currency/views/index.php.

Наследование тем

Иногда требуется создать базовую тему, задающую общий вид приложения и далее изменять этот вид в зависимости, например, от сегодняшнего праздника. Добиться этого можно при помощи наследования тем. При этом один путь к файлу ставится в соответствие нескольким путям из темы:

'pathMap' => [
    '@app/views' => [
        '@app/themes/christmas',
        '@app/themes/basic',
    ],
]

В этом случае представление @app/views/site/index.php темизируется либо в @app/themes/christmas/site/index.php, либо в @app/themes/basic/site/index.php в зависимости от того, в какой из тем есть нужный файл. Если файлы присутствуют и там и там, используется первый из них. На практике большинство темизированных файлов будут расположены в @app/themes/basic, а их версии для праздников в @app/themes/christmas.