Сохранение данных
Добрый день. Подскажите пожалуйста, на сайте есть несколько форм, которые заполняются пользователями, и в каждой можно прикрепить некоторое количество файлов. Одновременно пользователь может выбрать 4 формы+одна, которая обязательная. Суть в том, что надо сохранять файлы, которые пользователь прикрепляет в формах на сервере. Есть сниппет, который обрабатывает данные из форм и потом вызывает обработчика, который сохраняет данные на сервере в соответствующих папках. Вот код обработчика форм:
global $modx;
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
return false;
}
else{
$rso_ids = filter_input(INPUT_POST, 'rso_ids');
$request_id = filter_input(INPUT_POST, 'request_id');
$is_draft = filter_input(INPUT_POST, 'is_draft');
$form = intval(filter_input(INPUT_POST, 'form'));
$rso_status = intval($is_draft) == 1 ? 1196 : 1197;
$execution_date = intval($is_draft) == 1 ? 0 : $modx->runSnippet('getExecutionDate',array('days_count' => 3));
$send_date = time();
if(stripos($rso_ids, '1112') !== false){
$fields = array(
'createdby' => $modx->user->get('id'),
'template' => 37,
'parent' => 1156,
'published' => 1,
'pagetitle' => 'New Page',
'alias' => 'new-page',
'context_key' => 'gas',
'createdon' => time()
);
$tv_fields = array(
'title' => filter_input(INPUT_POST, 'title'),
'title_small' => filter_input(INPUT_POST, 'title_small'),
'form' => $form,
'inn' => filter_input(INPUT_POST, 'inn'),
'address' => filter_input(INPUT_POST, 'address'),
'requisites' => filter_input(INPUT_POST, 'requisites'),
'email' => filter_input(INPUT_POST, 'email'),
'phone' => filter_input(INPUT_POST, 'phone'),
'object_name' => filter_input(INPUT_POST, 'object_name'),
'object_region' => filter_input(INPUT_POST, 'object_region'),
'object_address' => filter_input(INPUT_POST, 'object_address'),
'object_date' => filter_input(INPUT_POST, 'object_date'),
'object_info' => filter_input(INPUT_POST, 'object_info'),
'rso_status' => $rso_status,
'execution_date' => $execution_date,
'send_date' => $send_date,
'company_id' => filter_input(INPUT_POST, 'company_id'),
'10_service_type' => filter_input(INPUT_POST, '10_service_type'),
'10_technical_specifications' => filter_input(INPUT_POST, '10_technical_specifications'),
'10_max_rate_all' => filter_input(INPUT_POST, '10_max_rate_all'),
'10_max_rate_one' => filter_input(INPUT_POST, '10_max_rate_one'),
'10_info' => filter_input(INPUT_POST, '10_info')
);
$tv_file_fields = array(
'ip_registration' => filter_input(INPUT_POST, 'ip_registration'),
'ip_taxation' => filter_input(INPUT_POST, 'ip_taxation'),
'ip_egrip' => filter_input(INPUT_POST, 'ip_egrip'),
'ip_power' => filter_input(INPUT_POST, 'ip_power'),
'entity_charter' => filter_input(INPUT_POST, 'entity_charter'),
'entity_registration' => filter_input(INPUT_POST, 'entity_registration'),
'entity_egrul' => filter_input(INPUT_POST, 'entity_egrul'),
'entity_taxation' => filter_input(INPUT_POST, 'entity_taxation'),
'entity_power' => filter_input(INPUT_POST, 'entity_power'),
'object_ownership' => filter_input(INPUT_POST, 'object_ownership'),
'object_map' => filter_input(INPUT_POST, 'object_map'),
'10_attachment_1' => filter_input(INPUT_POST, '10_attachment_1'),
'10_attachment_2' => filter_input(INPUT_POST, '10_attachment_2'),
'10_attachment_3' => filter_input(INPUT_POST, '10_attachment_3'),
'10_attachment_4' => filter_input(INPUT_POST, '10_attachment_4'),
'10_attachment_5' => filter_input(INPUT_POST, '10_attachment_5'),
'10_attachment_6' => filter_input(INPUT_POST, '10_attachment_6'),
'10_attachment_7' => filter_input(INPUT_POST, '10_attachment_7'),
'10_attachment_8' => filter_input(INPUT_POST, '10_attachment_8'),
'10_attachment_9' => filter_input(INPUT_POST, '10_attachment_9')
);
if(intval($request_id) == 0){
$modx->runSnippet('newRSORequest',array('rso_code' => 10, 'is_draft' => $is_draft, 'fields' => $fields, 'tv_fields' => $tv_fields, 'tv_file_fields' => $tv_file_fields));
}
else{
$modx->runSnippet('editRSORequest',array('rso_code' => 10, 'is_draft' => $is_draft, 'id' => intval($request_id), 'tv_fields' => $tv_fields, 'tv_file_fields' => $tv_file_fields));
}
}
Для остальных форм код идентичен с небольшими вариациями, поэтому тут написал только для одной формы.Вот код сниппета, который сохраняет данные на сервере:
<?php
global $modx;
$month = date('m');
$year = date('y');
$user_id = $modx->user->get('id');
$tmp_path = 'users_tmp_files/'.$user_id;
$user_rso_path = 'rso/'.$rso_code.'/'.$user_id;
$rso_admin_path = '';
$res_group = 'Users';
if($rso_code == 10){
$rso_admin_path = '/gas/';
$res_group = 'Gas';
}
else if($rso_code == 20){
$rso_admin_path = '/water/';
$res_group = 'Water';
}
else if($rso_code == 30){
$rso_admin_path = '/power/';
$res_group = 'Power';
}
else if($rso_code == 40){
$rso_admin_path = '/heat/';
$res_group = 'Heat';
}
$res = $modx->newObject('modDocument');
foreach ($fields as $field => $val) {
$res->set($field, $val);
}
$res->save();
$res_id = $res->get('id');
$rso_request_id = $rso_code.$month.$year.$res_id;
if(!is_dir($user_rso_path)){
mkdir($user_rso_path, 0755);
}
$rso_request_path = $user_rso_path.'/'.$rso_request_id;
if(!is_dir($rso_request_path)){
mkdir($rso_request_path, 0777);
}
$res = $modx->getObject('modResource', $res_id);
$res->set('pagetitle', $rso_request_id);
$res->set('alias', $rso_request_id);
$res->joinGroup($res_group);
$res->save();
$tv_request_id = $modx->getObject('modTemplateVar',array('name'=> 'request_id'));
$tv_request_id->setValue($res_id, $rso_request_id);
$tv_request_id->save();
foreach ($tv_fields as $tv_field => $val) {
$tvcid = $modx->getObject('modTemplateVar',array('name'=> $tv_field));
$tvcid->setValue($res_id, $val);
$tvcid->save();
}
foreach ($tv_file_fields as $tv_field => $val) {
if(!empty($val)){
$tvcid = $modx->getObject('modTemplateVar',array('name'=> $tv_field));
$tvcid->setValue($res_id, $rso_request_path.'/'.$val);
$tvcid->save();
copy($tmp_path.'/'.$val, $rso_request_path.'/'.$val);
unlink($tmp_path.'/'.$val);
}
}
$send_date = $modx->runSnippet('getDateFromUnixTime',array('unixtime' => $tv_fields['send_date']));
$execution_date = $tv_fields['execution_date'] == 0 ? '-' : $modx->runSnippet('getDateFromUnixTime',array('unixtime' => $tv_fields['execution_date']));
$modx->runSnippet('writeToRSOLog', array('file' => $rso_request_path.'/'.'request.log', 'service_type' => $tv_fields[$rso_code.'_service_type'], 'rso_status' => $tv_fields['rso_status'], 'note' => '-', 'send_date' => $send_date, 'execution_date' => $execution_date, 'author' => 'Пользователь'));
Когда форма одна заполняет всё работает замечательно, но когда несколько форм с файлами, то он сохраняет только файлы последней. Никак не могу понять, в чём ошибка. Подскажите пожалуйста.