主題(Theming)

2018-02-24 15:40 更新

主題

主題是一種將當(dāng)前的一套視圖?views?替換為另一套視圖,而無需更改視圖渲染代碼的方法。 你可以使用主題來系統(tǒng)地更改應(yīng)用的外觀和體驗(yàn)。

要使用主題,你得配置?view?應(yīng)用組件的 yii\base\View::theme 屬性。 這個(gè)屬性配置了一個(gè) yii\base\Theme 對(duì)象,這個(gè)對(duì)象用來控制視圖文件怎樣被替換。 你主要應(yīng)該指明下面的 yii\base\Theme 屬性:

  • yii\base\Theme::basePath:指定包含主題資源(CSS, JS, images, 等等)的基準(zhǔn)目錄。
  • yii\base\Theme::baseUrl:指定主題資源的基準(zhǔn)URL。
  • yii\base\Theme::pathMap:指定視圖文件的替換規(guī)則。更多細(xì)節(jié)將在下面介紹。

例如,如果你在?SiteController?里面調(diào)用?$this->render('about'),那你將渲染視圖文件?@app/views/site/about.php。 然而,如果你在下面的應(yīng)用配置中開啟了主題功能,那么@app/themes/basic/site/about.php?文件將會(huì)被渲染。

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

信息:主題支持路徑別名。當(dāng)我們?cè)谧鲆晥D替換的時(shí)候, 路徑別名將被轉(zhuǎn)換成實(shí)際的文件路徑或者URL。

你可以通過 yii\base\View::theme 屬性訪問 yii\base\Theme 對(duì)象。例如,在一個(gè)視圖文件里,你可以寫下面的代碼, 因?yàn)?$this?指向視圖對(duì)象:

$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 屬性控制如何替換視圖文件。它是一個(gè)鍵值對(duì)數(shù)組,其中, 鍵是原本的視圖路徑,而值是相應(yīng)的主題視圖路徑。 替換是基于部分匹配的:如果視圖路徑以 yii\base\Theme::pathMap 數(shù)組的 任何一個(gè)鍵為起始,那么匹配部分將被相應(yīng)的值所替換。 使用上面配置的例子,因?yàn)?@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。

主題繼承

有的時(shí)候,你可能想要定義一個(gè)基本的主題,其中包含一個(gè)基本的應(yīng)用外觀和體驗(yàn),然后根據(jù)當(dāng)前的節(jié)日,你可能想要稍微地改變一下外觀和體驗(yàn)。 這個(gè)時(shí)候,你就可以使用主題繼承實(shí)現(xiàn)這一目標(biāo),主題繼承是通過一個(gè)單視圖路徑去映射多個(gè)目標(biāo), 例如,

'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, 這取決于哪個(gè)主題文件存在。假如都存在,那么第一個(gè)將被優(yōu)先使用。在現(xiàn)實(shí)情況中, 你會(huì)將大部分的主題文件放在?@app/themes/basic?里,而一些自定義的放在?@app/themes/christmas里。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)