主题是一种用另一种替换一组 视图 的方法,而无需触碰原始视图渲染代码。您可以使用主题来系统地更改应用程序的外观和感觉。
要使用主题,您应该配置 主题 属性的 view
应用程序组件。该属性配置一个 yii\base\Theme 对象,它控制如何替换视图文件。您应该主要指定以下 yii\base\Theme 的属性
例如,如果您在 SiteController
中调用 $this->render('about')
,您将渲染视图文件 @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',
],
],
],
],
];
信息: 路径别名受主题支持。在进行视图替换时,路径别名将转换为实际文件路径或 URL。
您可以通过 yii\base\View::$theme 属性访问 yii\base\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/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
中自定义其中一些文件。
发现错别字或您认为此页面需要改进?
在 GitHub 上编辑它 !
请 注册 或 登录 以发表评论。