我有条款为我的应用程序中的公司上传徽标。上传和保存创建配置文件工作正常。但是在更新时,如果我没有再次上传,徽标就会变空!
这是我的更新表单
<?php $form = ActiveForm::begin([
'options' => ['enctype'=>'multipart/form-data']
]); ?>
.....
<?= $form->field($model, 'logo')->fileInput() ?>
...
我的控制器操作
if ($model->load($_POST) ) {
$file = \yii\web\UploadedFile::getInstance($model, 'logo');
if($file){
$model->logo=$file; }
if($model->save()){
if($file)
$file->saveAs(\Yii::$app->basePath . '/web/images/'.$file);
}
return $this->redirect(['profile']);
} else {
return $this->renderPartial('update', [
'model' => $model,
]);
}
我的规则:
public function rules()
{
return [
[['logo'], 'image', 'extensions' => 'jpg,png', 'skipOnEmpty' => true],
[['name'], 'required'],
[['name', 'description'], 'string'],
];
}
任何想法????
答案 0 :(得分:11)
skipOnEmpty
不适用于此处,因为在更新操作中$model->logo
属性不会为空,它将是一个带有文件名的字符串。$file
仍然是一个只有一个数组键,但不是值,如果没有再次上传。因此,请检查$file->size
,而不是检查!empty($file)
。修复了控制器代码的问题,如下所示!
$model = $this->findModel($id);
$current_image = $model->featured_image;
if ($model->load(Yii::$app->request->post())) {
$image= UploadedFile::getInstance($model, 'featured_image');
if(!empty($image) && $image->size !== 0) {
//print_R($image);die;
$image->saveAs('uploads/' . $image->baseName . '.' .$image->extension);
$model->featured_image = 'uploads/'.$image->baseName.'.'.$image->extension;
}
else
$model->featured_image = $current_image;
$model->save();
return $this->redirect(['update', 'id' => $model->module_id]);
} else {
return $this->render('add', [
'model' => $model,
]);
}
答案 1 :(得分:2)
'skipOnEmpty' => !$this->isNewRecord
对于更新,可以跳过它。