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实现链结人气统计
Oct 09 PHP
php桌面中心(三) 修改数据库
Mar 11 PHP
php实现简单文件下载的方法
Jan 30 PHP
php判断并删除空目录及空子目录的方法
Feb 11 PHP
zend framework中使用memcache的方法
Mar 04 PHP
微信公众号开发之语音消息识别php代码
Aug 08 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
PHP让数组中有相同值的组成新的数组实例
Dec 31 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 23 PHP
php 使用mpdf实现指定字段配置字体样式的方法
Jul 29 PHP
laravel框架创建授权策略实例分析
Nov 22 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程序的php代码
2008/04/07 PHP
PHP中去掉字符串首尾空格的方法
2012/05/19 PHP
php变量作用域的深入解析
2013/06/03 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
php实现微信公众号无限群发
2015/10/11 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
jquery cookie插件代码类
2009/05/26 Javascript
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
Python输出PowerPoint(ppt)文件中全部文字信息的方法
2015/04/28 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
Apache部署Django项目图文详解
2019/07/30 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
shallow copy和deep copy的区别
2016/05/09 面试题
直接有效的自我评价
2014/01/11 职场文书
总经理司机岗位职责
2014/02/06 职场文书
实习单位鉴定评语
2014/04/26 职场文书
青涩记忆观后感
2015/06/18 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
Django模型层实现多表关系创建和多表操作
2021/07/21 Python