如何在Yii2中管理资产?

22
例如,我创建了一个新页面,我想在其中使用 backbone.js、自定义 css 文件和一些图片集合。在 Yii2 中应该在哪里声明所有这些内容?我找到了 AppAsset.php 模块,但这只适用于 css/js 文件,当我的 css/js 文件和路径在那里声明时,我没有注意到任何更改:
class AppAsset extends AssetBundle {
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [
        'css/site.css',
        'js/jquery.mobile-1.4.2.min.css',
    ];
    public $js = [
        'js/jsquery-2.1.0.min.js',
        'js/jquery.mobile-1.4.2.min.js',
        'js/script.js',
    ];

    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];
}

我做错了什么?


“...而且当我的CSS/JS文件和路径在那里声明时,我没有注意到任何变化。” 那你有注册bundle吗? - Cthulhu
是的,在目标 .php 模块中我写了以下代码: use frontend\assets\AppAsset; AppAsset::register($this); 但什么也没有改变。 - Павел Иванов
请检查AppAsset.php中的路径是否正确? - sprytechies
好的,我的项目结构大致如下:资产以多种形式存在:@root/frontend/web/assets/[有类似4cd64e87的哈希码]/[css、字体、js]/;@root/frontend/web/css;@root/frontend/web/js。我正在尝试找出应该把我的文件放在哪里。我把jquery和script.js文件放到了web/js目录中,但是对视图没有太大影响,在重新加载页面后,它仍然没有样式,就像没有链接到css文件一样。 - Павел Иванов
4个回答

31

我花了一段时间才明白,但下面是Yii2源代码的相关部分:链接

if ($this->sourcePath !== null && !isset($this->basePath, $this->baseUrl)) {
    list ($this->basePath, $this->baseUrl) = $am->publish($this->sourcePath, $this->publishOptions);
}
所以Yii2仅在设置了$sourcePath且未设置$basePath$baseUrl时发布资产。后者让我困惑了,看起来对你也是如此。

所以我有这个AppAsset,它会准确地发布

use yii\web\AssetBundle;


class AppAsset extends AssetBundle
{
public $sourcePath = '@app/assets/app';

public $css = [
    'css/openbook.css',
    'fontello/css/fontello.css',
    'fontello/css/animation.css'
];
public $js = [
    'js/plug.openbook.js',
    'js/plug.interpret.js',
    'js/plug.drop.message.js'
];
public $depends = [
   // 'yii\web\YiiAsset', 
   // 'yii\bootstrap\BootstrapAsset',
];
} 

当然,我在主布局中。

use frontend\assets\AppAsset;
...
AppAsset::register($this);

我会将这个答案添加到“Yii2黄金建议”中! - abr_stackoverflow
1
你的结论是错误的,Yii2只有在设置了sourcePath时才会发布资源并不正确。当资源不在Web可访问文件夹内时,需要设置sourcePath。但是,如果资源在Web可访问文件夹内,则无需设置sourcePath,而是需要设置basePathbaseUrl - yetanotherse

4

要使用此AppAsset或任何其他资源,您应在视图中注册它。

use app\assets\AppAsset;
AppAsset::register($this);

0

首先,在您的app/assets/文件夹中创建SomeAsset类和您的新js和css文件。 您可以通过重载其属性来扩展您的AppAsset。

接下来,在SomeController中使用此内容

use Yii;
use app\assets\SomeAsset;

并且在实际应用中有些是这样的:

SomeAsset::register(Yii::$app->view);

请同时发布 SomeAsset 文件。 - Ilyas karim

-4

从个人经验来看,资产是 Yii 中我发现非常令人沮丧的部分之一。

很难可靠地找出文件将要去哪里,而在开启和关闭调试模式时来回切换会带来进一步的挫败感。

我建议放弃资产处理,只需将所有 JS 文件保存在一个文件夹中,然后可以像这样包含它:

Yii::app()->clientScript->registerScriptFile('/js/jquery.jeditable.mini.js');

1
很抱歉,但是您的脚本似乎在引用Yii 1.1的资源。在Yii2中,资源的处理方式有很大不同(作为Bundle处理,可以声明其他所需的资源)。 - Snivs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接