2011-10-04 4 views
0

モデルの倍数インスタンスで倍数ファイルをアップロードしようとするといくつか問題が発生します(表形式)。Yii検証表形式でファイルをアップロードできない

私はファイルと呼ばれるモデルとそのモデルの複数のインスタンスのフォームを生成するビューを持っています。 "multpart/form-data"を除いてフォームを保存すると、すべて動作しますが、このパラメータをフォームに入力して送信すると、 "File is blank not be"というメッセージが表示されます。

怒鳴る私のコントローラのコードを参照してください:

public function actionRegistration() { 
    $company = new Company; 
    $contacts = $this->getModelItens('Contact', 3); 
    $banks = $this->getModelItens('Bank' , 2); 
    $files = $this->getModelItens('File' , 2); 

    $company->scenario = 'create'; 
    if($_POST['Company']) { 
    $company->attributes = $_POST['Company']; 
    $valid = $company->validate(); 
    $valid = $this->validateModels($_POST['Contact'], $contacts) && $valid; 
    $valid = $this->validateModels($_POST['Bank'], $banks) && $valid; 
    $valid = $this->validateModels($_POST['File'], $files) && $valid; 

    if($valid) { 
     if($company->save()) { 
     $this->saveModels($contacts, $company->id); 
     $this->saveModels($banks, $company->id); 
     $this->saveModels($files, $company->id); 

     $this->redirect('/obrigado'); 
     } 
    } 
    } 

    $this->render('registration', array('company' => $company, 'contacts' => $contacts, 'banks' => $banks, 'files' => $files)); 
    } 


private function getModelItens($model_name, $times, $scenario = 'create') { 
    $models = array(); 
    for($i = 0; $i < $times; $i++) { 
    $models[$i]   = new $model_name; 
    $models[$i]->scenario = $scenario; 
    } 
    return $models; 
} 

private function validateModels($forms, $models) { 
    $valid = true; 
    foreach($forms as $k => $form) { 
    $models[$k]->attributes = $form; 
    $models[$k]->position = $k; 
    $valid = $models[$k]->validate() && $valid; 
    } 
    return $valid; 
} 

private function saveModels($models, $company_id) { 
    foreach($models as $k => $model) { 
    $model->company_id = $company_id; 
    if($model instanceOf File) { 
     if($model->save()) $this->upload_file($model, "file"); 
    } else $model->save(); 
    } 
} 


private function upload_file($model, $field, $k) { 
    $path = Yii::app()->basePath . "/../assets/files/companies/{$model->company_id}/"; 

    $file = CUploadedFile::getInstance($model, $field); 
    if($file instanceof CUploadedFile) $model->$field = $file; 

    if($model->$field instanceof CUploadedFile) { 
    if(!file_exists($path)) exec("mkdir -p {$path}"); 
    $model->$field->saveAs($path . $model->$field); 
    } 
} 

私はすべてを試みたが、私は、任意の提案をそれを修正することはできませんか?

ありがとうございました。

答えて

0

この割り当て$models[$k]->attributes = $form;があなたのモデルの$ _FILESと$ _POSTを実行するかどうかはわかりません。 this exampleを見ると、CUploadedFileのものをvalidate()またはsave()(これも有効です)より先にする必要があると思います。そうでない場合、ファイルフィールドは空白になります。

は、私はあなたがこのイベントのために必要だと思う:

  1. $model->$field = CUploadedFile::getInstance($model, $field); //設定ファイルフィールド
  2. $model->save() OR $model->validate() // THEN検証を
  3. $model->$field->saveAs($path . $model->$field); //ファイルを保存

代わりに、現在このイベントの順序があります:

  1. $model->save()
  2. $model->$field = CUploadedFile::getInstance($model, $field);
  3. $model->$field->saveAs($path . $model->$field);

私も道オフにすることができ$model->validate()、私はちょうどあなたのコードを見て、実際にこれをテストしていませんよ。また、フォーム上にmultpart/form-data属性を設定したときにエラーが発生するのはなぜなのでしょうか。それがなければまったく動かないはずです!おそらく、ファイルフィールドの検証をスキップしていたのでしょうか?またはattributes()はファイルの他に$ _POSTから何かを割り当てていましたか? /肩をすくめる

UPDATE:
起こっかもしれないもう一つは、あなたにも「$キー」で入力フィールドを参照する必要があり、「表形式」の入力(すなわちModel[0][imageFile])とのことです。だからここに、あなたが呼んでいるところ:私はあなたがまだ再する必要があるだろうと思い

$this->upload_file($model, "[".$k."]file");` 

:右のフィールド名を取得しているgetInstanceByName()よう

$this->upload_file($model, "file");` 

あなたはおそらく、このような何かを呼び出す必要があります上記のようにコードを整理してください。

幸運を祈る!

もっと読み:

  1. Yii forum post about this subject
  2. Your same question in the Yii forum
+0

こんにちは、thaddeusmt、私はすでにこのテストを行い、:(動作していない、私はへの道が存在しないと思われます – GodFather

+0

ファイルの「表形式」の入力は可能ですが、これまでにやったことがあります。上記の別の提案を追加しました。 – thaddeusmt

関連する問題