Asset.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. /*
  3. * FecShop file.
  4. *
  5. * @link http://www.fecshop.com/
  6. * @copyright Copyright (c) 2016 FecShop Software LLC
  7. * @license http://www.fecshop.com/license/
  8. */
  9. namespace fecshop\services\page;
  10. use fecshop\services\Service;
  11. use Yii;
  12. /**
  13. * page asset services. Yii2的Asset部分,这里对这个功能做了一定的重构
  14. * @author Terry Zhao <2358269014@qq.com>
  15. * @since 1.0
  16. */
  17. class Asset extends Service
  18. {
  19. public $cssOptions = [];
  20. public $jsOptions = [];
  21. public $jsVersion = 1; //?v=115
  22. public $cssVersion = 1;
  23. //?v=115
  24. // 【这个字段已经废弃,请使用$baseUrl,设置】js 和 css 如果想用独立的域名,可以在这里设置相应的域名。
  25. //public $jsCssDomain;
  26. /**
  27. * 在模板路径下的相对文件夹。
  28. * 譬如模板路径为@fecshop/app/theme/base/front
  29. * 那么js,css路径默认为@fecshop/app/theme/base/front/assets.
  30. */
  31. public $defaultDir = 'assets';
  32. /**
  33. * @var string the root directory storing the published asset files.
  34. * 譬如设置为:'@appimage/assets',也可以将 @appimage 换成绝对路径
  35. */
  36. public $basePath = '@webroot/assets';
  37. /**
  38. * @var string the base URL through which the published asset files can be accessed.
  39. * 可以将 @web 换成域名 , 譬如 `http:://www/fecshop.com/assets`
  40. * 这样就可以将js和css文件使用独立的域名了【把域名对应的地址对应到$basePath】。
  41. */
  42. public $baseUrl = '@web/assets';
  43. // 是否每次访问都强制复制css js img等文件到发布地址,true代表每次访问都发布
  44. // 一般开发环境用true,线上用false。当线上更新jscss文件,可以清空assets发布路径下的文件的方式来更新
  45. public $forceCopy = true;
  46. /**
  47. * 文件路径默认放到模板路径下面的assets里面.
  48. */
  49. protected function actionRegister($view)
  50. {
  51. if ($this->basePath) {
  52. $view->assetManager->basePath = Yii::getAlias($this->basePath);
  53. }
  54. if ($this->baseUrl) {
  55. $view->assetManager->baseUrl = $this->baseUrl;
  56. }
  57. $view->assetManager->forceCopy = $this->forceCopy;
  58. $assetArr = [];
  59. $themeDir = Yii::$service->page->theme->getThemeDirArr();
  60. if (is_array($themeDir) && !empty($themeDir)) {
  61. if (is_array($this->jsOptions) && !empty($this->jsOptions)) {
  62. foreach ($this->jsOptions as $jsOption) {
  63. if (isset($jsOption['js']) && is_array($jsOption['js']) && !empty($jsOption['js'])) {
  64. foreach ($jsOption['js'] as $jsPath) {
  65. foreach ($themeDir as $dir) {
  66. $dir = $dir.'/'.$this->defaultDir.'/';
  67. $jsAbsoluteDir = $dir.$jsPath;
  68. if (file_exists($jsAbsoluteDir)) {
  69. $assetArr[$dir]['jsOptions'][] = [
  70. 'js' => $jsPath,
  71. 'options' => isset($jsOption['options']) ? $this->initOptions($jsOption['options']) : null,
  72. ];
  73. break;
  74. }
  75. }
  76. }
  77. }
  78. }
  79. }
  80. if (is_array($this->cssOptions) && !empty($this->cssOptions)) {
  81. foreach ($this->cssOptions as $cssOption) {
  82. if (isset($cssOption['css']) && is_array($cssOption['css']) && !empty($cssOption['css'])) {
  83. foreach ($cssOption['css'] as $cssPath) {
  84. foreach ($themeDir as $dir) {
  85. $dir = $dir.'/'.$this->defaultDir.'/';
  86. $cssAbsoluteDir = $dir.$cssPath;
  87. if (file_exists($cssAbsoluteDir)) {
  88. $assetArr[$dir]['cssOptions'][] = [
  89. 'css' => $cssPath,
  90. 'options' => isset($cssOption['options']) ? $this->initOptions($cssOption['options']) : null,
  91. ];
  92. break;
  93. }
  94. }
  95. }
  96. }
  97. }
  98. }
  99. }
  100. if (!empty($assetArr)) {
  101. $jsV = '?v='.$this->jsVersion;
  102. $cssV = '?v='.$this->cssVersion;
  103. foreach ($assetArr as $fileDir=>$as) {
  104. $cssConfig = $as['cssOptions'];
  105. $jsConfig = $as['jsOptions'];
  106. $publishDir = $view->assetManager->publish($fileDir);
  107. if (!empty($jsConfig) && is_array($jsConfig)) {
  108. foreach ($jsConfig as $c) {
  109. //$view->registerJsFile($this->jsCssDomain.$publishDir[1].'/'.$c['js'].$jsV, $c['options']);
  110. $view->registerJsFile($publishDir[1].'/'.$c['js'].$jsV, $c['options']);
  111. }
  112. }
  113. if (!empty($cssConfig) && is_array($cssConfig)) {
  114. foreach ($cssConfig as $c) {
  115. //$view->registerCssFile($this->jsCssDomain.$publishDir[1].'/'.$c['css'].$cssV, $c['options']);
  116. $view->registerCssFile($publishDir[1].'/'.$c['css'].$cssV, $c['options']);
  117. }
  118. }
  119. }
  120. }
  121. }
  122. protected function initOptions($options)
  123. {
  124. if (isset($options['position'])) {
  125. if ($options['position'] == 'POS_HEAD') {
  126. $options['position'] = \yii\web\View::POS_HEAD;
  127. } elseif ($options['position'] == 'POS_END') {
  128. $options['position'] = \yii\web\View::POS_END;
  129. }
  130. }
  131. return $options;
  132. }
  133. }