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 13 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
解析Extjs与php数据交互(增删查改)
Jun 25 PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 PHP
php输出金字塔的2种实现方法
Dec 16 PHP
浅谈json_encode用法
Mar 05 PHP
php转换颜色为其反色的方法
Apr 27 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
php生成与读取excel文件
Oct 14 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
详解Laravel制作API接口
May 31 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/06/11 PHP
php添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
纯JS实现本地图片预览的方法
2015/07/31 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
跟老齐学Python之使用Python操作数据库(1)
2014/11/25 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
全面解析Python的While循环语句的使用方法
2015/10/13 Python
Python微信库:itchat的用法详解
2017/08/14 Python
Django admin model 汉化显示文字的实现方法
2019/08/12 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
python生成大写32位uuid代码
2020/03/03 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
学术会议欢迎词
2014/01/09 职场文书
校园达人秀策划书
2014/01/12 职场文书
个人公开承诺书
2014/03/28 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
交通事故调解协议书
2015/05/20 职场文书
《绝招》教学反思
2016/02/20 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python