Табличная форма проверки Yii не может загружать файлы - PullRequest
0 голосов
/ 04 октября 2011

У меня возникают некоторые проблемы при попытке загрузить несколько файлов в нескольких экземплярах моей модели (в табличной форме).

У меня есть модель с именем Files и представление, которое генерирует форму для нескольких экземпляров этой модели. Когда я сохраняю форму без «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);
  }
}

Я пробовал все, но я не могу это исправить, есть предложения?

Спасибо.

1 Ответ

0 голосов
/ 05 октября 2011

Я не уверен, что это назначение $models[$k]->attributes = $form; подойдет для $ _FILES и $ _POST для вашей модели.Глядя на этот пример , я думаю, что вам нужно сделать это CUploadedFile перед вами validate() или save() (что также проверяет), в противном случае поле вашего файла будет пустым.

Я думаю, что вам нужен этот порядок событий:

  1. $model->$field = CUploadedFile::getInstance($model, $field); // установить поле файла
  2. $model->save() ИЛИ $model->validate() // ТО проверять
  3. $model->$field->saveAs($path . $model->$field); // затем сохраняем файл

Вместо этого у вас есть следующий порядок событий:

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

Хотя я могу быть далеко, я просто смотрю на ваш код и фактически не проверяю это.Кроме того, я понятия не имею, почему он выдает ошибку только при установке атрибута multpart/form-data в форме;это не должно работать вообще без этого!Возможно это пропускало проверку на полях файла без этого?Или attributes() назначал что-то из $ _POST помимо файла?/ shrug

ОБНОВЛЕНИЕ:
Другая вещь, которая может происходить, заключается в том, что при «табличном» вводе вам также необходимо ссылаться на поле ввода с помощью клавиши «$» (т.е.Model[0][imageFile]).Итак, вот, куда вы звоните:

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

Возможно, вам нужно позвонить примерно так, чтобы getInstanceByName() получил правильное имя поля:

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

Я думаю, что вывсе равно нужно будет перестроить ваш код, как я уже упоминал выше.

Удачи!

Подробнее:

  1. Сообщение на форуме Yii об этомтема
  2. Ваш тот же вопрос на форуме Yii
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...