Po okropnym południu i bardziej produktywnego nocy, z jaką się spotkałem rozwiązanie, które pracowały dla mnie ..
Głównym problemem było to, że plik wejściowy nie wysyłać jej wartość (nazwa pliku zapisanego w baza danych) podczas aktualizacji. Wysyła informacje o obrazie tylko wtedy, gdy przeglądanie i wybieranie odbywa się za pośrednictwem pliku wejściowego.
Moje obejście polegało na utworzeniu kolejnego "wirtualnego" pola do zarządzania przesyłaniem plików o nazwie "upload_image". Aby to osiągnąć, ja prosty dodał własność publiczną o tej nazwie do mojej klasy modelu public $upload_image;
ja również dodać walidację folowing metody przepisami dotyczącymi klasy modelu:
public function rules()
{
return [
[['upload_image'], 'file', 'extensions' => 'png, jpg', 'skipOnEmpty' => true],
[['image'], 'required'],
];
}
Tutaj „upload_image” to mój wirtualny kolumna. Dodałem walidację "pliku" za pomocą "skipOnEmpty" = true, a "image" to pole w mojej bazie danych, które musi być wymagane w moim przypadku.
Wtedy, moim zdaniem mam skonfigurowany 'upload_image' widget jak następuje:
echo FileInput::widget([
'model' => $model,
'attribute' => 'upload_image',
'pluginOptions' => [
'initialPreview'=>[
Html::img("/uploads/" . $model->image)
],
'overwriteInitial'=>true
]
]);
W opcji 'initialPreview' I asign moje imię obrazu, zapisany w '$ model-> Obraz' własności zwracanych z bazy danych.
Wreszcie mój kontroler wygląda następująco:
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,
]);
}