Yii2主题(Theme)用法详解


Posted in PHP onJuly 23, 2016

本文实例讲述了Yii2主题(Theme)用法。分享给大家供大家参考,具体如下:

首先看看主要的配置方式:

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

Yii中的主题功能主要由yii\base\Theme类来实现,它的主要思想是:先定义好一个一一对应的字符串映射数组,然后对给定的字符串按照数组中的映射关系进行字符串替换。

有如下映射:

$pathMap=[
    '@app/a' => '@app/aaa',
    '@app/b' => '@app/bbb',
    '@app/c' => [
        '@app/ccc/xxx',
        '@app/ccc/yyy',
      ],
];

对字符串 @app/a/site/index.php,由上面的映射关系可知会把@app/a替换为@app/aaa,生成结果为@app/aaa/site/index.php。

但要注意,这个还不是最终的结果。由于在Yii中是对文件路径的操作,所以如果@app/aaa/site/index.php这个文件存在的话,则会返回这个路径,否则返回原路径即:@app/a/site/index.php

如果有字符串@app/c/site/index.php,由于上面的映射知道@app/c对应2个替换项,Yii会从前开始依次替换,先生成@app/ccc/xxx/site/index.php,如果这个文件存在,则返回这个路径,否则继续替换。

如果所有的替换结果都不存在对应的文件,那么最后返回原路径。

同时写多个替换的目标值有这么一个好处:实现主题的继承。

现在有一套默认的主题default,如果现在要增加一套黑色的主题,有两个办法可以实现。

第一种:把所有的default中的视图全部复制一份到blank目录中。

第二种:只复制一份layout布局文件到blank目录中,然后在布局文件中修改整体颜色。然后设置为

$pathMap=[
    '@app/c' => [
        '@app/ccc/blank',
        '@app/ccc/default',
      ],
];

好处看到了吧,如果在blank中没有找到文件,会从default中来查找,也就是说blank中的文件会覆盖default中存在的文件,从而实现了主题的继承。

主题中的属性:

$pathMap:这个就是用来设置替换映射关系的。

'pathMap' =>[
    '@app/views' => [
        '@app/themes/blank',
        '@app/themes/default',
    ],
    '@app/modules' => '@app/themes/default/modules',
    '@app/widgets' => '@app/themes/default/widgets'
],

这三个分别对views、modules和widgets应用主题。

$baseUrl:这个用来设置要访问的资源的url(结尾不加“/”)

$basePath:设置资源所在的文件目录

主题中的方法:

public function init()

public function init()
{
    parent::init();
    //如果没有设置$pathMap映射,则使用$basePath,
    if (empty($this->pathMap)) {
        /*
         * 如果$basePath也没有设置,则出异常。
         * 也就是说 $pathMap和$basePath至少要设置一个,如果两个都设置了,优先使用$pathMap
         */
      if (($basePath = $this->getBasePath()) === null) {
        throw new InvalidConfigException('The "basePath" property must be set.');
      }
      //设置当前模块的路径和$basePath的映射关系
      $this->pathMap = [Yii::$app->getBasePath() => [$basePath]];
    }
}

public function applyTo($path)

//这个就是按照 $pathMap中的定义的映射关系来对$path进行替换字符串的
public function applyTo($path)
{
    //对路径中的"/"、“\”进行统一替换
    $path = FileHelper::normalizePath($path);
    foreach ($this->pathMap as $from => $tos) {
       //映射数组中的来源(旧值)
      $from = FileHelper::normalizePath(Yii::getAlias($from)) . DIRECTORY_SEPARATOR;
      //如果在$path中有可替换的旧值
      if (strpos($path, $from) === 0) {
        $n = strlen($from);
        //对目标值循环,
        foreach ((array) $tos as $to) {
          $to = FileHelper::normalizePath(Yii::getAlias($to)) . DIRECTORY_SEPARATOR;
          //把$path中的$from替换为$to
          $file = $to . substr($path, $n);
          //如果是文件,直接返回
          if (is_file($file)) {
            return $file;
          }
        }
      }
    }
    return $path;
}

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php数组函数序列之array_key_exists() - 查找数组键名是否存在
Oct 29 PHP
PHP性能优化工具篇Benchmark类调试执行时间
Dec 06 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
Oct 04 PHP
php实现用于删除整个目录的递归函数
Mar 16 PHP
PHP编程基本语法快速入门手册
Jan 07 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
Jan 08 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
PHP对XML内容进行修改和删除实例代码
Oct 26 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
Jul 27 PHP
PHP7 mongoDB扩展使用的方法分享
May 02 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 #PHP
Yii2验证器(Validator)用法分析
Jul 23 #PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
Jul 23 #PHP
Yii2简单实现多语言配置的方法
Jul 23 #PHP
yii2控制器Controller Ajax操作示例
Jul 23 #PHP
PHP实现清除MySQL死连接的方法
Jul 23 #PHP
php实现批量修改文件名称的方法
Jul 23 #PHP
You might like
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
PHP中上传文件打印错误错误类型分析
2019/04/14 PHP
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
文本框input聚焦失焦样式实现代码
2012/10/12 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
利用a标签自动解析URL分析网址实例
2014/10/20 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
js模拟支付宝密码输入框
2017/04/11 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
python中time库的实例使用方法
2019/10/31 Python
django框架cookie和session用法实例详解
2019/12/10 Python
python如何实时获取tcpdump输出
2020/09/16 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
建龙钢铁面试总结
2014/04/15 面试题
竞聘上岗演讲稿范文
2014/01/10 职场文书
中学生演讲稿
2014/04/26 职场文书
2016年春节慰问信息
2015/03/25 职场文书
结婚喜宴祝酒词
2015/08/10 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
mysql如何查询连续记录
2022/05/11 MySQL