最近发现漏了很重要的一章章节知识点--关于yii2的主题化设计。所谓的主题话设计简单点说就是通过设置不同的模板主题,可以快速切换,无需更改视图渲染代码的方法。
在yii2中使用主题,首先要配置主题,在components中
'view' => [
'theme' => [
'basePath' => '@app/themes/blue',
'baseUrl' => '@web/themes/blue',
'pathMap' => [
'@app/views' => '@app/themes/blue',
],
],
]
yii\base\Theme::baseUrl:指定主题资源的基准URL。也就是指定模板在哪一个目录下的位置yii\base\Theme::basePath:指定包含主题资源(CSS, JS, images, 等等)的基准目录。
yii\base\Theme::pathMap:指定视图文件的替换规则。这个很重要。
主题化模块
要主题化模块,yii\base\Theme::pathMap 可以配置成下面这样:
'pathMap' => [
'@app/views' => '@app/themes/blue',
'@app/modules' => '@app/themes/blue/modules', // <-- !!!
],
它允许你将 @app/modules/blog/views/comment/index.php 主题化成 @app/themes/blue/modules/blog/views/comment/index.php。
首先根据路由,可以去寻找默认的views文件位置,然后键@app/views去匹配对应位置,如果找的到对应的views文件位置,则直接就用匹配的模板主题,如果找不到,那就用默认的主题,也就是键@app/views所在位置的视图。
如果我们按照模块设计来做,那么默认对应的views视图文件应该是在@app/modules的views中,那么我们可以重新定义一个模块化主题位置@app/themes/blue/modules,那么就会将模块化主题的模板定位到这个blue的蓝色主题。
主题化小部件
要主题化小部件,你可以像下面这样配置 yii\base\Theme::pathMap:
'pathMap' => [
'@app/views' => '@app/themes/blue',
'@app/widgets' => '@app/themes/blue/widgets',
]
这将允许你将 @app/widgets/currency/views/index.php 主题化成 @app/themes/blue/widgets/currency/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里