這篇文章主要介紹了PHP的Yii框架中對前端資源包的使用,列舉了Yii中一些JavaScript和CSS常用資源,需要的朋友可以參考下
Yii中的資源是和Web頁面相關的文件,可為CSS文件,JavaScript文件,圖片或影片等, 資源放在Web可存取的目錄下,直接被Web伺服器呼叫。
透過程式自動管理資源好一點,例如,當你在頁面中使用yii\jui\DatePicker 小工具時, 它會自動包含所需的CSS和JavaScript文件,而不是要求你手動找到這些文件並包含, 當你升級小工具時,它會自動使用新版本的資源文件,在本教學中,我們會詳述Yii提供的強大的資源管理功能。
資源包
Yii在資源包中管理資源,資源包簡單的說就是放在一個目錄下的資源集合, 當在視圖中註冊一個資源包,在渲染Web頁面時會包含包中的CSS和JavaScript檔案。
定義資源包
資源包指定為繼承yii\web\AssetBundle的PHP類,包名為可自動載入的PHP類名, 在資源包類中,要指定資源所在位置,包含哪些CSS和JavaScript檔案以及和其他套件的依賴關係。
如下程式碼定義基礎應用程式範本使用的主要資源包:
<?php namespace app\assets; use yii\web\AssetBundle; class AppAsset extends AssetBundle { public $basePath = '@webroot'; public $baseUrl = '@web'; public $css = [ 'css/site.css', ]; public $js = [ ]; public $depends = [ 'yii\web\YiiAsset', 'yii\bootstrap\BootstrapAsset', ]; }
如上AppAsset 類別指定資源檔案放在@webroot 目錄下,對應的URL為@web,資源包包含一個CSS文件css/site.css,沒有JavaScript文件, 依賴其他兩個包yii\web\YiiAsset 和yii\bootstrap\BootstrapAsset, 關於yii\web\AssetBundle 的屬性的更多詳細如下所述:
yii\web\AssetBundle::sourcePath: 指定套件包含資源檔案的根目錄, 當根目錄無法被Web存取時該屬性應設置,否則,應設定yii\web\AssetBundle::basePath 屬性和yii\web\AssetBundle::baseUrl。路徑別名可在此處使用;
yii\web\AssetBundle::basePath: 指定包含資源包中資源檔案並可Web存取的目錄,當指定yii\web\AssetBundle ::sourcePath 屬性, 資源管理器會發佈包的資源到一個可Web存取並覆寫該屬性, 如果你的資源檔案在一個Web可存取目錄下,應設定該屬性,這樣就不用再發佈了。路徑別名 可在此使用。
yii\web\AssetBundle::baseUrl: 指定對應到yii\web\AssetBundle::basePath目錄的URL, 和yii\web\AssetBundle::basePath 類似,如果你指定yii\web\AssetBundle::sourcePath 屬性, 資源管理器會發佈這些資源並覆寫該屬性,路徑別名可在此處使用。
yii\web\AssetBundle::js: 一個包含該資源包JavaScript檔案的數組,注意正斜線"/"應作為目錄分隔符, 每個JavaScript檔案可指定為以下兩種格式之一:
相對路徑表示為本機JavaScript檔案(如js/main.js),檔案實際的路徑在該相對路徑前加上yii\web\AssetManager::basePath,檔案實際的URL在該路徑前加上yii\web\AssetManager::baseUrl。
絕對URL位址表示為外部JavaScript文件,如http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js 或// ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js.
yii\web\AssetBundle::css: 一個包含該資源包JavaScript檔案的數組,該數組格式和yii\web\AssetBundle::js 相同。
yii\web\AssetBundle::depends: 一個列出該資源包依賴的其他資源包(後兩節有詳細介紹)。
yii\web\AssetBundle::jsOptions: 當呼叫yii\web\View::registerJsFile()註冊該套件 每個 JavaScript檔案時, 指定傳遞到該方法的選項。
yii\web\AssetBundle::cssOptions: 當呼叫yii\web\View::registerCssFile()註冊該套件 每個 css檔案時, 指定傳遞到該方法的選項。
yii\web\AssetBundle::publishOptions: 當呼叫yii\web\AssetManager::publish()發布該套件資源檔案到Web目錄時指定傳遞到該方法的選項,僅在指定了yii\web\AssetBundle::sourcePath屬性時使用。
資源位置
資源根據它們的位置可以分為:
來源資源: 資源檔案與PHP原始碼放在一起,不能被Web直接訪問,為了使用這些來源資源,它們要拷貝到一個可Web訪問的Web目錄中成為發布的資源,這個過程稱為發布資源,隨後會詳細介紹。
發佈資源: 資源檔案放在可透過Web直接存取的Web目錄中;
外部資源: 資源檔案放在你的Web應用不同的Web伺服器上;
當定義資源包類別時候,如果你指定了yii\web\AssetBundle::sourcePath 屬性,就表示任何使用相對路徑的資源會被當作來源資源;如果沒有指定該屬性,就表示這些資源為發佈資源(因此應指定yii\web\ AssetBundle::basePath 和yii\web\AssetBundle::baseUrl 讓Yii知道它們的位置)。
推荐将资源文件放到Web目录以避免不必要的发布资源过程,这就是之前的例子指定 yii\web\AssetBundle::basePath 而不是 yii\web\AssetBundle::sourcePath.
对于 扩展来说,由于它们的资源和源代码都在不能Web访问的目录下, 在定义资源包类时必须指定yii\web\AssetBundle::sourcePath属性。
注意: yii\web\AssetBundle::sourcePath 属性不要用@webroot/assets,该路径默认为 yii\web\AssetManager资源管理器将源资源发布后存储资源的路径,该路径的所有内容会认为是临时文件, 可能会被删除。
资源依赖
当Web页面包含多个CSS或JavaScript文件时,它们有一定的先后顺序以避免属性覆盖, 例如,Web页面在使用jQuery UI小部件前必须确保jQuery JavaScript文件已经被包含了, 我们称这种资源先后次序称为资源依赖。
资源依赖主要通过yii\web\AssetBundle::depends 属性来指定, 在AppAsset 示例中,资源包依赖其他两个资源包: yii\web\YiiAsset 和 yii\bootstrap\BootstrapAsset 也就是该资源包的CSS和JavaScript文件要在这两个依赖包的文件包含 之后 才包含。
资源依赖关系是可传递,也就是人说A依赖B,B依赖C,那么A也依赖C。
资源选项
可指定yii\web\AssetBundle::cssOptions 和 yii\web\AssetBundle::jsOptions 属性来自定义页面包含CSS和JavaScript文件的方式, 这些属性值会分别传递给 yii\web\View::registerCssFile() 和 yii\web\View::registerJsFile() 方法, 在视图 调用这些方法包含CSS和JavaScript文件时。
注意: 在资源包类中设置的选项会应用到该包中 每个 CSS/JavaScript 文件,如果想对每个文件使用不同的选项, 应创建不同的资源包并在每个包中使用一个选项集。
例如,只想IE9或更高的浏览器包含一个CSS文件,可以使用如下选项:
public $cssOptions = ['condition' => 'lte IE9'];
这会是包中的CSS文件使用以下HTML标签包含进来:
<!--[if lte IE9]> <link rel="stylesheet" href="path/to/foo.css"> <![endif]-->
为链接标签包含
public $cssOptions = ['noscript' => true];
为使JavaScript文件包含在页面head区域(JavaScript文件默认包含在body的结束处)使用以下选项:
public $jsOptions = ['position' => \yii\web\View::POS_HEAD];
Bower 和 NPM 资源
大多数 JavaScript/CSS 包通过Bower 和/或 NPM管理, 如果你的应用或扩展使用这些包,推荐你遵循以下步骤来管理库中的资源:
修改应用或扩展的 composer.json 文件将包列入require 中, 应使用bower-asset/PackageName (Bower包) 或 npm-asset/PackageName (NPM包)来对应库。
创建一个资源包类并将你的应用或扩展要使用的JavaScript/CSS 文件列入到类中, 应设置 yii\web\AssetBundle::sourcePath 属性为@bower/PackageName 或 @npm/PackageName, 因为根据别名Composer会安装Bower或NPM包到对应的目录下。
注意: 一些包会将它们分布式文件放到一个子目录中,对于这种情况,应指定子目录作为 yii\web\AssetBundle::sourcePath属性值,例如,yii\web\JqueryAsset使用 @bower/jquery/dist 而不是 @bower/jquery。
使用资源包
为使用资源包,在视图中调用yii\web\AssetBundle::register()方法先注册资源, 例如,在视图模板可使用如下代码注册资源包:
use app\assets\AppAsset; AppAsset::register($this); // $this 代表视图对象
如果在其他地方注册资源包,应提供视图对象,如在 小部件 类中注册资源包, 可以通过 $this->view 获取视图对象。
当在视图中注册一个资源包时,在背后Yii会注册它所依赖的资源包,如果资源包是放在Web不可访问的目录下,会被发布到可访问的目录, 后续当视图渲染页面时,会生成这些注册包包含的CSS和JavaScript文件对应的 和