[Php] yii2 - Entrée de fichier Kartik - mise à jour



Answers

J'ai rencontré une autre solution en créant des scénarios. Dans votre cas, je modifierais les règles comme ceci:

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

Ainsi, le champ fileupload ne sera requis que dans l'action create. Dans l'action de mise à jour, j'ai ce code:

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,
          ]);
        }

    }

Dans le scénario de mise à jour, l'image déposée n'est pas requise mais le code vérifie si rien n'a été téléchargé et ne modifie pas la valeur précédente.

Mon fichier de formulaire:

<?= $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,
    ],
]); ?>

Je pense que c'est un peu plus facile qu'un champ virtuel. J'espère que cela aide!

Question

C'est la situation: je suis nouveau sur Yii2 et je voulais utiliser un widget de téléchargement de fichiers dans ActiveForm .. jusqu'à présent, j'ai trouvé cet excellent: \ kartik \ widget \ FileInput

Avec ce widget, je peux gérer le téléchargement de fichiers, puis, quand entrer en mode édition, montrer l'image téléchargée précédemment avec l'oportunite pour le remplacer.

Le problème est que si j'appuie sur le bouton "Mettre à jour" du formulaire sans modifier l'image yii dit que l'image "ne peut pas être vide" parce que j'ai mis la règle "requise" dans mon modèle.




De Krajee:

http://webtips.krajee.com/advanced-upload-using-yii2-fileinput-widget

Créer, supprimer, mettre à jour: vraiment facile, ne cherchez pas plus loin.

(1) J'ai également défini la règle 'required' dans mon modèle.

(2) Pour travailler sur Wampserver:

Yii::$app->params['uploadPath'] = Yii::$app->basePath . '/web/uploads/';

Yii::$app->params['uploadUrl'] = Yii::$app->urlManager->baseUrl . '/uploads/';