%s

'; $label = function($data) { return array('#text' => $data, '#class' => ['label'], '#style' => ['float:none;']); }; $form['form_attributes']['enctype'] = 'multipart/form-data'; $form['form_attributes']['js'][] = 'engine/classes/WebAppRaiser/forms/MessageChatForm.js'; $form['order_id'] = array( 'inputs' => array( '#type'=> 'hidden', ), ); $form['object_id'] = array( 'inputs' => array( '#type'=> 'hidden', ), ); $form['markup_start'] = array( '#markup' => '
', ); $form['userName'] = array( '#prefix' => '
'.sprintf($header, 'Сообщение'), 'label'=> $label('ФИО отправителя'), 'inputs' => array( '#type'=> 'text', '#required'=> false, '#inputs_style' => 'float:none; width:90%', ), ); $form['comment'] = array( 'label'=> $label('Комментарий'), 'inputs' => array( '#type'=> 'textarea', '#required'=> true, '#rows' => 8, '#inputs_style' => 'float:none; width:90%', ), '#suffix' => '
', ); /* $form['category'] = array( '#prefix' => '
'.sprintf($header, 'Файлы').'

Вы можете прикрепить файлы к сообщению.

', 'label'=> $label('Категория'), 'inputs' => array( '#type'=> 'select', '#options' => array( 'Правоустанавливающие документы' => 'Правоустанавливающие документы', 'Разворот паспорта' => 'Разворот паспорта', 'Техническая документация' => 'Техническая документация', ), //'#required'=> true, '#inputs_style' => 'float:none; width:90%', ), ); $categories = WebAppRaiserDocs::getCategories(); $form['category']['inputs']['#options'] = array_merge( $form['category']['inputs']['#options'], $categories, ['Другое' => 'Другое'] ); $form['other_category'] = array( 'inputs' => array( '#type' => 'text', '#attributes' => array( 'placeholder' => 'Категория', ), '#inputs_style' => 'float:none; width:90%', ), ); $form['files'] = array( 'label'=> $label('Файлы'), 'inputs' => array( '#type'=> 'file', //'#required'=> true, '#multiple' => true, '#attributes' => array( 'accept' => '.jpg, .jpeg, .png, .pdf', ), '#inputs_style' => 'float:none; width:90%', ), 'description' => 'Можно выбрать несколько файлов', '#suffix' => '
', ); // */ $form['markup_end'] = array( '#markup' => '
', ); $form['submit'] = array( 'inputs' => array( '#type'=> 'submit', '#value'=> 'Сохранить', ), ); return $form; } public function validate() { $status = parent::validate(); return $status; } public function submit($status, &$page, WebAppRaiserAPI $WebAppRaiserAPI) { parent::submit($status, $page, $WebAppRaiserAPI); $page['status'] = $status['code']; $page['msg'] = array_merge($page['msg'], $status['message']); if($status['code'] == 'success'){ $files_dir = WebAppRaiserDocs::filesDir(); $filepath = $status['post']['object_id'].'/'.$status['post']['order_id'].'/'; if(!is_dir($files_dir.$filepath)){ mkdir($files_dir.$filepath, 0755, true); } $files_for_api = array(); //$files_for_db = array(); $flag_files_ok = true; if(!empty($_FILES['files'])) { foreach($_FILES['files']['error'] as $key => $value){ if($value != UPLOAD_ERR_OK) { $flag_files_ok = false; $page['status'] = 'error'; $page['msg'][] = WebAppRaiserDocs::errorCodes()[$value].': '.$_FILES['files']['name'][$key]; } } if($flag_files_ok){ // сохраняем файлы в папку $agency = User::getUserAgencyID(); $category = ($status['post']['category']=='Другое')?$status['post']['other_category']:$status['post']['category']; foreach($_FILES['files']['tmp_name'] as $key => $tmp_name){ $fname_submit = $_FILES['files']['name'][$key]; $fname = $this->checkFileName($fname_submit, $files_dir.$filepath); if(move_uploaded_file($tmp_name, $files_dir.$filepath.$fname)){ $data = file_get_contents($files_dir.$filepath.$fname); $files_for_api[] = array( 'name' => $fname, 'data' => base64_encode($data), ); /*$files_for_db[] = array( 'fid' => 0, 'order_id' => $status['post']['order_id'], 'object_id' => $status['post']['object_id'], 'file_path' => $filepath, 'file_name' => $fname, 'category' => $category, 'manager' => $WebAppRaiserAPI->get('war_username'), 'owner' => $WebAppRaiserAPI->get('war_user_id'), 'agency' => $agency, ); // */ } else { $flag_files_ok = false; $page['status'] = 'error'; $page['msg'][] = 'Не удалось сохранить файл в папку назначения: '.$files_dir.$filepath.$fname; } } } } // Отправляем файлы по API $fields_api = array( 'userName' => $status['post']['userName'], 'text' => $status['post']['comment'], ); if(!empty($files_for_api)){ $fields_api['files'] = array( 0 => array( 'name' => $category, 'files' => $files_for_api, ), ); } //$page['msg'][] = dpm(['API FILES', $status['post']['order_id'], $fields_api]); $result = $WebAppRaiserAPI->sendChatMessage($status['post']['order_id'], $fields_api); //$page['msg'][] = dpm(['API result', $result]); $page['status'] = $result['status']; $page['msg'][] = $result['msg']; //$page['msg'][] = $result['body']; if($result['status'] == 'success'){ //TODO записать событие в базу $page["msg"][] = "Сообщение отправлено."; $page["status"] = 'success'; $flag_db_ok = true; $valid_fields = array( 'id' => 'id', 'date' => 'date', 'type' => 'type', 'orderId' => 'orderId', 'fields' => 'fields', ); /*$comment = $status['post']['userName']. ': ' .$status['post']['comment']; $fields_db = array( 'id' => $result['result']['id'], 'date' => time(), 'type' => 'CHAT_MESSAGE', 'orderId' => $status['post']['order_id'], 'fields' => base64_encode(serialize(['comment' => $comment])), ); // */ //$fid = WebAppRaiserDB::save('war_msg', $fields_db, $valid_fields, 'id'); /*foreach($files_for_db as $fields_db){ $fid = WebAppRaiserDB::save('war_files', $fields_db, $valid_fields, 'fid'); if(!$fid) { $flag_db_ok = false; } } // */ /*if($fid){ $page["msg"][] = "Сообщение сохранено в базу"; $page["status"] = 'success'; } else{ $page["msg"][] = "Возникла проблема при сохранении сообщения в базу данных."; $page["status"] = 'error'; } // */ } else { $page["msg"][] = "Возникла проблема при отправке сообщения."; $page["msg"][] = $result['result']['message']; $page["status"] = 'error'; } } else { // валидация не прошла } parent::redirect($page); } private function checkFileName($filename, $filepath, $i = 0) { if(!is_file($filepath.$filename)){ return $filename; } else { $name = substr($filename, 0, strrpos($filename, '.')); $ext = substr($filename, strrpos($filename, '.')); if($i > 99) { return $name.'_'.$i.$ext; } if(!is_file($filepath.$name.'_'.$i.$ext)) { return $name.'_'.$i.$ext; } else { $i++; return $this->checkFileName($filename, $filepath, $i); } } } }