【发布时间】:2018-02-03 17:56:50
【问题描述】:
我正在创建一个 Yii2 activeForm 来创建和编辑产品,并且希望页面也可以管理图像。我希望能够为产品上传(添加)图像,然后有一个可排序的预览区域,其中显示图像并且可以按正确的顺序排序。我的计划是通过 ajax/pjax 将文件上传到一个临时文件夹,表单将从该文件夹中拉出以在可排序区域中显示它们,并在保存模型后,相应地移动/命名图像。
最初我使用Kartik's FileInput widget(这可能是不必要的)和Kartik's Sortable Input 重新排序图像。
我相信我可以处理文件上传和移动/重命名,我的问题是如何将图像与表单的其余部分分开上传,然后让 ActiveForm 将它们拉入可排序的输入区域?此外,我还希望能够从中删除图像(在缩略图的角落有一个小 x)。我熟悉使用 pjax 包装网格视图,甚至使用 pjax 将表单提交给 pjax 方法(用于在模式中使用),但不知道如何在另一个表单中使用它并使另一个表单动态加载图片。
为了澄清,我有一个扩展 ActiveRecord 的 Product 和一个扩展 Model 的 ImageForm。然后我有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\Model的formModel使用kartik\FileInput上传文件我认为这样做没有任何问题,您的正常表单将有一个单独的模型,该模型已扩展从\yii\db\ActiveRecord,您可以使用FileInput小部件提供的事件来刷新您要在其中显示上传文件的div,或者在您的controller中创建一个单独的action,由该@987654340 调用@使用ajax -
@MuhammadOmerAslam 是否有一种 'yii' 方式来进行 ajax 调用,或者我只是在编写 javascript 来检测事件?另外,我如何只提交上传表单而不是整个产品表单?
-
如果您使用
kartik\FileInput,您不必编写javascript来发布图片,它可以选择在您选择文件后立即触发上传,因为它使用ActiveForm和model所以是的,这是一种yii上传方式,如果失败,它甚至会向您显示模型的验证。比如大小限制增加 -
@MuhammadOmerAslam 请原谅我的无知,我在
$form->field()->widget场景中使用了fileInput,我是否必须在第一个中嵌入另一个activeForm 才能使其工作?上传完成后如何触发刷新?那是自定义的javascript还是有其他方法可以触发它?我会做一些工作,并会酌情更新我的问题。 -
您正在使用的
FileInput应使用相同的ActiveForm,但使用不同的模型对象,该对象将属于您的UploadForm类,即$form->field('imagefileName',$uploadModel)->widget()
标签: yii2 pjax active-form