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 相关文章推荐
我的论坛源代码(六)
Oct 09 PHP
PHP+APACHE实现用户论证的方法
Oct 09 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
Jul 07 PHP
深入file_get_contents与curl函数的详解
Jun 25 PHP
php获取CSS文件中图片地址并下载到本地的方法
Dec 02 PHP
PHP下载文件的函数实例代码
May 18 PHP
PHP Filter过滤器全面解析
Aug 09 PHP
ThinkPHP删除栏目(实现批量删除栏目)
Jun 21 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
May 30 PHP
PHP面向对象程序设计继承用法简单示例
Dec 28 PHP
PHP实现字母数字混合验证码功能
Jul 11 PHP
PHP实现统计代码行数小工具
Sep 19 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常用函数的集合(比较详细)
2013/06/06 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
将CKfinder整合进CKEditor3.0的新方法
2010/01/10 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
javascript中callee与caller的区别分析
2015/04/20 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
python实现list由于numpy array的转换
2018/04/04 Python
Django实现分页功能
2018/07/02 Python
Python正则表达式和元字符详解
2018/11/29 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
python之生成多层json结构的实现
2020/02/27 Python
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
夜大毕业自我鉴定
2013/10/11 职场文书
经济管理毕业生求职信
2014/03/15 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
死亡赔偿协议书
2015/01/28 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP