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 15 PHP
如何用php生成扭曲及旋转的验证码图片
Jun 07 PHP
关于js与php互相传值的介绍
Jun 25 PHP
9个经典的PHP代码片段分享
Dec 18 PHP
PHP获取数组最后一个值的2种方法
Jan 21 PHP
php常用表单验证类用法实例
Jun 18 PHP
PHP发送短信代码分享
Aug 11 PHP
PHP使用socket发送HTTP请求的方法
Feb 14 PHP
php获取微信基础接口凭证Access_token
Aug 23 PHP
Laravel框架Request、Response及Session操作示例
May 06 PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 04 PHP
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
Apr 01 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中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
2016/11/29 Javascript
js实现时间轴自动排列效果
2017/03/09 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
vue中实现滚动加载更多的示例
2017/11/08 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
python urllib爬虫模块使用解析
2019/09/05 Python
python+pygame实现坦克大战
2019/09/10 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
图书室管理制度
2014/01/19 职场文书
办公室秘书岗位职责范本
2014/02/11 职场文书
售后服务承诺书
2014/03/26 职场文书
公司保密承诺书
2014/03/27 职场文书
学历公证书范本
2014/04/09 职场文书
安全环保演讲稿
2014/08/28 职场文书
创业计划书之书店
2019/09/10 职场文书
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL