Yii2自定义窗口小部件资产未注册

时间:2015-11-19 21:45:52

标签: php yii2 yii2-extension

我正在尝试开发一个自定义小部件,但我遇到了一堵墙。我有一些我需要包含的第三方JS / CSS文件,但无论出于何种原因,Yii2都不会注册它们。我已经按照Yii2文档中的所有内容进行了操作,但似乎无处可去。我的目录结构如下:

部件
- DildenFeedback.php
- DildenFeedbackAsset.php
- 意见/
- feedback.php
- 资产/
- feedback.min.js
- feedback.min.css

DildenFeedback.php(小工具类)

<?php

namespace app\components\yii2feedbackwidget;

use Yii;
use yii\base\Widget;
use app\components\yii2feedbackwidget\DildenFeedbackAsset;

class DildenFeedback extends Widget
{

    public function run() {
        parent::run();
        DildenFeedbackAsset::register($this->view);
        return $this->render('feedback');
    }
}

DildenFeedbackAsset.php(窗口小部件资产类别)

<?php

namespace app\components\yii2feedbackwidget;
use yii\web\AssetBundle;

class DildenFeedbackAsset extends AssetBundle {

    public $sourcePath = 'assets/';

    public $css = ['assets/feedback.min.css'];
    public $js = ['assets/feedback.min.js'];

    public $depends = ['yii\web\JqueryAsset'];
}

反馈视图     

?>
<script type="text/javascript">
    $.feedback();
</script>

views / layouts / main.php (我试图调用的主要模板)

<?php $this->endBody() ?>
<?php
    echo DildenFeedback::widget();
?>

因此,当我去检查页面时,无法找到feedback.min.js / css。视图文件正确呈现,但我的猜测是我的AssetBundle形式不正确。任何帮助将不胜感激。

编辑(来自Yii调试器资产):
sourcePath / var / www / public / components / yii2feedbackwidget / assets
basePath / var / www / public / web / assets / 7e80049a
baseUrl / assets / 7e80049a
css assets / feedback.min.css
js assets / feedback.min.js
取决于yii \ web \ JqueryAsset

编辑2 我已经在Yii2的全新安装上测试了这个,我得到了同样的错误。

2 个答案:

答案 0 :(得分:1)

好吧,您应该只是更正sourcePath

class DildenFeedbackAsset extends AssetBundle {

    public $sourcePath = '@app/components/assets/';

    public $css = ['feedback.min.css'];
    public $js = ['feedback.min.js'];

    public $depends = ['yii\web\JqueryAsset'];
}

您还应该使用registerJs()而不是脚本标记修复视图:

$this->registerJs('jQuery.feedback();');

答案 1 :(得分:1)

我已经解决了,我觉得有点傻。它归结为,小部件调用的位置。正如我在原始问题中所提到的,我正如这样回应小部件:

<?php $this->endBody() ?>
<?php
    echo DildenFeedback::widget();
?>

但是,我没有注意那个电话在哪里。它需要在endBody之前召唤

<?php
    echo DildenFeedback::widget();
?>
<?php $this->endBody() ?>

这最终解决了这个问题。感谢Soju指导我进行小部件调用。