Dopo un pomeriggio e una notte terribile più produttivo, ho incontrato una soluzione che ha funzionato per me ..
Il problema principale era che il file di input non inviare il suo valore (nome del file memorizzato in database) durante l'aggiornamento. Invia solo le informazioni sull'immagine se visualizzate e selezionate tramite l'input del file.
Quindi, la mia soluzione era creare un altro campo "virtuale" per la gestione del caricamento di file, denominato "upload_image". Per raggiungere questo obiettivo ho semplice aggiunta di una proprietà pubblica con questo nome per la mia classe del modello: public $upload_image;
Ho anche aggiungere la convalida seguente per il metodo norme sulla classe del modello:
public function rules()
{
return [
[['upload_image'], 'file', 'extensions' => 'png, jpg', 'skipOnEmpty' => true],
[['image'], 'required'],
];
}
Qui, 'upload_image' è il mio virtual colonna. Ho aggiunto la convalida 'file' con 'skipOnEmpty' = true, e 'image' è il campo sul mio database, che deve essere richiesto nel mio caso.
Poi, a mio avviso ho configurato 'upload_image' widget di come segue:
echo FileInput::widget([
'model' => $model,
'attribute' => 'upload_image',
'pluginOptions' => [
'initialPreview'=>[
Html::img("/uploads/" . $model->image)
],
'overwriteInitial'=>true
]
]);
In opzione 'initialPreview' Io Asign il mio nome dell'immagine, memorizzato in 'immagine $ modello->' beni restituiti dal database.
Infine, il mio controller si presenta come segue:
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,
]);
}