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权限分配的实现代码
Apr 28 PHP
基于Zend的Config机制的应用分析
May 02 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
May 08 PHP
ThinkPHP快速入门实例教程之数据分页
Jul 01 PHP
php中explode的负数limit用法分析
Feb 27 PHP
分享十款最出色的PHP安全开发库中文详细介绍
Mar 22 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
Yii核心验证器api详解
Nov 23 PHP
ThinkPHP实现登录退出功能
Jun 29 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
Oct 06 PHP
php实现 master-worker 守护多进程模式的实例代码
Jul 20 PHP
PHP实现的多进程控制demo示例
Jul 22 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
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
php绘制一个扇形的方法
2015/01/24 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
PHP简单检测网址是否能够正常打开的方法
2016/09/04 PHP
复选框全选与全不选操作实现思路
2013/08/18 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
老生常谈遮罩层 滚动条的问题
2016/04/29 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
layui监听工具栏的实例(操作列表按钮)
2019/09/10 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
Python科学计算环境推荐——Anaconda
2014/06/30 Python
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
python多线程下信号处理程序示例
2019/05/31 Python
python打包成so文件过程解析
2019/09/28 Python
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
母亲追悼会答谢词
2014/01/27 职场文书
重阳节登山活动方案
2014/02/03 职场文书
IT工程师岗位职责
2014/07/04 职场文书
实习协议书
2015/01/27 职场文书
爱的教育读书笔记
2015/06/26 职场文书
公务员岗前培训心得体会
2016/01/08 职场文书
Python编程根据字典列表相同键的值进行合并
2021/10/05 Python