求问如何局部配置AssetManager [ 1.1 版本 ]
假如我的网站网址是 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上的?
共 1 个回答
ypchen
注册时间:2015-07-27
最后登录:2016-10-10
在线时长:1小时22分
最后登录:2016-10-10
在线时长:1小时22分
- 粉丝0
- 金钱20
- 威望0
- 积分30