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 相关文章推荐
apache+mysql+php+ssl服务器之完全安装攻略
Sep 05 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
Apr 20 PHP
PHP之数组学习
May 29 PHP
用php来改写404错误页让你的页面更友好
Jan 24 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
Oct 09 PHP
详解 PHP加密解密字符串函数附源码下载
Dec 18 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
Mar 07 PHP
微信支付扫码支付php版
Jul 22 PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 PHP
php和C#的yield迭代器实现方法对比分析
Jul 17 PHP
PHP调用接口API封装的例子
Oct 11 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
咖啡冲泡指南 咖啡有哪些制作方式 单品咖啡 意式咖啡
2021/03/06 冲泡冲煮
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
IE8 原生JSON支持
2009/04/13 Javascript
JS原型对象通俗"唱法"
2012/12/27 Javascript
Extjs407 getValue()和getRawValue()区别介绍
2013/05/21 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
Python使用MD5加密字符串示例
2014/08/22 Python
Python实现的多进程拷贝文件并显示百分比功能示例
2019/04/09 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
安装python及pycharm的教程图解
2019/10/10 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
总经理助理岗位职责
2013/11/08 职场文书
全运会口号
2014/06/20 职场文书
工作目标责任书
2014/07/23 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python