yii1.1.15如何局部配置AssetManager


假如我的网站网址是 http://example.com 使用Yii 1.1.15开发

网站用到很多extension 所以导致引用了很多js、css静态文件,这些文件都会由Yii的assetManager发布到/asstes中,然后在页面中加载,生成的页面html的head部分是这样的


 <link rel="stylesheet" type="text/css" href="/assets/747568da/plugins/code/prettify.css" />
<link rel="stylesheet" type="text/css" href="/assets/580bd910/main.css" />
<link rel="stylesheet" type="text/css" href="/assets/a9433c86/jquery.fancybox-1.3.4.css" />
<script type="text/javascript" src="/assets/277121a9/bootbox/bootbox.min.js"></script>
<script type="text/javascript" src="/assets/277121a9/notify/notify.min.js"></script>
<script type="text/javascript" src="/assets/fdf74215/jquery.yiiactiveform.js"></script>
<script type="text/javascript" src="/assets/14dea20a/WdatePicker.js"></script>
<script type="text/javascript" src="/assets/747568da/kindeditor.js"></script>
<script type="text/javascript" src="/assets/747568da/lang/zh_CN.js"></script>
<script type="text/javascript" src="/assets/747568da/plugins/code/prettify.js"></script>
<script type="text/javascript" src="/assets/580bd910/hoverCard.js"></script>

上面只是列出了一部分,还有很多文件。

这样会导致页面加载过慢,我就考虑让assetManager把这些静态文件发布到cdn空间,于是像下面这样配置main.php


 // application components
       'components'=>array(
            //这个选项就是设置assets相关的默认值
            'assetManager'=>array(
                 // 设置存放assets的文件目录位置
                  'basePath'=>'assets',
                 // 设置访问assets目录的url地址
                   'baseUrl'=>'http://cdn.example.com/assets',
                  ),
             )

这样生成的html页面的head部分就是这样的:


 <link rel="stylesheet" type="text/css" href="http://cdn.example.com/assets/747568da/plugins/code/prettify.css" />
<link rel="stylesheet" type="text/css" href="http://cdn.example.com/assets/580bd910/main.css" />
<link rel="stylesheet" type="text/css" href="http://cdn.example.com/assets/a9433c86/jquery.fancybox-1.3.4.css" />
<script type="text/javascript" src="http://cdn.example.com/assets/277121a9/bootbox/bootbox.min.js"></script>
<script type="text/javascript" src="http://cdn.example.com/assets/277121a9/notify/notify.min.js"></script>
<script type="text/javascript" src="http://cdn.example.com/assets/fdf74215/jquery.yiiactiveform.js"></script>
<script type="text/javascript" src="http://cdn.example.com/assets/14dea20a/WdatePicker.js"></script>
<script type="text/javascript" src="http://cdn.example.com/assets/747568da/kindeditor.js"></script>
<script type="text/javascript" src="http://cdn.example.com/assets/747568da/lang/zh_CN.js"></script>
<script type="text/javascript" src="http://cdn.example.com/assets/747568da/plugins/code/prettify.js"></script>
<script type="text/javascript" src="http://cdn.example.com/assets/580bd910/hoverCard.js"></script>

不过 这样又会出现问题。因为这些静态文件存放在了cdn,有些extension在运行过程中,因为使用了iframe或者js,或者别的什么原因,就会遭遇跨域的问题,无法使用。必须让extension对应的静态文件存放到example.com的服务器上才行,也就是说,html的head部分是这样的:


 <link rel="stylesheet" type="text/css" href="/assets/747568da/plugins/code/prettify.css" />
<link rel="stylesheet" type="text/css" href="http://cdn.example.com/assets/580bd910/main.css" />
<link rel="stylesheet" type="text/css" href="http://cdn.example.com/assets/a9433c86/jquery.fancybox-1.3.4.css" />
<script type="text/javascript" src="http://cdn.example.com/assets/277121a9/bootbox/bootbox.min.js"></script>
<script type="text/javascript" src="http://cdn.example.com/assets/277121a9/notify/notify.min.js"></script>
<script type="text/javascript" src="http://cdn.example.com/assets/fdf74215/jquery.yiiactiveform.js"></script>
<script type="text/javascript" src="/assets/14dea20a/WdatePicker.js"></script>
<script type="text/javascript" src="/assets/747568da/kindeditor.js"></script>
<script type="text/javascript" src="/assets/747568da/lang/zh_CN.js"></script>
<script type="text/javascript" src="/assets/747568da/plugins/code/prettify.js"></script>
<script type="text/javascript" src="http://cdn.example.com/assets/580bd910/hoverCard.js"></script>

为了实现这个目的,我不得不修改extension的代码,比如 ext.kindeditor.Kindeditor.php


 public function getAssetsPath()

   {

     $baseDir = dirname(__FILE__);
    // 原来就下一句结束
    // return Yii::app()->getAssetManager()->publish($baseDir.DIRECTORY_SEPARATOR.'assets');
    // 以下是我修改的
    $assetManager = Yii::app()->getAssetManager();
    // 先布局修改assetManager的baseUrl属性
    $assetManager->baseUrl = '/assets';
    // 发布静态资源,返回路径
    $_assetUrl = $assetManager->publish($baseDir.DIRECTORY_SEPARATOR.'assets');
    // 然后又把baseUrl改回去
    $assetManager->baseUrl= 'http://cdn.example.com/assets';
    return $_assetUrl;
  }

目的是达到了,但是破坏了原有的代码。

问题是,我能不能不修改extension的代码,就能让指定的extension使用使用服务器上的静态资源而不使用cdn上的?

yii

Aovri 9 years, 5 months ago

Your Answer