1、自定义依赖包:
- return [
- 'components' => [
- 'assetManager' => [
- /*重新定义资源包*/
- 'bundles' => [
- //'yii\bootstrap\BootstrapAsset' => false, //禁用资源包
- 'yii\bootstrap\BootstrapAsset' => [
- 'sourcePath' => '@frontend/themes/jiancai/static',
- 'css'=>[
- 'css/bootstrap.css'
- ],
- 'js' => [
- 'js/bootstrap.min.js'
- ]
- ],
- ],
- ],
YII中很多组件依赖于bootstrap,如果依赖包与本身的有出入,可自定义一下,不使用框架本身的,也可以禁用资源包
另一种方式,使用自定义的类直接覆盖掉:
在config下的bootstrap中这样写,用自定义的类覆盖指定的依赖包
- Yii::$classMap['yii\helpers\Html'] = '@common/yii/helpers/Html.php';
注册CSS JS 位置 / 注册css js
- public $jsOptions = ['position' => \yii\web\View::POS_HEAD];
这一句通常不需要,将JS注册进头部
完整的一次asset:
- <?php
- namespace frontend\themes\jiancai\assets;
- use yii\web\AssetBundle;
- class AppAsset extends AssetBundle
- {
- public $sourcePath = '@jiancai/static';
- public $css = [
- 'css/theme.css'
- ];
- public $js = [
- 'js/common.js'
- ];
- public $depends = [
- 'yii\web\YiiAsset',
- 'yii\bootstrap\BootstrapAsset',
- 'yii\jui\JuiAsset',
- 'common\assets\LayuiAsset'//自定义
- ];
- }
视图中使用:
- use frontend\themes\jiancai\assets\AppAsset;
- AppAsset::register($this);
在页面中单独写样式
- $cssString = ".gray-bg{color:red;}";
- $this->registerCss($cssString);
在页面中单独写JS(使用数据块)
- <div id="mybutton">点我弹出OK</div>
- <?php $this->beginBlock('test') ?>
- $(function($) {
- $('#mybutton').click(function() {
- alert('OK');
- });
- });
- <?php $this->endBlock() ?>
- <?php $this->registerJs($this->blocks['test'], \yii\web\View::POS_END); ?>
将JS 注册到页面底部(eot空格删掉)
- <?php
- $js = <<<'EOT'
- layui.use('form', function(){
- var form = layui.form();
- //监听提交
- form.on('submit(formDemo)', function(data){
- layer.msg(JSON.stringify(data.field));
- return false;
- });
- });
- EOT;
- $this->registerJs($js, \yii\web\View::POS_END);
或者:
- <?php
- $this->registerJs(
- '$("document").ready(function(){
- $("#login-form").validate({
- errorElement : "small",
- errorClass : "error",
- rules: {
- "AgNav[nav_cn]": {
- required: true,
- },
- },
- messages:{
- "AgNav[nav_cn]" : {
- required : "此字段不能为空.",
- },
- }
- });
- });'
- );
- ?>
在eot中使用变量:
- function usage() {
- global $argv;
- $cmd = $argv[0];
- echo <<<EOF
- Usage:
- $cmd [--flavor=<flavor>] [--full] [file.md]
- Examples:
- $cmd README.md > README.html
- ....
- EOF;
- exit(1);
- }
4.视图中引入CSS/JS文件(引用物理路径的资源包)
如果是物理路径,需要先发布:
- list(,$url) = \Yii::$app->assetManager->publish("@jiancai/static/js");
- $this->registerJsFile($url.'/index.js', ['depends' => [frontend\themes\jiancai\assets\AppAsset::className()]]);
或:
- //定义按需加载JS方法,注意加载顺序在最后
- public static function addScript($view, $jsfile) {
- $view->registerJsFile($jsfile, [AppAsset::className(), 'depends' => 'backend\assets\AppAsset']);
- }
- //定义按需加载css方法,注意加载顺序在最后
- public static function addCss($view, $cssfile) {
- $view->registerCssFile($cssfile, [AppAsset::className(), 'depends' => 'backend\assets\AppAsset']);
- }
视图中使用如下:
- AppAsset::register($this);
- //只在该视图中使用非全局的jui
- AppAsset::addScript($this,'@web/js/jquery-ui.custom.min.js');
- //AppAsset::addCss($this,'@web/css/font-awesome/css/font-awesome.min.css');
此外注意:在上面的addScript方法中,如果没有 ’depends‘=>’xxx‘ ,此处加载的顺序将会颠倒。
或:
不需要在资源包管理器中定义方法,只要在视图页面直接引入即可
- AppAsset::register($this);
- //css定义一样
- $this->registerCssFile('@web/css/font-awesome.min.css',['depends'=>['backend\assets\AppAsset']]);
- //$this->registerCssFile('@web/css/index-css.css');
- $this->registerJsFile('@web/js/jquery-ui.custom.min.js',['depends'=>['backend\assets\AppAsset']]);
- //$this->registerJsFile('@web/js/jquery-2.1.1.js');
- //如下position是让定义CSS/JS出现的位置
- //$this->registerJsFile('@web/js/jquery-ui.custom.min.js',['depends'=>['backend\assets\AppAsset'],'position'=>$this::POS_HEAD]);
- <?= Html::cssFile('@web/css/ie5.css', ['condition' => 'IE 5']) ?>
在控制器controller中指定资源包,可以使用同一个布局文件:
- public function actionIndex()
- {
- $this->layout = "@backend/views/layouts/base";
- $view = $this->getView();
- $assets = \backend\modules\IntelligentMonitor\layouts\environment\assets\EnvironmentBackendAssets::register($view);
- $js = <<<'EOT'
- $(".main-content").hide();
- var h = $(window).height();
- h -= 30; // 主体总高度
- $(".main-content").css({"height": h + "px","overflow":"hidden"});
- $("#dynamic-showbox .showbox").each(function () {
- // $(this).width(h);
- $(this).height(h);
- $(this).find(".quxian").css("height",h*0.7); //曲线的高度
- $(this).find(".data-box").css("height",h*0.3);
- });
- $(".main-content").height(h);
- //console.log(h);
- EOT;
- $view->registerJs($js);
- return $this->render('index');
- }
合并与压缩资源
composer组件:
https://github.com/rmrevin/yii2-minify-view
YII自带的缺少两个组件...下面做不下去了
参考资料:
http://www.yiichina.com/doc/guide/2.0/structure-assets
安装JAVA:
component中添加组件
all.css 和 all.js 为压缩合并后的文件命名,可自定义,frontend... 需要压缩的资源类
- 'components' => [
- 'assetManager' => [
- 'bundles' => [
- 'all' => [
- 'class' => 'yii\web\AssetBundle',
- 'basePath' => '@webroot/assets',
- 'baseUrl' => '@web/assets',
- 'css' => ['all.css'],
- 'js' => ['all.js'],
- ],
- 'frontend\themes\jiancai\assets\AppAsset' => ['css' => [], 'js' => [], 'depends' => ['all']],
- ],
- ],
使用 asset
命令
Yii提供一个名为asset
控制台命令来使上述操作自动处理。
为使用该命令,应先创建一个配置文件设置哪些资源包要合并以及分组方式, 可使用asset/template
子命令来生成一个模板, 然后修改模板成你想要的。
yii asset/template assets.php
该命令在当前目录下生成一个名为assets.php
的文件,文件的内容类似如下:
- <?php
- /**
- * 为控制台命令"yii asset"使用的配置文件
- * 注意在控制台环境下,一些路径别名如 '@webroot' 和 '@web' 不会存在
- * 请定义不存在的路径别名
- */
- return [
- // 为JavaScript文件压缩修改 command/callback
- 'jsCompressor' => 'java -jar compiler.jar --js {from} --js_output_file {to}',
- // 为CSS文件压缩修改command/callback
- 'cssCompressor' => 'java -jar yuicompressor.jar --type css {from} -o {to}',
- // 要压缩的资源包列表
- 'bundles' => [
- // 'yii\web\YiiAsset',
- // 'yii\web\JqueryAsset',
- ],
- // 资源包压缩后的输出
- 'targets' => [
- 'all' => [
- 'class' => 'yii\web\AssetBundle',
- 'basePath' => '@webroot/assets',
- 'baseUrl' => '@web/assets',
- 'js' => 'js/all-{hash}.js',
- 'css' => 'css/all-{hash}.css',
- ],
- ],
- // 资源管理器配置:
- 'assetManager' => [
- ],
- ];
应修改该文件的bundles
的选项指定哪些包你想要合并, 在targets
选项中应指定这些包如何分组, 如前述的可以指定一个或多个组。
Note: 由于在控制台应用别名
@webroot
and@web
不可用, 应在配置中明确指定它们。
JavaScript文件会被合并压缩后写入到js/all-{hash}.js
文件, 其中 {hash} 会被结果文件的哈希值替换。
在console控制台指定别名:
console\config\bootstrap.php
当前目录的上一级,上一级下的web目录
- <?php
- Yii::setAlias('@webroot', __DIR__ . '/../../web');
- Yii::setAlias('@web', '/');
在所有包中使用工具(例如 Closure Compiler, YUI Compressor) 来合并和压缩CSS和JavaScript文件
根据配置文件,可执行asset
命令来合并和压缩资源文件 并生成一个新的资源包配置文件assets-prod.php
:
yii asset assets.php config/assets-prod.php
生成的配置文件可以在应用配置中包含
安装JAVA