当前位置: 首页 > 知识库问答 >
问题:

yii2-Kartik文件输入-更新

贲骏喆
2023-03-14

这是情况:我是第一次在Yii2上,想在ActiveForm中使用一些文件上传器小部件...到目前为止,我已经找到了这个出色的:\kartik\widget\FileInput

有了这个小部件,我可以管理文件上传,然后,当进入编辑模式时,显示以前上传的图像和替换它的机会。

问题是,如果我按下表单的“更新”按钮而不修改图像,yii说图像“不能是空的”,因为我在模型中设置了“必需”规则。

共有3个答案

东郭和光
2023-03-14

尝试用该字段的内容预加载文件输入字段。这样,您在提交表单后不会丢失数据。

我通过kartik文件输入小部件(不错的发现,顺便说一句),我遇到了一种方法来做到这一点

// Display an initial preview of files with caption
// (useful in UPDATE scenarios). Set overwrite `initialPreview`
// to `false` to append uploaded images to the initial preview.
echo FileInput::widget([
    'name' => 'attachment_49[]',
    'options' => [
        'multiple' => true
    ],
    'pluginOptions' => [
        'initialPreview' => [
            Html::img("/images/moon.jpg", ['class'=>'file-preview-image', 'alt'=>'The Moon', 'title'=>'The Moon']),
            Html::img("/images/earth.jpg", ['class'=>'file-preview-image', 'alt'=>'The Earth', 'title'=>'The Earth']),
        ],
        'initialCaption'=>"The Moon and the Earth",
        'overwriteInitial'=>false
    ]
]);

您可能还希望在模型中为该字段放宽必需的规则,这样它就不会抱怨验证了。您可以选择通过更微妙的方式提示用户

彭鸿哲
2023-03-14

通过创建场景,我遇到了另一个解决方案。在您的情况下,我将修改如下规则:

public funtion rules() {
    [['image'], 'file'],
    [['image'], 'required', 'on'=> 'create']
}

因此,fileupload字段仅在创建操作中是必需的。在更新操作中,我有以下代码:

public function actionUpdate($id)
    {
      $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post())) {

          $newCover = UploadedFile::getInstance($model, 'image');

          if (!empty($newCover)) {
            $newCoverName = Yii::$app->security->generateRandomString();
            unlink($model->cover);
            $model->cover = 'uploads/covers/' . $newCoverName . '.' . $newCover->extension;
            $newCover->saveAs('uploads/covers/' . $newCoverName . '.' . $newCover->extension);
          }

          if ($model->validate() && $model->save()) {
            return $this->redirect(['view', 'id' => $model->post_id]);
          } else {
            // error saving model
          }

        } else {
          return $this->render('update', [
          'model' => $model,
          ]);
        }

    }

在更新场景中,图像字段不是必需的,但是代码会检查是否没有上传任何内容,并且不会更改以前的值。

我的表格文件:

<?= $form->field($model, 'image')->widget(FileInput::classname(), [
    'options' => ['accept'=>'image/*'],
    'pluginOptions'=>[
        'allowedFileExtensions'=>['jpg', 'gif', 'png', 'bmp'],
        'showUpload' => true,
        'initialPreview' => [
            $model->cover ? Html::img($model->cover) : null, // checks the models to display the preview
        ],
        'overwriteInitial' => false,
    ],
]); ?>

我认为这比虚拟场地要容易一点。希望有帮助!

单于季
2023-03-14

经过一个糟糕的下午和一个更有效率的夜晚,我遇到了一个对我有效的解决方案...

主要问题是文件输入在更新时不发送其值(存储在数据库中的文件名)。仅当通过文件输入浏览和选择时,才会发送图像信息。。

因此,我的解决方法是创建另一个“虚拟”字段来管理文件上传,名为“上传图片”。为了实现这一点,我简单地在我的模型类中添加了一个具有此名称的公共属性:public$upload\u image

我还在Model类上添加了以下规则验证方法:

 public function rules()
{
    return [
        [['upload_image'], 'file', 'extensions' => 'png, jpg', 'skipOnEmpty' => true],
        [['image'], 'required'],
    ];
}

这里,“上传图片”是我的虚拟专栏。我添加了'file'验证,其中'skipOnEmpty'=true,并且'image'是我数据库中的字段,这在我的情况下是必需的。

然后,在我看来,我配置了“上传图像”小部件,如下所示:

    echo FileInput::widget([
        'model' => $model,
        'attribute' => 'upload_image',
        'pluginOptions' => [
            'initialPreview'=>[
                Html::img("/uploads/" . $model->image)
            ],
            'overwriteInitial'=>true
        ]
    ]);

在“initialPreview”选项中,我指定了存储在“$model”中的图像名称-

最后,我的控制器看起来像如下:

public function actionUpdate($id)
{
    $model = $this->findModel($id);
    $model->load(Yii::$app->request->post());

    if(Yii::$app->request->isPost){
        //Try to get file info
        $upload_image = \yii\web\UploadedFile::getInstance($model, 'upload_image');

        //If received, then I get the file name and asign it to $model->image in order to store it in db
        if(!empty($upload_image)){
            $image_name = $upload_image->name;
            $model->image = $image_name;
        }

        //I proceed to validate model. Notice that will validate that 'image' is required and also 'image_upload' as file, but this last is optional
        if ($model->validate() && $model->save()) {

            //If all went OK, then I proceed to save the image in filesystem
            if(!empty($upload_image)){
                $upload_image->saveAs('uploads/' . $image_name);
            }

            return $this->redirect(['view', 'id' => $model->id]);
        }
    }
    return $this->render('update', [
        'model' => $model,
    ]);
}

 类似资料:
  • 我正在使用kartik文件输入。 我无法验证,即在提供所需文件时仍然显示验证错误。下面是我的代码。文件已正确上载。但仍然显示“请上传一个文件。” 视图: 行动: 模型设置: 上传功能:

  • 我创建了一个文件输入字段yii2使用kartik file输入小部件。看到下面的代码就行了 如何隐藏突出显示的按钮。我是说取消按钮

  • 所以我正在和Yii2一起工作,对它来说是相当新的。我正在使用Kartik文件上传,并试图将代码转换为多个文件。但它只保存了第一个文件。 我已经删除了验证,因为这也是失败的,但一旦我知道所有其他的都在工作,我会重新添加。 型号: 控制器: 查看:

  • 我对kartik的FileInput小部件有问题。我想改变语言,但它不工作这里是我的代码 语言设置为“FR-FR”,但我仍然收到英语文本,为什么?我错过了什么?谢谢你们

  • 阅读Yii2 kartik小部件FileInput的文档时,我找不到有关数据应存储在其中的字段类型的任何详细信息。 http://demos.krajee.com/widget-details/fileinput 我应该使用BLOB字段还是String?

  • 我试图使用在表单中加载多个文件。 我使用我的表将文件名和其他字段保存在数据库中,并将文件保存在我的文件系统中。我通常把和通过表链接起来。 我成功地保存了多个文件,但当我加载特定