Theming

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

Чтобы использовать theming, вы должны настроить свойство 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',
                ],
            ],
        ],
    ],
];

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

$theme = $this->theme;

// returns: $theme->baseUrl . '/img/logo.gif'
$url = $theme->getUrl('img/logo.gif');

// returns: $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/index.php.

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

Иногда вам может понадобиться определить основную тему, которая содержит базовый вид приложения, а затем, основываясь на текущем празднике, вы можете слегка поменять внешний вид. Вы можете достичь этой цели, используя наследование темы, которое выполняется путем сопоставления одного пути просмотра нескольким целевым объектам. Например:

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

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