как работать с несколькими загрузками в нескольких формах в yii2 - PullRequest
0 голосов
/ 29 октября 2018

Добрый день всем, я генерирую многократную модель с ajax (множественный ввод не подходит в моем случае). enter image description here и я собираю такие модели:

enter image description here enter image description here

теперь у меня проблема с множественной загрузкой в ​​нескольких формах в контроллере, файлы теперь выглядят как показано ниже

enter image description here

я знаю, как работать с множественной загрузкой, если файлы выглядят так

enter image description here

с помощью $model -> files = UploadedFile::getInstances($model, 'files');

может, кто-то знает, как загружать файлы в дело?

1 Ответ

0 голосов
/ 08 ноября 2018

решить, как показано ниже

$order_parts =  Yii::$app -> request -> post('OrderPart');
                $order_part_model_id = [];
    if (!empty($_FILES['OrderPart'])) {
                        $order_part_files = [];
                        $file_name = [];
                        $file_type = [];
                        $file_tmp_name = [];
                        $file_error = [];
                        $file_size = [];
                        foreach ($_FILES['OrderPart'] as $file_key => $files) {
                            if ($file_key == 'name') {
                                foreach ($files as $file) {
                                    $file_name[] = $file;
                                }
                            }
                            if ($file_key == 'type') {
                                foreach ($files as $file) {
                                    $file_type[] = $file;
                                }
                            }
                            if ($file_key == 'tmp_name') {
                                foreach ($files as $file) {
                                    $file_tmp_name[] = $file;
                                }
                            }
                            if ($file_key == 'error') {
                                foreach ($files as $file) {
                                    $file_error[] = $file;
                                }
                            }
                            if ($file_key == 'size') {
                                foreach ($files as $file) {
                                    $file_size[] = $file;
                                }
                            }
                        }
                        Yii::info('order_part_files count '.count($file_name), 'request');
                        for ($i = 0; $i < count($file_name); $i++) {
                            $order_part_files[$i]['name'] = $file_name[$i];
                            $order_part_files[$i]['type'] = $file_type[$i];
                            $order_part_files[$i]['tmp_name'] = $file_tmp_name[$i];
                            $order_part_files[$i]['error'] = $file_error[$i];
                            $order_part_files[$i]['size'] = $file_size[$i];
                        }
                        Yii::info('order_part_files', 'request');
                        Yii::info($order_part_files, 'request');
                        //
                        if (!empty($order_part_files)) {
                        for ($i = 0; $i < count($order_part_files); $i++) {
                            $_FILES['OrderPart'.$i] = $order_part_files[$i];
                            Yii::info('Order Part New Files #' . $i, 'request');
                            Yii::info($_FILES['OrderPart'.$i], 'request');
                        }

                    } else {
                        Yii::info('=====files are empty=====', 'request');
                    }
                    //
                } else {
                    Yii::info('===== no files were uploaded =====', 'request');
                }
foreach ($order_parts as $order_part_key => $order_part){
      ...
$order_part_model = new OrderPart();
...
//here i am using getInstancesByName, because i have to upload files like an array without calling model like so $order_part_model -> files = UploadedFile::getInstances($order_part_model, 'files');
$order_part_model -> files = UploadedFile::getInstancesByName('OrderPart'.$order_part_key);
                    $path ="files/request/";
                    if($order_part_model -> save()){
                        $order_part_model_id[] = $order_part_model -> id;
                        Yii::info('order_part_model saved.', 'request');
                        if (!empty($order_part_model -> files)) {
                            Yii::info('order_part -> files #' . $order_part_key, 'request');
                            Yii::info($order_part_model -> files, 'request');
                            $name = [];
                            if(!file_exists(($path))){
                                mkdir($path,0777,true);
                            }
                            foreach ($order_part_model -> files as $uploadedFile){
                                $current_name = $path.time(). '_' .Functions::generateRandomString(10).'.'.$uploadedFile->extension;
                                $uploadedFile -> saveAs($current_name);
                                $name[] = "/" . $current_name;
                            }
                            Yii::$app->db->createCommand()->update('order_part',
                                ['files_location' => json_encode($name, true)],
                                ['id' => $order_part_model -> id]
                            )->execute();
                            $order_part_model -> files = [];
                        } else {
                            Yii::info('there is no uploaded files', 'request');
                        }
                    } else {
                        Yii::info('order_part_model saving error', '_error');
                    }
}
...