如何从 yii2 中的特定视图中删除资产

How to remove an asset from a particular view in yii2

我有一个名为 reports 的视图,我想在其中显示 bootstrap 下拉菜单。

<div class="dropdown">
  <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">Dropdown Example
  <span class="caret"></span></button>
  <ul class="dropdown-menu">
    <li><a href="#">HTML</a></li>
    <li><a href="#">CSS</a></li>
    <li><a href="#">JavaScript</a></li>
  </ul>
</div>

仅在此视图中不起作用。我发现在这个视图中有多个 bootstrap js 文件。

<script src="/~folder/project/web/theme/bootstrap/js/bootstrap.min.js"></script>
<script src="/~folder/project/web/assets/db70fa5c/js/bootstrap.js"></script>

我怎样才能删除其中的一个?

我尝试创建一个新的 RegisterAsset.php 文件,其中我遗漏了脚本

<script src="/~folder/project/web/theme/bootstrap/js/bootstrap.min.js"></script>

但它仍然出现在视图中。我该怎么办?

问题分析

如果一切都被正确指定,这是不可能的。 Yii2 会检测到您两次注册相同的资产并且只包含一次。在您的示例中,第二个(不是缩小的)似乎以正确的方式注册,而第一个是从主题文件夹中注册的。

看起来您正在使用一个扩展或一些主题,它使用自己的资产文件(和它自己的 bootstrap 文件!)从非资产文件夹注册 (web/theme/...) .不符合规范... ;)

我们来解决吧!

找出哪个资产正在注册您的第二个 bootstrap 文件(主题文件夹中的那个)。现在您可以通过全局配置文件简单地覆盖此资产的配置。为此,请先阅读 docs,然后在 config/web.php 中执行以下操作:

'assetManager'=>[
    //...
    'bundles'=>[
        'namespace\to\your\failing\asset\Bundle'=>[
            //add all css-files of the bundle except the duplicate one here
            'js'=>['js/fileA.js', 'js/fileB.js'],
        ],
    ],
    //...
],

现在您指定包的 js 文件,除了重复的那个。这现在确实会覆盖此捆绑包的资产配置,因此应该可以解决您的问题而不排除视图中的某些内容(这将违反资产管理的基本思想)。

找到失败的资产包应该很容易。只需在您的主题中查找扩展 yii\web\AssetBundle 并在其 $js 数组中包含文件 bootstrap.min.js 的 class。