2015-10-22 10:52:17 5180次浏览 1条回答 0 悬赏 10 金钱

假如我的网站网址是 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上的?

  • 回答于 2015-10-22 11:18 举报

    assetManager 写个继承类,改这个继承类就可以了。配置文件中,配置初始化继承类, 就不会破坏扩展代码。
    不过有个问题。 我记忆中好像 assets/277121a9 这个路径不是每次生成都会变的吗?那你的CDN有什么意义?

    5 条回复
    回复于 2015-10-22 11:23 回复

    具体怎么写这个继承类呢?我就是不会写才问的

    只要不改php代码 不清空服务器本地/assets文件 assets/277121a9 这种路径就不变

    回复于 2015-10-22 11:28 回复

    'request'=>array(
    'class' => 'cfg_common.components.HttpRequest',
                'enableCsrfValidation'=>false,
                'enableCookieValidation'=>false,), 
    
    回复于 2015-10-22 11:29 回复

    这个HttpRequest是复制一份出来,放在components目录下的。

    回复于 2015-10-22 12:39 回复

    你这是 HttpRequest 不是我要的
    有没有人能帮我写出来的 我愿意付费

    回复于 2015-10-23 10:08 回复

    你把框架的assetManager复制一份出来,放在components下,改一下代码,然后像上面我给的那个例子那样配置就行了。实在不会付费帮你写也可以。361657055@qq.com

您需要登录后才可以回答。登录 | 立即注册
ypchen
试用期

ypchen

注册时间:2015-07-27
最后登录:2016-10-10
在线时长:1小时22分
  • 粉丝0
  • 金钱20
  • 威望0
  • 积分30

热门问题