1.模板文件中访问view和controller,view : $this,controller :$this->context

模板文件显示流程:

  • 1.控制器会在render中,把控制器本身,模板文件传给view
  • 2.呈现模板文件,首先view会查找主题,主题如果拥有模板文件,则优先使用主题内模板文件.并将模板文件赋值给变量$content
  • 3.呈现布局文件,同样查找主题,并将$content作为变量导入
  • 4.引入模板文件时,是发生在view中,所以$this就是view
  • 5.路径查找是根据controller的id...所以模块中的controllerMap如果要显示view..则要重新设置控制器id.
  • 6.主题的本质就是更改viewpath的路径..
    'components' => [
        'view' => [
            'theme' => [
                'pathMap' => ['@app/views' => '@app/themes/basic'],
                'baseUrl' => '@web/themes/basic',
            ],
        ],
    ],

2.注册资源

registerAssetBundle
常用的方法是在模板文件中,\frontend\assets\AppAsset::register($this);其中$this就是view

  • 1.首先会查找view的$assetBundles中是否存在该bundle,不存在则实例化,并补全其中js和css的basePath
  • 2.查看依赖是否存在于$assetBundles中,并发布..注意: 由于已发布的bundle都会保存于$assetBundles中,所以不会重复发布已存在的bundle
  • 3.根据位置,重新设置bundle和依赖的jsOptions['position']
  • 4.在使用endBody()的时候会注册$bundle中的css和js.
registerJsFile
根据位置将js文件保存到view的jsFiles中 $this->jsFiles[$position][$key] key如果是null则为该js脚本文件路径
registerCss
根据将css文件保存到view的cssFiles中 $this->cssFiles[$key] key如果是null则为该js脚本文件路径

endPage中..

  echo strtr($content, [
self::PH_HEAD => $this->renderHeadHtml(), //这里会替换$this->head()的字符窜为css
self::PH_BODY_BEGIN => $this->renderBodyBeginHtml(),//替换$this->beginBody()的字符窜为POS_BEGIN的js
self::PH_BODY_END => $this->renderBodyEndHtml($ajaxMode),//替换$this->endBody()的字符窜为POS_END的js
]);
beginBody,endBody,head.除了会输出替代的字符窜..还会触发一个事件..所以要改什么的可以作为事件进行处理.endBody还会注册bundle中的js和css..endpage则会替换这些并触发一个事件

AssetBundle

AssetBundle->register 将bundle注册到$view的$assetBundles中,同时处理依赖和文件位置

AssetBundle->publish()

  • 如果sourcePath存在,则发布该目录下的内容并返回发布的路径设置到basePath和baseUrl上,不存在sourcePath的话则不用发布.直接使用baseurl和basepath
  • 补全js和css的basePath并根据后缀名做转换

AssetBundle->registerAssetFiles 将css和js使用$view->registerXXFile.注册到视图中

AssetManager

  • 1.assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问protected下面的文件 ,但是我们又希望将module单独出来,所以需要使用发布,即将一个目录下的文件复制一份到assets下面方便通过url访问
  • 2.如果一个模块需要添加使用资源,直接从webroot中引用添加即可。
    但是试图创建一个模块能够在任何地方引用,且资源独立并能够避免命名冲突 。
    你如何保证你的文件名不会与一些零散的应用程序的尝试使用相同名称的文件冲突,对于js,images,css也一样。
    通过AssetManager,Yii::$app->assetManager能够自动的将私有资源publish到公共目录下webroot/assets
  • 3.第二个参数强制更新,开发中设置为true...产品中改为false..可用yii_debug判断

getBundle---会返回bundle对象,并发布
getConverter -- 资源转换器

publish--- 将发布的文件或者目录.copy到assets目录下.并返回地址

//先发布..后注册
$path = ""
$path = AssetManager->publish($path)
$this->registerCss($path);
//所以衍生出了assetBundle的使用

这种使用注册css和js的好处.同一个layout,在不同的页面可以有不同js和css...延迟注册了jscss

比如..a页面需要a.js,b页面需要b.js

在同一个布局下面..不适用注册的方式:

会把head部分</header>放在页面模板中,并在之前加载需要的js..这就破坏了布局的可读性.

使用这种注册方式,则不会..

布局统一,将需要的js和css注册在一起,最后endPage的时候一起输出..

挂件使用bundle

一般在模板文件中,先注册挂件使用js和css的bundle,再使用挂件

yii2中的资源....的更多相关文章

  1. yii2之前端资源引入

     PS:因新项目后端使用yii2框架,不在使用纯html模板的方式搭建页面(前后端不分离模式)使用yii2的内置boostart封装模板,遂研究了一番yii2 通过yii2官方下载的基础文件结构 其中 ...

  2. yii2中如何使用modal弹窗之基本使用

    作者:白狼 出处:http://www.manks.top/yii2_modal_baseuse.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, ...

  3. Pyqt 获取打包二进制文件中的资源

    记得有一次打开一个单独exe程序,点击btn中的一个帮助说明按钮,在同级目录下就多出一个help.chm 文件并自动打开. 那这个exe肯定是把help.chm 打包到exe中,当我触发“帮助”按钮的 ...

  4. Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name ...

  5. PHP在yii2中封装SuperSlide 幻灯片编写自己的SuperSlideWidget的例子

    因为近期给朋友公司做个门户网站,把荒置了6.7年的PHP又重新拾起,发现PHP这些年兴旺多了,很多新的东西看的不明不白,研究了几个框架ZendFramework.thinkphp.Symfony.yi ...

  6. [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_name       cu ...

  7. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  8. Windows Store App 全球化:引用分离资源文件中的资源

    大部分应用程序仅需要单个默认资源文件,例如Strings/zh-CN/Resources.resw,但是在某些应用程序中,最好将资源分离到多个资源文件中,以便更好地组织资源内容,这样就需要考虑如何引用 ...

  9. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

随机推荐

  1. [Android Pro] Android--Sensor传感器

    Android提供了对设备传感器的支持,只要Android设备的硬件提供了这些传感器,Android应用可以通过传感器 来获取设备的外界条件,包括手机的运行状态.当前摆放的方向等.Android系统还 ...

  2. poj 3258 River Hopscotch 题解

    [题意] 牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离, 现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值 ...

  3. MySQL 中文乱码解决

    測试环境:服务端和client均为win7,MySql数据库.表字符集为utf-8,字段字符集与表一致. 1.使用mysql命令进行操作时的乱码问题解决. (1)设置当前字符集 set names g ...

  4. @Redis Desktop Manager无法连接虚拟机中启动的redis服务问题解决

    Redis Desktop Manager下载地址 https://redisdesktop.com/download 安装好以后连接linux服务器上的Redis服务器错误: 问题排查: 1.检查R ...

  5. OpenCV学习(6) 文件和Mat之间的数据交换

          有时候为了便于调试算法,我们需要从文本文件或二进制文件中读取数据,并把数据放到相应的矩阵中去.我们通常可以通过下面的函数实现.   1.从二进制文件中读取数据.      新建一个txt文 ...

  6. 解析Java的JNI编程中的对象引用与内存泄漏问题

    JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native ...

  7. 解决Windows server 2012 R2 系统使用IIS8浏览Asp程序出现"An error occurred on the server when processing the URL"错误

    进入IIS并将ASP里的“Send Error To Browser”设置为True后点击Appley保存即可 原因是IIS里的Asp设置禁用上当错误信息发送给浏览器,只要启用即可 如果没有Asp选项 ...

  8. (转)Akka学习笔记(二):Actor Systems

    Akka学习笔记(二):Actor Systems 图中表示的是一个Actor System,它显示了在这个Actor System中最重要实体之间的关系. 什么是actor,是一个封装了状态和行为的 ...

  9. 【cocos2d-x 3.7 飞机大战】 决战南海I (七) 控制器的实现

    控制器中的功能并不多,主要是以下这些 //对玩家分数的操作 CC_SYNTHESIZE_READONLY(SaveData *, m_saveData, SaveData); void update( ...

  10. public类型中internal成员

    今天遇到一问题,找到下面的两篇文章,研究比较深入,特转了一下, 最近除了搞ASP.NET MVC之外,我也在思考一些编程实践方面的问题.昨天在回家路上,我忽然对一个问题产生了较为清晰的认识.或者说,原 ...