zoukankan      html  css  js  c++  java
  • yii2源码学习笔记(十七)

    Theme 类,应用的主题,通过替换路径实现主题的应用,方法为获取根路径和根链接:yii2aseTheme.php

      1 <?php
      2 /**
      3  * @link http://www.yiiframework.com/
      4  * @copyright Copyright (c) 2008 Yii Software LLC
      5  * @license http://www.yiiframework.com/license/
      6  */
      7 
      8 namespace yiibase;
      9 
     10 use Yii;
     11 use yiihelpersFileHelper;
     12 
     13 /**
     14  * Theme represents an application theme.
     15  * Theme 类,应用的主题
     16  * When [[View]] renders a view file, it will check the [[View::theme|active theme]]
     17  * to see if there is a themed version of the view file exists. If so, the themed version will be rendered instead.
     18  * 视图对象[[View]]渲染视图文件的时候,会检查视图的主题是否存在,如果存在则渲染主题取代默认样式
     19  * A theme is a directory consisting of view files which are meant to replace their non-themed counterparts.
     20  *
     21  * Theme uses [[pathMap]] to achieve the view file replacement:
     22  *
     23  * 1. It first looks for a key in [[pathMap]] that is a substring of the given view file path;
     24  *  首先查找关键字,关键字是一个给定的视图路径的字符串
     25  * 2. If such a key exists, the corresponding value will be used to replace the corresponding part
     26  *    in the view file path;关键字存在,则用对应值替换给定的视图文件路径中对应的部分
     27  * 3. It will then check if the updated view file exists or not. If so, that file will be used
     28  *    to replace the original view file.检查替换后的路径对应的文件是否存在,存在就替换原文件
     29  * 4. If Step 2 or 3 fails, the original view file will be used.
     30  * 2和3失败的话,返回原来的路径
     31  * For example, if [[pathMap]] is `['@app/views' => '@app/themes/basic']`,
     32  * then the themed version for a view file `@app/views/site/index.php` will be
     33  * `@app/themes/basic/site/index.php`.
     34  *
     35  * It is possible to map a single path to multiple paths. For example,
     36  *
     37  * ~~~
     38  * 'pathMap' => [
     39  *     '@app/views' => [
     40  *         '@app/themes/christmas',
     41  *         '@app/themes/basic',
     42  *     ],
     43  * ]
     44  * ~~~
     45  *
     46  * In this case, the themed version could be either `@app/themes/christmas/site/index.php` or
     47  * `@app/themes/basic/site/index.php`. The former has precedence over the latter if both files exist.
     48  *
     49  * To use a theme, you should configure the [[View::theme|theme]] property of the "view" application
     50  * component like the following:
     51  *
     52  * ~~~
     53  * 'view' => [
     54  *     'theme' => [
     55  *         'basePath' => '@app/themes/basic',
     56  *         'baseUrl' => '@web/themes/basic',
     57  *     ],
     58  * ],
     59  * ~~~
     60  *
     61  * The above configuration specifies a theme located under the "themes/basic" directory of the Web folder
     62  * that contains the entry script of the application. If your theme is designed to handle modules,
     63  * you may configure the [[pathMap]] property like described above.
     64  *
     65  * @property string $basePath The root path of this theme. All resources of this theme are located under this
     66  * directory.
     67  * @property string $baseUrl The base URL (without ending slash) for this theme. All resources of this theme
     68  * are considered to be under this base URL. This property is read-only.
     69  *
     70  * @author Qiang Xue <qiang.xue@gmail.com>
     71  * @since 2.0
     72  */
     73 class Theme extends Component
     74 {
     75     /**
     76      * @var array the mapping between view directories and their corresponding themed versions.
     77      * This property is used by [[applyTo()]] when a view is trying to apply the theme.
     78      * Path aliases can be used when specifying directories.
     79      * 路径映射属性 设置替换映射关系
     80      * If this property is empty or not set, a mapping [[Application::basePath]] to [[basePath]] will be used.
     81      */
     82     public $pathMap;
     83 
     84     private $_baseUrl;//设置要访问资源的url
     85 
     86     /**
     87      * @return string the base URL (without ending slash) for this theme. All resources of this theme are considered
     88      * to be under this base URL. 返回当前主题的基础链接,其他资源都在链接里
     89      */
     90     public function getBaseUrl()
     91     {
     92         return $this->_baseUrl;
     93     }
     94 
     95     /**
     96      * @param $url string the base URL or path alias for this theme. All resources of this theme are considered
     97      * to be under this base URL. 设置基础链接
     98      */
     99     public function setBaseUrl($url)
    100     {
    101         $this->_baseUrl = rtrim(Yii::getAlias($url), '/');
    102     }
    103 
    104     private $_basePath;//根路径
    105 
    106     /**
    107      * @return string the root path of this theme. All resources of this theme are located under this directory.
    108      * 得到当前主题的根路径
    109      * @see pathMap
    110      */
    111     public function getBasePath()
    112     {
    113         return $this->_basePath;
    114     }
    115 
    116     /**
    117      * @param string $path the root path or path alias of this theme. All resources of this theme are located
    118      * under this directory. 设置当前主题根路径
    119      * @see pathMap
    120      */
    121     public function setBasePath($path)
    122     {
    123         $this->_basePath = Yii::getAlias($path);
    124     }
    125 
    126     /**
    127      * Converts a file to a themed file if possible. 将一个文件替换主题文件
    128      * If there is no corresponding themed file, the original file will be returned.
    129      * 没有相应的主题文件,返回原文件。
    130      * @param string $path the file to be themed
    131      * @return string the themed file, or the original file if the themed version is not available.
    132      * @throws InvalidConfigException if [[basePath]] is not set
    133      */
    134     public function applyTo($path)
    135     {
    136         $pathMap = $this->pathMap; //取得路径映射
    137         if (empty($pathMap)) {//没有设置值 抛出异常
    138             if (($basePath = $this->getBasePath()) === null) {
    139                 throw new InvalidConfigException('The "basePath" property must be set.');
    140             }
    141             //设置值为[模块根路径=>主题根路径]的形式
    142             $pathMap = [Yii::$app->getBasePath() => [$basePath]];
    143         }
    144 
    145         $path = FileHelper::normalizePath($path);//对路径中的"/".""进行统一
    146 
    147         foreach ($pathMap as $from => $tos) {
    148             //映射数组中的来源
    149             $from = FileHelper::normalizePath(Yii::getAlias($from)) . DIRECTORY_SEPARATOR;
    150             if (strpos($path, $from) === 0) {//如果在$path中有可替换的旧值
    151                 $n = strlen($from);
    152                 foreach ((array) $tos as $to) {
    153                     $to = FileHelper::normalizePath(Yii::getAlias($to)) . DIRECTORY_SEPARATOR;
    154                     $file = $to . substr($path, $n);//把$path中的$from替换为$to
    155                     if (is_file($file)) {
    156                         return $file; //是文件直接返回
    157                     }
    158                 }
    159             }
    160         }
    161 
    162         return $path;
    163     }
    164 
    165     /**
    166      * Converts a relative URL into an absolute URL using [[baseUrl]].
    167      * 将一个相对URL转换为绝对URL
    168      * @param string $url the relative URL to be converted.要转换的相对URL
    169      * @return string the absolute URL  替换后的绝对URL
    170      * @throws InvalidConfigException if [[baseUrl]] is not set
    171      */
    172     public function getUrl($url)
    173     {
    174         if (($baseUrl = $this->getBaseUrl()) !== null) {//URL存在,进行转换
    175             return $baseUrl . '/' . ltrim($url, '/');
    176         } else {//不存在抛出异常
    177             throw new InvalidConfigException('The "baseUrl" property must be set.');
    178         }
    179     }
    180 
    181     /**
    182      * Converts a relative file path into an absolute one using [[basePath]].
    183      * 通过相对路径生成绝对路径
    184      * @param string $path the relative file path to be converted. 要转换的相对文件路径。
    185      * @return string the absolute file path 转换后的绝对路径
    186      * @throws InvalidConfigException if [[baseUrl]] is not set
    187      */
    188     public function getPath($path)
    189     {
    190         if (($basePath = $this->getBasePath()) !== null) {
    191             //返回拼接的路径
    192             return $basePath . DIRECTORY_SEPARATOR . ltrim($path, '/\');
    193         } else {
    194             throw new InvalidConfigException('The "basePath" property must be set.');
    195         }
    196     }
    197 }
  • 相关阅读:
    Dual Boot WINDOWS 10 and KALI LINUX Easily STEP BY STEP GUIDE截图
    【Head First Servlets and JSP】笔记8:监听者
    【网络】TCP的流量控制
    【Nginx】I/O多路转接之select、poll、epoll
    【Nginx】ngx_event_core_module事件模块
    【网络】TCP协议
    【网络】运输层
    【APUE】进程间通信之FIFO
    【APUE】文件I/O
    【c++】c++一些基础面试题
  • 原文地址:https://www.cnblogs.com/dragon16/p/5595122.html
Copyright © 2011-2022 走看看