3

对 Yii 来说有点新意。我正在尝试在视图中发布资产文件夹下的所有文件。

结构是这样的:

/views/test

/views/test/assets

/views/test/assets/css

/views/test/assets/images

现在,我所做的是Yii:app()->getAssetManager()->publish( dirname( __FILE__ ) . '/assets/' );/views/test目录中发布资产文件夹。

它可以发布它们,但现在我必须调用cs()->registerCssFile包含在/views/test/assets/css. 我怎么做?

我知道 publish() 方法返回路径。这是否意味着我必须从文件夹中执行一个 foreach $file 然后cs()->registerCssFile使用返回的资产目录调用?

可能有更简单的方法,因此非常感谢任何帮助!:)

4

2 回答 2

4

我真的找到了答案!虽然registerCssFile()确实有效,但还有一个更优雅的解决方案,Yii 包!

考虑以下文件结构:

protected
\---views
   |---home
   |  \---assets
   |     |---css
   |     |  |---styles.css
   |     |  |---custom.css
   |     |  \---print.css
   |     |---js
   |     |  |---functions.js
   |     |  |---jquery.js
   |     |  \---ajax.js
   |     |---images
   |        |---img1.png
   |        |---imgn.png
   |        \---imgX.png
   \---index.php

你可以在 中声明一个这样的包index.php,注意使用 Yii 框架的点表示法basePath

$package = array(
    'basePath'    => 'application.views.home.assets',
    'css'         => array( 'styles.css' ),
    'js'          => array( 'jquery.js', 'functions.js' )
);

然后,使用 Yii 的clientScript添加和注册包。

Yii::app()->clientScript()
          ->addPackage( 'package-name', $package )
          ->registerPackage( 'package-name' );

这将做的是发布并注册包中指定的 CSS 和 JS 文件的所有内容。basePath例如,styles.csscustom.cssprint.css都将被发布,但只会styles.css附加到<head>.

考虑这一点,而不是使用:

$assetFolder = Yii::app()->assetManager->publish( dirname( __FILE__ ) . '/assets' );
Yii::app()->clientScript->registerCssFile( $assetFolder . 'styles.css' );
Yii::app()->clientScript->registerScriptFile( $assetFolder . 'jquery.js' );
Yii::app()->clientScript->registerScriptFile( $assetFolder . 'function.js' );

Michael 是正确的,无论如何都不会太多,因此在包声明中指定 css 和 js 文件应该不是什么大问题。

于 2013-06-07T13:07:55.660 回答
1

您的假设是正确的:Yii 不会查看该目录中的文件。它只发布完整的目录。注册您需要的所有文件是您的工作。您可以从 PHP 中打开目录并读取目录内容。但我会在大容量站点上避免这种情况——它会花费宝贵的 CPU 周期。

我只是registerCssFile()为每个文件手动调用。反正不应该太多。通过这种方式,您可以更好地控制加载哪些文件。

于 2013-06-07T10:52:32.610 回答