求问如何局部配置AssetManager

新手提问 · yanping · 于 3年前 发布 · 2377 次阅读

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

共收到 2 条回复 Yii1 AssetManager
forecho#13年前 0 个赞

Yii2 好像有这个 http://www.yiiframework.com/doc-2.0/guide-structure-assets.html#customizing-asset-bundles

Yii1 的话,真不知道怎么处理?

extension 不能再调用的时候传参数吗?

yanping#23年前 0 个赞

@forecho #1楼 assets不是调用extension时传进去的参数 是extension 运行的时候 调用的assetManager

Yii1没有类似的接口

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册