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 pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
Oct 12 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 PHP
php生成excel列名超过26列大于Z时的解决方法
Dec 29 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
Jan 05 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 PHP
CI框架数据库查询之join用法分析
May 18 PHP
PHP图形计数器程序显示网站用户浏览量
Jul 20 PHP
PHP判断一个数组是另一个数组子集的方法详解
Jul 31 PHP
thinkphp整合系列之极验滑动验证码geetest功能
Jun 18 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 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
windows xp下安装pear
2006/12/02 PHP
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
PHP7修改的函数
2021/03/09 PHP
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
XENON基于JSON变种
2010/07/27 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
2019/03/05 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
详解supervisor使用教程
2017/11/21 Python
对numpy中向量式三目运算符详解
2018/10/31 Python
python 输出所有大小写字母的方法
2019/01/02 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
Python3使用xlrd、xlwt处理Excel方法数据
2020/02/28 Python
python线程池如何使用
2020/05/28 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
幼儿园的门卫岗位职责
2014/04/10 职场文书
个人作风建设总结
2014/10/23 职场文书
商务司机岗位职责
2015/04/10 职场文书
同步小康驻村工作简报
2015/07/20 职场文书
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL