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 相关文章推荐
URL Rewrite的设置方法
Jan 02 PHP
10条PHP编程习惯助你找工作
Sep 29 PHP
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
Dec 18 PHP
PHP中设置时区方法小结
Jun 03 PHP
ThinkPHP中ajax使用实例教程
Aug 22 PHP
windows中为php安装mongodb与memcache
Jan 06 PHP
php微信公众平台开发之获取用户基本信息
Aug 17 PHP
php pthreads多线程的安装与使用
Jan 19 PHP
PHP验证码生成原理和实现
Jan 24 PHP
php中文字符串截取多种方法汇总
Oct 06 PHP
PHP实现导出excel数据的类库用法示例
Oct 15 PHP
浅谈PHP中的那些魔术常量
Dec 02 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+mysql 实现身份验证代码
2010/03/24 PHP
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
javascript定时器取消定时器及优化方法
2017/07/08 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
python机器学习之神经网络(一)
2017/12/20 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
Django单元测试工具test client使用详解
2019/08/02 Python
Python中的self用法详解
2019/08/06 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
擅自离岗检讨书
2014/02/11 职场文书
假面舞会策划方案
2014/05/29 职场文书
山楂树之恋观后感
2015/06/11 职场文书
于丹讲座视频观后感
2015/06/15 职场文书
修辞手法有哪些?
2019/08/29 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang