Разработка того, как Yii2 находит тематические ресурсы при использовании резервных копий

Я использую Yii2 и читаю о theming и наследование темы; однако есть некоторые вопросы:

Рассмотрим следующий пример:

'view' => [
    'theme' => [
        'pathMap' => [
            '@app/views' => [
                '@app/themes/current',
                '@app/themes/default',
            ],
        ],
        'baseUrl' => '@web/themes/current',
        'basePath' => '@webroot/themes/current',
    ],
],

Теперь представьте, что мы запрашиваем файл темы foo; как я понимаю, это сначала будет искать в следующем порядке:

  • @app/themes/current/foo.php
  • @app/themes/default/foo.php
  • @app/views/foo.php

Теперь представьте, что foo.php не найден в теме @app/themes/current/, поэтому он будет использовать файл, найденный в @app/themes/default/.

Теперь, учитывая настройки baseUrl и basePath, я немного запутался, как они используются в этих ситуациях.

Теперь представьте, что foo.php ссылается на файл изображения внутри файла, не попытается ли это найти @web/themes/current/images/myImage.jpg, а не @web/themes/default/images/myImage.jpg?

Ответы

Ответ 1

В этом случае basePath бесполезно. Поскольку basePath применяется только тогда, когда pathMap пусто.
basePath не является резервным, это сокращение от pathMap, быстрое использование, когда у вас есть только одна тема.

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

Эквивалент:

'basePath' => '@app/themes/current', 

(Yii понимает, что существует папка @app/themes/current/views)

baseUrl: он возвращается, когда вы вызываете $this->theme->getBaseUrl() в файл вида. Меньше стоит с несколькими темами.

О возврате для статических файлов. Резервирование Theming не предназначено для этой цели.

Ответ 2

Направьте свои ссылки внутри файла, как этот exmaple, из docs:

$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');

Он получит файл из текущего каталога тем.