Sau một buổi chiều khủng khiếp và một đêm năng suất cao hơn, tôi đã gặp phải một giải pháp mà làm việc cho tôi ..
Vấn đề chính là tập tin đầu vào không gửi giá trị (tên của tập tin lưu trữ trong cơ sở dữ liệu) khi cập nhật. Nó chỉ gửi thông tin hình ảnh nếu được duyệt và được chọn thông qua đầu vào tệp ..
Vì vậy, giải pháp của tôi đã tạo một trường "ảo" khác để quản lý tải lên tệp có tên "upload_image". Để đạt được điều tôi đơn giản này thêm một tài sản công khai với tên này đến lớp mô hình của tôi: public $upload_image;
Tôi cũng thêm xác nhận folowing phương pháp quy định về lớp mẫu:
public function rules()
{
return [
[['upload_image'], 'file', 'extensions' => 'png, jpg', 'skipOnEmpty' => true],
[['image'], 'required'],
];
}
Ở đây, 'upload_image' là ảo của tôi cột. Tôi đã thêm xác nhận 'tệp' với 'skipOnEmpty' = true và 'hình ảnh' là trường trên cơ sở dữ liệu của tôi, điều đó phải được yêu cầu trong trường hợp của tôi.
Sau đó, theo quan điểm của tôi, tôi cấu hình 'upload_image' phụ tùng thích sau:
echo FileInput::widget([
'model' => $model,
'attribute' => 'upload_image',
'pluginOptions' => [
'initialPreview'=>[
Html::img("/uploads/" . $model->image)
],
'overwriteInitial'=>true
]
]);
Trong tùy chọn 'initialPreview' Tôi asign tên hình ảnh của tôi, lưu trữ trong '$ model-> hình ảnh' bất động sản trở về từ cơ sở dữ liệu.
Cuối cùng, bộ điều khiển của tôi trông giống như sau:
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,
]);
}