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 的几个配置文件函数
Dec 21 PHP
PHPMyAdmin 快速配置方法
May 11 PHP
PHP5中新增stdClass 内部保留类
Jun 13 PHP
解析百度搜索结果link?url=参数分析 (全)
Oct 09 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
PHP+memcache实现消息队列案例分享
May 21 PHP
php gd等比例缩放压缩图片函数
Jun 12 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
php无法连接mysql数据库的正确解决方法
Jul 01 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
Sep 13 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
Apr 03 PHP
php使用curl实现简单模拟提交表单功能
May 15 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 分页原理详解
2009/08/21 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
PHP中把对象转换为关联数组代码分享
2015/04/09 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
jQuery autocomplate 自扩展插件、自动完成示例代码
2011/03/28 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
[01:36]DOTA2完美大师赛趣味视频之与队友相处的十万个技巧
2017/11/19 DOTA
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
python简易实现任意位数的水仙花实例
2018/11/13 Python
pycharm 设置项目的根目录教程
2020/02/12 Python
Python实现井字棋小游戏
2020/03/09 Python
高考考python编程是真的吗
2020/07/20 Python
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
关联、聚合(Aggregation)以及组合(Composition)的区别
2012/02/29 面试题
大学军训感言200字
2014/02/26 职场文书
汇源肾宝广告词
2014/03/20 职场文书
企业标语口号
2014/06/10 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
oracle覆盖导入dmp文件的2种方法
2021/05/21 Oracle