【问题标题】:Yii2 pjax file upload for use within activeFormYii2 pjax 文件上传以在 activeForm 中使用
【发布时间】:2018-02-03 17:56:50
【问题描述】:

我正在创建一个 Yii2 activeForm 来创建和编辑产品,并且希望页面也可以管理图像。我希望能够为产品上传(添加)图像,然后有一个可排序的预览区域,其中显示图像并且可以按正确的顺序排序。我的计划是通过 ajax/pjax 将文件上传到一个临时文件夹,表单将从该文件夹中拉出以在可排序区域中显示它们,并在保存模型后,相应地移动/命名图像。

最初我使用Kartik's FileInput widget(这可能是不必要的)和Kartik's Sortable Input 重新排序图像。

我相信我可以处理文件上传和移动/重命名,我的问题是如何将图像与表单的其余部分分开上传,然后让 ActiveForm 将它们拉入可排序的输入区域?此外,我还希望能够从中删除图像(在缩略图的角落有一个小 x)。我熟悉使用 pjax 包装网格视图,甚至使用 pjax 将表单提交给 pjax 方法(用于在模式中使用),但不知道如何在另一个表单中使用它并使另一个表单动态加载图片。

为了澄清,我有一个扩展 ActiveRecordProduct 和一个扩展 ModelImageForm。然后我有ProductController 和以下Create 操作:

public function actionCreate()
{
    $model = new Product();
    $images = new ImageForm();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    }

    return $this->render('create', [
        'model' => $model,
        'images' => $images,
    ]);
}

我的目标是能够将图像(通过ImageForm)上传到产品的create 视图上显示的临时位置。但是目前,使用小部件中的上传功能只是重新加载页面并且图像消失了。

【问题讨论】:

  • 好吧,您可以使用扩展yii\base\ModelformModel 使用kartik\FileInput 上传文件我认为这样做没有任何问题,您的正常表单将有一个单独的模型,该模型已扩展从\yii\db\ActiveRecord,您可以使用FileInput 小部件提供的事件来刷新您要在其中显示上传文件的div,或者在您的controller 中创建一个单独的action,由该@987654340 调用@使用ajax
  • @MuhammadOmerAslam 是否有一种 'yii' 方式来进行 ajax 调用,或者我只是在编写 javascript 来检测事件?另外,我如何只提交上传表单而不是整个产品表单?
  • 如果您使用kartik\FileInput,您不必编写javascript来发布图片,它可以选择在您选择文件后立即触发上传,因为它使用ActiveFormmodel所以是的,这是一种yii 上传方式,如果失败,它甚至会向您显示模型的验证。比如大小限制增加
  • @MuhammadOmerAslam 请原谅我的无知,我在$form->field()->widget 场景中使用了fileInput,我是否必须在第一个中嵌入另一个activeForm 才能使其工作?上传完成后如何触发刷新?那是自定义的javascript还是有其他方法可以触发它?我会做一些工作,并会酌情更新我的问题。
  • 您正在使用的FileInput 应使用相同的ActiveForm,但使用不同的模型对象,该对象将属于您的UploadForm 类,即$form->field('imagefileName',$uploadModel)->widget()

标签: yii2 pjax active-form


【解决方案1】:

您可以使用单独的模型来上传图像并使用相同的表单,只需传递$uploadForm 模型对象来填充file 的表单字段,您可以使用具有选项的kartik\FileInput 小部件要通过ajax 通过uploadUrl 上传文件,您可以通过fileUploaded 事件自动触发选择文件的上传,一旦上传,您有2 个选项,您可以使用uploadAsync=>true 和使用filebatchuploadsuccess,这会在之后触发所有文件都已上传或使用默认设置并使用filebatchuploadcomplete wchich 将在每次文件上传后触发。这两个事件都提供了已上传文件的列表,但要小心,因为您在提交文件后验证文件,您应该在出现错误时返回响应,以便通知用户未上传的文件,您可以事件提供的文件列表或更好地在控制器中使用单独的action 并在您正在使用的相对成功函数中调用它表格查询表格以显示名称

fileselect : 通过文件浏览按钮在文件输入中选择文件后触发此事件。这与更改事件略有不同,即使文件浏览对话框被取消也会触发。

你将如何使用它

//get filinput object
var $input=$("#input-id");

 $input.on('fileselect', function(event, numFiles, label) {

    //trigger file upload with 1 sec delay
    setTimeout(function() {
    $input.fileinput("upload");
}, 1000);
});

filebatchuploadcomplete:此事件仅在 ajax 上传和同步或异步 ajax 批量上传完成后触发。

其他可用参数有:

  • files:文件堆栈数组(如果不可用,则为空对象)。

  • extra:插件的 uploadExtraData 设置(如果不可用,则为空对象)。

示例代码

$('#input-id').on('filebatchuploadcomplete', function(event, files, extra) {
    //call the ajax function here to query the files that are uploaded
});

【讨论】:

  • 我没有给出这个确切的答案,但它确实让我找到了解决方案。我使用JS的第一位自动提交表单(插件提供的上传按钮不需要,但我喜欢这种触摸),然后我将activeForm包装在pjax中,然后在filebatchuploadcomplete事件中,我重新加载了 pjax,所以我可以使用控制器进行更直接的控制。
  • 是的,如果适合您,您也可以这样做。它会起作用的,很高兴你能够解决它@sharf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
相关资源
最近更新 更多