php - Yii2 Dropzone 已附加且未提供 URL 错误
问题描述
我正在尝试为我的 yii2 项目使用 dropzone 扩展。
我使用了 https://github.com/perminder-klair/yii2-dropzone
我的控制器:
<?php echo \kato\DropZone::widget([
'options' => [
'url' => '/dobuyme/frontend/web/index.php?r=boats/create&city_id=2&cat=rowpaddleboats&subcat=paddleboat',
'maxFilesize' => '2',
],
'clientEvents' => [
'complete' => "function(file){console.log(file)}",
'removedfile' => "function(file){alert(file.name + ' is removed')}",
],
]);
我收到错误:
dropzone.min.js:1 Uncaught Error: No URL provided. at new c (dropzone.min.js:1) at Function.a.discover (dropzone.min.js:1) at a._autoDiscoverFunction (dropzone.min.js:2) at HTMLDocument.f (dropzone.min.js:2) Uncaught Error: Dropzone already attached. at new c (dropzone.min.js:1) at HTMLDocument.<anonymous> (index.php?r=boats/create&city_id=2&cat=rowpaddleboats&subcat=paddleboat:962) at mightThrow (jquery.js:3557) at process (jquery.js:3625)
解决方案
过错
您正在使用的扩展中存在实现错误,dropzone 初始化不应该在jquery
函数内部,或者onready
当您在没有 jquery 的情况下初始化 drop zone 时,意味着如果您正在使用
new Dropzone();
然后,您最好在</body>
标签之前的页面末尾添加脚本,而不要将其包装在其中任何一个中
$(document).ready(function(){})
或者
jQuery(function ($) {});
如果您查看正在使用 dropzone 的页面的视图源,您正在使用的扩展程序不是这种情况,它会向您显示类似这样的内容
jQuery(function ($) {
Dropzone.autoDiscover = false;
var myDropzone = new Dropzone("div#myDropzone", {
"maxFilesize": "2",
"url": '/dobuyme/frontend/web/index.php?r=boats/create&city_id=2&cat=rowpaddleboats&subcat=paddleboat',
"previewsContainer": "#previews",
"clickable": true,
"headers": {
"X-CSRF-Token": "mNq_nlbRIYljqGTXp-bB3nzJelGfikZUzhpLwUapdxbSjMntFZxi5yDgEJjet4WSP60YCc_Gfh6nfAGrdsAbLg=="
},
"params": {
"_csrf": "mNq_nlbRIYljqGTXp-bB3nzJelGfikZUzhpLwUapdxbSjMntFZxi5yDgEJjet4WSP60YCc_Gfh6nfAGrdsAbLg=="
}
});
myDropzone.on('complete', function (file) {
console.log(file)
});
myDropzone.on('removedfile', function (file) {
alert(file.name + ' is removed')
});
});
并且和我上面提到的有同样的问题。
错误来源
源类中的以下行中需要更正DropZone.php
$view->registerJs($js);
默认情况下,Yii2 将脚本包装在函数中,除非您在函数的第二个参数中指定,registerJs()
在上述情况下应该是 \yii\web\View::POS_END
,这使得该行。
$view->registerJs($js, $view::POS_END);
解决方案
您目前可以做的是扩展类并覆盖registerAssets()
函数,并更改行,这样您将要做的就是。
DropZone.php
在文件夹中创建一个文件,如果项目根目录下的文件common/components
夹中没有任何具有该名称/components
的文件夹,则创建一个,并在文件中添加以下代码。common/
namespace common\components; use yii\helpers\Json; use kato\assets\DropZoneAsset; use kato\DropZone as KatoDropZone; class DropZone extends KatoDropZone { public function registerAssets() { $view = $this->getView(); $autoDiscover = $this->autoDiscover; $id = $this->id; $dropzoneContainer = $this->dropzoneContainer; $options = Json::encode($this->options); $js = <<<JS Dropzone.autoDiscover = $autoDiscover; var $id= new Dropzone("div#$dropzoneContainer",$options); JS; if (!empty($this->clientEvents)) { foreach ($this->clientEvents as $event => $handler) { $js .= "$this->id.on('$event', $handler);"; } } $view->registerJs($js, $view::POS_END); DropZoneAsset::register($view); } }
现在在视图中使用您的自定义类并将名称空间从
\kato\DropZone::widget()
to更改为\common\Dropzone::widget()
,仅此而已。它应该工作顺利,您的视图代码应该如下所示。echo \common\DropZone::widget([ 'options' => [ 'url' => '/dobuyme/frontend/web/index.php?r=boats/create&city_id=2&cat=rowpaddleboats&subcat=paddleboat', 'maxFilesize' => '2', ], 'clientEvents' => [ 'complete' => "function(file){console.log(file)}", 'removedfile' => "function(file){alert(file.name + ' is removed')}", ], ]);
推荐阅读
- c# - Unity 也没有像编码那样增加力量
- google-apps-script - 我可以用我的新电子表格复制触发器吗?
- javascript - 如何一起使用地图和过滤器来删除javascript中的空值
- django - 为什么 ListStyle 插件没有出现在我的 Django 网站的 CKEditor 中?
- audio - FFMPEG - 如何将 10 通道 WAV 分离为每个通道的文件?(不是 5.1)
- python - 如何在这个程序中插入 Matplotlib 饼图?
- java - 使用带有 SSH 服务器后端的与 HAProxy 的 SSL 连接的 JSch
- java - 从 Camel 到蛇案例的 Java Lucene 查询
- javascript - 如何在 javascript 上四舍五入?,4.225 问题
- r - 计算另一个变量的每个级别内一个变量的级别的共现