2016-05-19 11 views
0

CreateとUpdateアクションの両方に必要なファイルアップロードフィールドと、両方の場合に実行されるタイプの検証と検証が必要です。Yii 2のUpdateアクションで、必要なファイルアップロード属性を実装する方法は?

これは私のフォームはどのように見えるかである(注:フォームではなく、Active Recordのモデルです):

<?php 

namespace app\models; 

use Yii; 
use yii\base\Model; 
use yii\base\Object; 
use yii\helpers\FileHelper; 

class MyCustomForm extends Model 
{ 

    public $file_image; 

    public function rules() 
    { 
     return [ 
      [ 
       [['file_image'], 'file', 'skipOnEmpty' => false, 'extensions' => 'jpg, jpeg, png, bmp, jpe'] 
      ] 
     ]; 
    } 

    public function scenarios() 
    { 
     $scenarios = parent::scenarios(); 
     //Scenarios Attributes that will be validated 
     $scenarios['action_add'] = ['file_image']; 
     $scenarios['action_edit'] = ['file_image']; 
     return $scenarios; 
    } 
} 

そして、これは私のコントローラのアクションがどのように見えるかです。予想通り

作成アクション作品

public function actionCreate() 
{ 
    $model_form = new MyCustomForm(['scenario' => 'action_add']); 
    if (Yii::$app->request->isPost && $model_form->load(Yii::$app->request->post())) { 
     $model_form->file_image = \yii\web\UploadedFile::getInstance($model_form, "file_image"); 
     if($model_form->validate()) { 
      if(isset($model_form->file_image)){ 
       //I'm uploading my image to some cloud server here 

       //creating corresponding $model_entity for database, fill with the data from the form and save it 
       $model_entity->save(); 
      } 
     } 
    } 
} 

(POSTリクエストに私はにUploadedFile ::のgetInstanceコマンドを使用してアップロードファイルを取っている)が、更新のアクションに同じことをやったとき、私は問題に直面しています。データベースには、サードパーティのクラウドサーバ上にある画像のURLがあり、それをアクセスして自分のフォームに画像を表示することができます(更新のGET要求が機能し、データベースから対応するエンティティを取得し、 )。しかし、POSTの場合、モデルにファイルが割り当てられておらず、UpdateのPOST要求が機能していない場合、ファイルの検証は失敗します。

public function actionUpdate($id) 
{ 
    $model_entity = $this->findModel($id);   

    $image_URL = //I'm having URL to corresponding image here; 

    $model_form = new MyCustomForm(['scenario' => 'action_edit']);   
    $model_form_data = [$model_form->formName() => $model_entity->attributes]; 
    $model_form->load($model_form_data); 

    if (Yii::$app->request->isPost && $model_form->load(Yii::$app->request->post())) { 
     //if we upload image again this will work 
     //NOTE: I have another text fields in the form and If I only change them 
     //and if I don't change the file image, the following result will return NULL and validation will fail 
     $file_uploaded_image = \yii\web\UploadedFile::getInstance($model_form, "file_image"); 

     if(isset($file_uploaded_image)){ 
      //new image is uploaded on update, this scenario will be OK 
     } else { 
      //no image is uploaded on update, this scenario will fail 
     } 

     if($model_form->validate()) { 
      //this will fail if I don't upload image on Update 
     } 

    } 

} 

私が失敗しないために、画像や検証を取得するための回避策を見つけるために、検証の前に、更新アクションで多くのことを試してみました。たとえば、次のように

$dataImg = file_get_contents($image_URL); 
$model_form->file_image = $dataImg; 

や一時ファイルを取得やろうとしている。

$dataImg = file_get_contents($dataImg); 
$filePath = \yii\helpers\FileHelper::createDirectory("/images/tmp/test.png", 777); 
file_put_contents($filePath, $dataImg); 
$model_form->file_image = $filePath; 

しかし、それらのどれもが作業していません。このシナリオに対する解決策はありますか? 私の実際のプロジェクトはその例がより複雑なので、私はFroms(上記のように)を使用し、ActiveRecordは使用しないでください。

答えて

0

書き込みあなたのモデル(MyCustomForm)でこのコード:

class MyCustomForm extends Model 
{ 

    public $file_image; 

    public function rules() 
    { 
     return [ 
      [['file_image',],'required','on'=>['create','update']], 
      [['file_image'], 'file','extensions' => 'jpg, jpeg, png, bmp, jpe'], 
     ]; 
    } 
} 

書き込みあなたのactionCreate()でこのコード:

$model_form = new MyCustomForm(); 
$model_form->scenario = "create"; 

があなたのactionUpdate(このコードを書きます):

$model_form = new MyCustomForm(); 
$model_form->scenario = "update"; 

それとも、このことにより、シナリオを追加することができます。私はこれを試してみました、それが働いている

$model_form = new MyCustomForm(['scenario' => 'create']); 

関連する問題