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 select,radio和checkbox默认选择的实现方法
May 15 PHP
php下通过IP获取地理位置的代码(小偷程序)
Jun 09 PHP
PHP mcrypt可逆加密算法分析
Jul 19 PHP
检查php文件中是否含有bom的函数
May 31 PHP
修改php.ini以达到屏蔽错误信息并记录日志
Jun 16 PHP
php使浏览器直接下载pdf文件的方法
Nov 15 PHP
PHP预定义变量9大超全局数组用法详解
Apr 23 PHP
php+ajax登录跳转登录实现思路
Jul 31 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
Dec 09 PHP
利用php生成验证码
Feb 23 PHP
PHP 无限级分类
May 04 PHP
php微信公众号开发之答题连闯三关
Oct 20 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
在项目中寻找代码的坏命名
2012/07/14 PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
2013/01/13 PHP
使用PHP备份MYSQL数据的多种方法
2014/01/15 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
利用php输出不同的心形图案
2016/04/22 PHP
javascript内置对象操作详解
2015/02/04 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
2015/05/12 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
js实现弹窗居中的简单实例
2016/10/09 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
js 倒计时(高效率服务器时间同步)
2017/09/12 Javascript
小程序Request的另类用法详解
2019/08/09 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
python字符类型的一些方法小结
2016/05/16 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
PyQt5 多窗口连接实例
2019/06/19 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
Python实现上下文管理器的方法
2020/08/07 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
最新教师自我评价分享
2013/11/12 职场文书
小学运动会表扬稿
2014/01/19 职场文书
服务员岗位职责
2014/01/29 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
工地安全生产标语
2014/06/06 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python