yii2中的资源....
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,再使用挂件