2015-12-08 20 views
4

當需要圖像文件時,出現此錯誤:「預覽不能爲空」。雖然我填補了這個領域。由於'文件'驗證規則,在保存()時出現'不能空白'錯誤

我的規則:

public function rules() 
{ 
    return [ 
     [['name', 'preview', 'date', 'author_id'], 'required', 'on' => 'update'], 
     [['name', 'preview', 'date', 'author_id'], 'required', 'on' => 'create'], 
     [['date_create', 'date_update', 'author_id'], 'integer'], 
     [['preview'], 'file', 'skipOnEmpty' => 'false', 'extensions' => 'png, jpg, jpeg'], 
     [['date'], 'safe'], 
     [['name'], 'string', 'max' => 255] 
    ]; 
} 

控制器:

public function actionCreate() 
{ 
    $model = new Book(); 
    $model->scenario = 'create'; 
    if ($model->load(Yii::$app->request->post()) && $model->validate()) { 
     $model->preview = UploadedFile::getInstance($model, 'preview'); 
     if ($model->save() && $model->preview->saveAs('uploads/' . $model->preview->baseName . '.' . $model->preview->extension)) 
     { 
      return $this->redirect(['view', 'id' => $model->id]); 
     } 
    } else { 
     return $this->render('create', [ 
      'model' => $model, 
     ]); 
    } 
} 

如果不需要preview文件不存在錯誤,該文件被加載到uploads文件夾。

+0

試着用'$ model-> save(false)'。 –

回答

2

這裏要做的最好的事情是避免使用相同的字段用於不同的目的。

在你的情況與UploadedFile例如覆蓋preview,你可以創建另一個字段爲這個,然後:

$model->previewFile = UploadedFile::getInstance($model, 'preview'); 

然後通過save()調用驗證不會撞一下preview字段作爲任何新問題文件保存在previewFile中,原始值preview已經通過$model->validate()檢查。

+0

$ model->預覽必須只包含文件名? –

2

我認爲你不能使這個字段是必需的,因爲它只驗證插入的$ _POST變量。文件上傳輸入$ _FILES超全局,而不是$ _POST超全局。要求這將意味着你想要在你的$ _POST變量中。

您在處理文件上傳之前運行驗證。因此,我建議你處理模型驗證之前處理的文件上傳,這樣你就可以將該值設置爲模型,然後運行事後驗證:

public function actionCreate() 
{ 
    $model = new Book(); 
    $model->load(Yii::$app->request->post()); 
    $model->scenario = 'create'; 
    $model->preview = UploadedFile::getInstance($model, 'preview'); 
    if ($model->validate()) { 
     if ($model->save() && $model->preview->saveAs('uploads/' . $model->preview->baseName . '.' . $model->preview->extension)) 
     { 
      return $this->redirect(['view', 'id' => $model->id]); 
     } 
    } else { 
     return $this->render('create', [ 
      'model' => $model, 
     ]); 
    } 
} 

我沒有在本地測試,但使「預覽'所需的領域沒有任何信息是不會肯定的工作。

P.S.我認爲它應該是'skipOnEmpty'=> false,而不是以''爲假。