Как работать с множественной загрузкой в нескольких формах в yii2
Добрый день всем, я генерирую многократную модель с ajax(множественный ввод не подходит в моем случае). и я собираю такие модели:
Теперь у меня есть проблема с множественной загрузкой в нескольких формах в контроллере, файлы теперь выглядят как ниже
я знаю, как работать с множественной загрузкой, если файлы выглядят так
используя $model -> files = UploadedFile::getInstances($model, 'files');
может кто знает как загрузить файлы по делу?
1 ответ
Решить как ниже
$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');
}
}