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截取utf-8中文字符串乱码的解决方法
Mar 29 PHP
pdo中使用参数化查询sql
Aug 11 PHP
php中的boolean(布尔)类型详解
Oct 28 PHP
yii实现级联下拉菜单的方法
Jul 31 PHP
初识Laravel
Oct 30 PHP
php生成动态验证码gif图片
Oct 19 PHP
Yii2如何批量添加数据
May 17 PHP
Centos6.5和Centos7 php环境搭建方法
May 27 PHP
PHP实现的简单排列组合算法应用示例
Jun 20 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
Sep 18 PHP
使用Zookeeper分布式部署PHP应用程序
Mar 15 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
php 启动时报错的简单解决方法
2014/01/27 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
Python Trie树实现字典排序
2014/03/28 Python
python中defaultdict的用法详解
2017/06/07 Python
Python全排列操作实例分析
2018/07/24 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
python如何实现代码检查
2019/06/28 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
幼师自荐信范文
2013/10/06 职场文书
招商业务员岗位职责
2013/12/16 职场文书
农村婚礼证婚词
2014/01/10 职场文书
党员承诺书怎么写
2014/05/20 职场文书
电子信息工程自荐信
2014/05/26 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
Golang生成Excel文档的方法步骤
2021/06/09 Golang
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
Vue.Draggable实现交换位置
2022/04/07 Vue.js