求问如何局部配置AssetManager

weixin_38076910 2019-09-11 02:46:50
假如我的网站网址是 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上的?
...全文
28 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38146045 2019-09-11
  • 打赏
  • 举报
回复
assetManager 写个继承类,改这个继承类就可以了。配置文件中,配置初始化继承类, 就不会破坏扩展代码。 不过有个问题。 我记忆中好像 assets/277121a9 这个路径不是每次生成都会变的吗?那你的CDN有什么意义?

476

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧