2011-10-04 112 views
0

当我尝试上传多个文件在我的模型的多个实例(表格方式)时遇到一些问题。Yii验证表格形式不能上传文件

我有一个称为文件的模型和一个为该模型的多个实例生成表单的视图。当我保存没有“multpart/form-data”的表单时,一切正常,但如果我将此参数放在表单上并提交,验证会显示“文件不能为空”的消息。

看到我的控制器代码波纹管:

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,我认为你需要在validate()save()(它也会生效)之前做CUploadedFile的东西,否则你的文件字段将会是空白的。

我认为你需要这些事件的顺序:

  1. $model->$field = CUploadedFile::getInstance($model, $field); //设置文件中的字段
  2. $model->save() OR $model->validate() //然后再验证
  3. $model->$field->saveAs($path . $model->$field); //然后保存文件

取而代之,您目前有以下事件顺序:

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

我可以的路要走,虽然,我只是看你的代码,而不是实际测试这一点。另外,我不知道为什么当你在窗体上设置multpart/form-data属性时它只会抛出一个错误;没有这个,它不应该工作!也许它没有这样就跳过了对文件字段的验证?或者attributes()除了文件之外还从$ _POST分配了一些东西? /耸肩

UPDATE:
是可能发生的另一件事,是与“表格”输入你需要引用输入域“$键”以及(即Model[0][imageFile])。所以在这里,你在哪里打电话:

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

你可能需要调用这样的事情,让getInstanceByName()是获得正确的字段名称:

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

我想你仍然需要重新按照我上面提到的方式安排您的代码。

祝你好运!

更多阅读:

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

嗨,thaddeusmt,我已经作出了这个测试,而不是工作:(,我觉得没有办法上传文件使用CUploadedFile和表格式输入。你有另外一个建议吗? – GodFather

+0

那么,“表格式”的输入文件*是可能的,我已经完成了这项工作,我添加了上面的另一个建议供你调查。 – thaddeusmt