yii2项目实战-主题Theme的应用
更新于 2016年11月25日 by 白狼 被浏览了 1307 次

上一节我们讲述了如何自定义后台的模版主题,小伙伴们纷纷采取+1的方式说我这是忽悠。

我说:我这自定义了gii的模版,后台列表页、详情页以及表单页不就可以随便定制了么,主题的风格不也就切换了吗?

你说:你这歪曲事实,这不是我想要的主题。我想要的是比如过个节,我要给后台的某些页面换一个节日主题,过了这个节或者再过下个节可以切换主题风格。

我说:你这胡搅蛮缠,你这明明是前端的需求非要生拉硬拽提在后台的需求上。

你说:是你说的,学习,跪在灵活变通。

我:......

桑心的分割线,你们这是在折磨我-----------------------------------------------------------------------------------

我先出个妙招,过节嘛,换主题是吧,easy啊。你把页面拷贝一份,改改名字来个xxx.bak1,等再过一个节,再备份一个xxx.bak2,再升级优化页面再来个xxx.bak3,反反复复我保证你找不到哪个是哪个,哈哈哈......

玩笑归玩笑,这里首先先感谢有一群爱学的你们提的好建议,其次再次感谢付费用户的支持,有你们的支持,后面带你们分析源码都不带头疼的。来,我们先看看这节要讲述的主题:“主题”。

关于要定制主题的原因前面我们开玩笑已经提过了,而且大多数场景下也确确实实是需要的。比如,我们要求pc和h5共用一套程序,但是h5采用另一套主题,该怎么做才是比较好的方案呢?

我们先来看下平时用render是如何渲染视图文件的。

通过层层源码追踪,我们在vendor\yiisoft\yii2\base\View的renderFile方法中找到这么一段代码

public function renderFile($viewFile, $params = [], $context = null)
{
    $viewFile = Yii::getAlias($viewFile);

    if ($this->theme !== null) {
        $viewFile = $this->theme->applyTo($viewFile);
    }
    // ......
}

此处只需要看懂我们所列的if判断语句就行了,其他的先忽略掉。也就是说,在渲染底层视图文件的时候,有对主题进行过判断,动动手指头也能明白,如果设置了主题,将会渲染我们自己设置的主题模版。这里的 $this->theme 其实是 yii\base\Theme类(vendor\yiisoft\yii2\base\Theme类)的实例。通常我们设置根据Theme设置主题,主要有静态设置和动态设置两种。先来看静态设置

所谓的静态设置,就是在配置文件中配置好,该渲染谁就渲染谁。

打开配置文件,backend\config\main.php文件,在components中添加如下配置:

'components' => [
    // ...
    'view' => [
        'theme' => [
            // 'basePath' => '@app/themes/spring',
            // 'baseUrl' => '@web/themes/spring',
            'pathMap' => [ 
                '@app/views' => [ 
                    '@app/themes/spring',
                ]
            ],
        ],
    ],
],

我们先来简单说明一下这几个配置项的意义:

basePath和baseUrl分别是对资源的目录和资源的url进行配置

pathMap从名字上不难分析出其是路径的一个映射,说白了就是对@app/view路径替换为@app/themes/spring

来做几个小例子加以说明:

首先在应用的根目录(@app是指应用所在的顶级目录)backend下创建目录 themes/spring

我们以上一章节新建的测试表test为例,在gii生成完模版后,我们访问 index.php?r=test 可以看到列表页展示的是gridview数据列表。在我们已经自定义theme为spring的情况下,我们在spring目录下新建test/index.php,随便写点什么,如:

This is spring custom test/index views.

此时刷新下 index.php?r=test,你会意外的发现页面的显示的内容竟然是我们自定义的spring/test/index.php文件的内容 !也就是说我们成功的通过pathMap把@app/views映射到了@app/themes/spring/下面了!当然,你也可以定义多个映射关系,比如说又过圣诞节了

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

只需要把chrismas主题配置到属组的第一项即可,因为前面的优先级比后面高,如果前面的模版找不到才会用下面的spring主题模版。spring我们来年可以继续使用,如果当前项目还存在的话。

不知道你看懂了没有呢?有任何问题可以下面留言哦!哦不,我们这节好像还没说完,动态渲染主题的还没说,差点早早的下课了!

以前面的问题为例,我们现在一个应用,通过不同的客户端,如何动态渲染不同的模版主题?

为了演示说

继续阅读

还有35%的精彩内容,购买继续阅读