public function save($value) { $nc_core = nc_Core::get_object(); $array_name = $this->parent->get_array_name(); if (!empty($value['old']) && !empty($value['kill'])) { list($filename, $filetype, $filesize, $filepath) = explode(':', $value['old']); unlink($nc_core->FILES_FOLDER . $filepath); $this->value = $value['old'] = ''; } if ($_FILES[$array_name]['error'][$this->name]) { if ($value['old']) { $this->value = $value['old']; } return 0; } $tmp_name = $_FILES[$array_name]['tmp_name'][$this->name]; $filetype = $_FILES[$array_name]['type'][$this->name]; $filename = $_FILES[$array_name]['name'][$this->name]; // nothing was changed if (!empty($value['old']) && empty($value['kill']) && !$filetype) { if ($value['old']) { $this->value = $value['old']; } return 0; } $folder = $nc_core->FILES_FOLDER . 'cs/'; $put_file_name = nc_transliterate($filename); $put_file_name = nc_get_filename_for_original_fs($put_file_name, $folder, array()); $nc_core->files->create_dir($folder); move_uploaded_file($tmp_name, $folder . $put_file_name); $filesize = filesize($folder . $put_file_name); if ($filesize) { $this->value = $filename . ':' . $filetype . ':' . $filesize . ':cs/' . $put_file_name; } else { $this->value = ''; } $this->upload = true; $this->filename = $filename; $this->filetype = $filetype; $this->filesize = $filesize; $this->filepath = $folder . $put_file_name; }
/** * Копирование объекта из одного шаблона в разделе в другой. * * Пользователь должен обладать правами: изменение в разделе, где * находится объект, и удаление в разделе, куда переносится объект. * * @param integer ID класса объекта * @param integer ID объекта * @param integer ID шаблона в разделе, куда переносится объект * @return boolean */ function nc_copy_message($class_id, $message_id, $destination_cc_id) { global $nc_core, $db; $class_id = (int) $class_id; $message_id = (int) $message_id; $destination_cc_id = (int) $destination_cc_id; if (!$class_id || !$message_id || !$destination_cc_id) { trigger_error("Wrong parameters for nc_copy_message()", E_USER_WARNING); return false; } // данные о месте назначения $dest_subclass = $db->get_row("SELECT sd.Catalogue_ID,\n sc.Sub_Class_ID,\n sc.Subdivision_ID,\n sc.Class_ID,\n IFNULL(MAX(m.Priority)+1,1) as Next_Priority\n FROM (Sub_Class as sc,\n Subdivision as sd)\n LEFT JOIN Message{$class_id} as m\n ON m.Sub_Class_ID=sc.Sub_Class_ID\n WHERE sc.Sub_Class_ID={$destination_cc_id}\n AND sc.Subdivision_ID=sd.Subdivision_ID\n GROUP BY m.Sub_Class_ID\n ", ARRAY_A); // переносимый объект $message = $db->get_row("SELECT * FROM Message{$class_id} WHERE Message_ID = {$message_id}", ARRAY_A); if (!$message || !$dest_subclass) { $what = $message ? 'subclass' : 'object'; trigger_error("nc_copy_message: {$what} doesn't exist", E_USER_WARNING); return false; } if ($dest_subclass['Class_ID'] != $class_id) { trigger_error("nc_copy_message: destination subclass belongs to different class", E_USER_WARNING); return false; } // if ($dest_subclass['Sub_Class_ID'] == $message['Sub_Class_ID']) { return true; } // Проверка на копирование объекта внутри одного $cc // права // Пользователь должен обладать правами: чтение в разделе, где // находится объект, и добавление в разделе, куда переносится объект. global $perm; $has_rights = false; $has_rights = $perm->isSubClass($message['Sub_Class_ID'], 48) && $perm->isSubClass($dest_subclass['Sub_Class_ID'], 48); if (!$has_rights) { trigger_error("nc_copy_message: insufficient rights", E_USER_WARNING); return false; } // end of права global $AUTH_USER_ID, $HTTP_USER_AGENT; $message['Message_ID'] = ''; $message['Subdivision_ID'] = $dest_subclass['Subdivision_ID']; $message['Sub_Class_ID'] = $dest_subclass['Sub_Class_ID']; $message['Priority'] = $dest_subclass['Next_Priority']; $message['Created'] = $message['LastUpdated'] = date("Y-m-d H:i:s"); $message['UserAgent'] = $message['LastUserAgent'] = $HTTP_USER_AGENT; $message['IP'] = $message['LastIP'] = getenv("REMOTE_ADDR"); $message['Keyword'] = nc_unique_message_keyword($message['Keyword'], $class_id); $col_names = array_keys($message); if (!empty($col_names)) { foreach ($col_names as $k => $v) { $col_names[$k] = "`" . $v . "`"; } $col_names_string = join(", ", $col_names); } $col_values = array_values($message); foreach ($col_values as &$value) { $value = $db->prepare($value); } $col_values_string = join("', '", $col_values); // execute core action $nc_core->event->execute("addMessagePrep", $dest_subclass['Catalogue_ID'], $dest_subclass['Subdivision_ID'], $dest_subclass['Sub_Class_ID'], $class_id, 0); $db->query("INSERT INTO Message{$class_id} (" . $col_names_string . ") VALUES ('" . $col_values_string . "')"); $new_message_id = $db->insert_id; // execute core action $nc_core->event->execute("addMessage", $dest_subclass['Catalogue_ID'], $dest_subclass['Subdivision_ID'], $dest_subclass['Sub_Class_ID'], $class_id, $new_message_id); // копирование детей $childs_id = $db->get_col("SELECT `Message_ID` FROM `Message" . $class_id . "` WHERE `Parent_Message_ID` = '" . $message_id . "' "); if (!empty($childs_id)) { foreach ($childs_id as $child_id) { $new_child_id = nc_copy_message($class_id, $child_id, $destination_cc_id); // у дочернего объекта Parent message id остался от копируемого объекта $db->query("UPDATE `Message" . $class_id . "` SET `Parent_Message_ID` = '" . $new_message_id . "' WHERE `Message_ID` = '" . $new_child_id . "' "); } } // prepare dirs global $FILES_FOLDER, $DIRCHMOD, $DOCUMENT_ROOT, $SUB_FOLDER; require_once $GLOBALS['INCLUDE_FOLDER'] . "s_common.inc.php"; // файлы // Поля типа "файл" в компоненте $file_fields = $db->get_results("SELECT `Field_ID`, `Format`, `Field_Name`\n FROM `Field`\n WHERE Class_ID='" . $class_id . "'\n AND TypeOfData_ID='" . NC_FIELDTYPE_FILE . "'", ARRAY_A); if (!empty($file_fields)) { // проходим по каждому полю foreach ($file_fields as $field) { // если нету файл у исходного объекта - то переходим к следующему полю if (!$message[$field['Field_Name']]) { continue; } // определение файловой системы для записи нового файла $parsedFormat = nc_field_parse_format($field['Format'], NC_FIELDTYPE_FILE); $fs = $parsedFormat['fs']; //исходный файл $src_file_path = nc_file_path($class_id, $message_id, $field['Field_ID']); // его путь $value_array = explode(':', $message[$field['Field_Name']]); $src_file_name = $value_array[0]; // оригинальное имя $src_file_type = $value_array[1]; // тип $src_file_size = $value_array[2]; // размер $ext = substr($src_file_name, strrpos($src_file_name, ".")); // расширение // в зависимости от ФС менятеся папка и имя на диске + значени в БД switch ($fs) { case NC_FS_SIMPLE: $put_file_name = $field['Field_ID'] . "_" . $new_message_id . $ext; // имя файла: IDполя_IDобъекта.расширение $FilePath = ''; // в папку netcat_files $fieldValue = $src_file_name . ":" . $src_file_type . ":" . $src_file_size; // значение в базу break; case NC_FS_ORIGINAL: $put_file_name = nc_transliterate($src_file_name); $FilePath = "{$dest_subclass['Subdivision_ID']}/{$dest_subclass['Sub_Class_ID']}/"; #check and create dirs $dirs = array($FILES_FOLDER . $dest_subclass['Subdivision_ID'], $FILES_FOLDER . $dest_subclass['Subdivision_ID'] . '/' . $dest_subclass['Sub_Class_ID']); foreach ($dirs as $dir) { if (!file_exists($dir) && !mkdir($dir, $DIRCHMOD)) { return false; } // can't create dir } $k = 0; // файл с таким именем может существовать - нужно добавить индекс if (file_exists($FILES_FOLDER . $FilePath . $put_file_name)) { while (file_exists($FILES_FOLDER . $FilePath . substr($put_file_name, 0, strrpos($put_file_name, ".")) . "_" . $k . $ext)) { $k++; } $put_file_name = substr($put_file_name, 0, strrpos($put_file_name, ".")) . "_" . $k . $ext; } $fieldValue = $src_file_name . ":" . $src_file_type . ":" . $src_file_size . ":" . $FilePath . $put_file_name; // значение в базу break; case NC_FS_PROTECTED: #check and create dirs $dirs = array($FILES_FOLDER . $dest_subclass['Subdivision_ID'], $FILES_FOLDER . $dest_subclass['Subdivision_ID'] . '/' . $dest_subclass['Sub_Class_ID']); foreach ($dirs as $dir) { if (!file_exists($dir) && !mkdir($dir, $DIRCHMOD)) { return false; } // can't create dir } // директория $FilePath = "/{$dest_subclass['Subdivision_ID']}/{$dest_subclass['Sub_Class_ID']}/"; // имя файла $put_file_name = md5($src_file_name . date("H:i:s d.m.Y") . uniqid("NetCat")); // в таблицу Filetable $db->query("INSERT INTO Filetable (ID, Real_Name, Virt_Name, File_Path, File_Type, File_Size, Message_ID, Field_ID)\n VALUES ('', '" . $src_file_name . "', '" . $put_file_name . "', '" . $FilePath . "', '" . $src_file_type . "',\n '" . $src_file_size . "', '" . $new_message_id . "', '" . $field['Field_ID'] . "')"); $fieldValue = $src_file_name . ":" . $src_file_type . ":" . $src_file_size; // значение в базу break; } // копирование файла copy($DOCUMENT_ROOT . $src_file_path, $FILES_FOLDER . $FilePath . $put_file_name); // правка в БД $db->query("UPDATE `Message" . $class_id . "` SET `" . $field['Field_Name'] . "` = '" . $fieldValue . "' WHERE `Message_ID`='" . $new_message_id . "'"); } } // Поля типа "множественная загрузка" в компоненте $multifile_fields = $db->get_results("SELECT `Field_ID`, `Format`, `Field_Name`\n FROM `Field`\n WHERE Class_ID='" . $class_id . "'\n AND TypeOfData_ID='" . NC_FIELDTYPE_MULTIFILE . "'", ARRAY_A); // проходим по каждому полю foreach ((array) $multifile_fields as $field) { $field_id = (int) $field['Field_ID']; $settings_http_path = nc_standardize_path_to_folder($nc_core->HTTP_FILES_PATH . "/multifile/{$field_id}/"); $settings_path = nc_standardize_path_to_folder($nc_core->DOCUMENT_ROOT . '/' . $nc_core->SUB_FOLDER . '/' . $settings_http_path); //получаем список файлов $sql = "SELECT `Priority`, `Name`, `Size`, `Path`, `Preview` FROM `Multifield` WHERE `Field_ID` = {$field_id} AND `Message_ID` = {$message_id}"; $files = $db->get_results($sql, ARRAY_A); foreach ((array) $files as $file) { foreach (array('Path', 'Preview') as $path) { $file_path = $file[$path]; if ($file_path) { $parts = explode('/', nc_standardize_path_to_file($file_path)); $file_name = array_pop($parts); $file_http_path = nc_standardize_path_to_folder(implode('/', $parts)); $file_path = nc_standardize_path_to_folder($nc_core->DOCUMENT_ROOT . '/' . $nc_core->SUB_FOLDER . '/' . $file_http_path); $new_file_name = nc_get_filename_for_original_fs($file_name, $file_path); @copy($file_path . $file_name, $file_path . $new_file_name); $file[$path] = $file_http_path . $new_file_name; } } $priority = (int) $file['Priority']; $name = $db->escape($file['Name']); $size = (int) $file['Size']; $path = $db->escape($file['Path']); $preview = $db->escape($file['Preview']); $sql = "INSERT INTO `Multifield` (`Field_ID`, `Message_ID`, `Priority`, `Name`, `Size`, `Path`, `Preview`) VALUES " . "({$field_id}, {$new_message_id}, {$priority}, '{$name}', {$size}, '{$path}', '{$preview}')"; $db->query($sql); } } return $new_message_id; }
/** * Saves mail attachment form * * @param string $type * @return bool */ function nc_mail_attachment_form_save($type, $from_type = '') { $nc_core = nc_Core::get_object(); $db = $nc_core->db; if (!$from_type) { $from_type = $type; } $type_escaped = $db->escape($type); $delete = (array) $nc_core->input->fetch_post('mail_attachment_' . $from_type . '_delete'); foreach ($delete as $item) { $item = (int) $item; $sql = "SELECT `Path` FROM `Mail_Attachment` WHERE `Type` = '{$type_escaped}' AND `Mail_Attachment_ID` = {$item}"; $path = $db->get_var($sql); if ($path) { @unlink($path); $sql = "DELETE FROM `Mail_Attachment` WHERE `Type` = '{$type_escaped}' AND `Mail_Attachment_ID` = {$item}"; $db->query($sql); } } if (isset($_FILES['mail_attachment_' . $from_type . '_file'])) { $file_names = $nc_core->input->fetch_post('mail_attachment_' . $from_type . '_file_name'); foreach ($_FILES['mail_attachment_' . $from_type . '_file']['tmp_name'] as $index => $tmp_name) { if ($file_names[$index]) { $http_path = nc_standardize_path_to_folder($nc_core->HTTP_FILES_PATH . "/mail_attachment/{$type}/"); $path = nc_standardize_path_to_folder($nc_core->DOCUMENT_ROOT . '/' . $nc_core->SUB_FOLDER . '/' . $http_path); $file_name = $file_names[$index]; $name_parts = explode('.', $_FILES['mail_attachment_' . $from_type . '_file']['name'][$index]); $file_ext = $name_parts[count($name_parts) - 1]; $fs_file_name = nc_get_filename_for_original_fs($file_name . '.' . $file_ext, $path); if (!file_exists($path)) { mkdir($path, 0777, true); } if (move_uploaded_file($tmp_name, $path . $fs_file_name)) { $type = $db->escape($type); $file_name = $db->escape($file_name); $path = $db->escape($http_path . $fs_file_name); $extension = $db->escape($file_ext); $content_type = $db->escape($_FILES['mail_attachment_' . $from_type . '_file']['type'][$index]); $sql = "INSERT INTO `Mail_Attachment` (`Type`, `Filename`, `Path`, `Extension`, `Content_Type`) " . "VALUES ('{$type}', '{$file_name}', '{$path}', '{$extension}', '{$content_type}')"; $db->query($sql); } } } } return true; }
function nc_copy_subdivision($sub_ids, $dest_catalogue_id, $dest_parent_sub_id, $with_child = 1, $with_сс = 1, $with_object = 1, $templates = array()) { $nc_core = nc_Core::get_object(); global $db; if (!is_array($sub_ids)) { $sub_ids = array($sub_ids); } if (!$with_сс) { $with_object = 0; } if (!$templates['sub_name']) { $templates['sub_name'] = '%NAME%'; } if (!$templates['sub_keyword']) { $templates['sub_keyword'] = '%KEYWORD%'; } if (!$templates['cc_name']) { $templates['cc_name'] = '%NAME%'; } if (!$templates['cc_keyword']) { $templates['cc_keyword'] = '%KEYWORD%'; } // разделы для копирования $subdivisions = $db->get_results("SELECT * FROM `Subdivision`\n WHERE `Subdivision_ID` IN (" . join(',', $sub_ids) . ")\n ORDER BY `Subdivision_ID` ", ARRAY_A); if (empty($subdivisions)) { return 0; } if ($dest_parent_sub_id && in_array($dest_parent_sub_id, $sub_ids)) { throw new Exception(TOOLS_COPYSUB_ERROR_LEVEL_COUNT); } // копирование в определенный раздел - можно вычислить сайт if ($dest_parent_sub_id) { $dest_subdivision = $db->get_row("SELECT `Catalogue_ID`, `Hidden_URL`, `EnglishName` FROM `Subdivision` WHERE `Subdivision_ID` = '" . $dest_parent_sub_id . "'", ARRAY_A); $dest_catalogue_id = $dest_subdivision['Catalogue_ID']; $hidden_url = $dest_subdivision['Hidden_URL']; $english_name = $dest_subdivision['EnglishName']; $child_english_names = $db->get_col("SELECT `EnglishName` FROM `Subdivision` WHERE `Parent_Sub_ID` = '" . $dest_parent_sub_id . "' "); } else { $hidden_url = '/'; $child_english_names = $db->get_col("SELECT `EnglishName` FROM `Subdivision` WHERE `Parent_Sub_ID` = '0' AND `Catalogue_ID` = '" . $dest_catalogue_id . "' "); } if (!$child_english_names) { $child_english_names = array(); } $fields = array_keys($subdivisions[0]); $query_fields_subdivisions = array(); $insert_values_subdivisions = array(); unset($fields[0]); foreach ($fields as $v) { $query_fields_subdivisions[] = "`" . $v . "`"; } foreach ($subdivisions as $subdivision) { $rel[$subdivision['Subdivision_ID']] = 0; // связка между старыми и новыми id $subdivision['Subdivision_Name'] = str_replace('%NAME%', $subdivision['Subdivision_Name'], $templates['sub_name']); $subdivision['Subdivision_Name'] = str_replace('%KEYWORD%', $subdivision['EnglishName'], $subdivision['Subdivision_Name']); $subdivision['EnglishName'] = str_replace('%KEYWORD%', $subdivision['EnglishName'], $templates['sub_keyword']); $subdivision['Parent_Sub_ID'] = $dest_parent_sub_id; $subdivision['Catalogue_ID'] = $dest_catalogue_id; $subdivision['Created'] = $subdivision['LastUpdated'] = date("Y-m-d H:i:s"); $subdivision['Hidden_URL'] = $hidden_url . $subdivision['EnglishName'] . '/'; if (!$nc_core->subdivision->validate_english_name($subdivision['EnglishName'])) { throw new Exception(CONTROL_CONTENT_SUBDIVISION_INDEX_ERROR_THREE_KEYWORD_INVALID . "<br/>" . $subdivision['EnglishName']); } //if ( $english_name == $subdivision['EnglishName'] ) { // throw new Exception(TOOLS_COPYSUB_ERROR_KEYWORD_EXIST); //} if (in_array($subdivision['EnglishName'], $child_english_names)) { throw new Exception(TOOLS_COPYSUB_ERROR_KEYWORD_EXIST); } // нельзя скопировать раздел в подраздел этого же раздела if ($dest_parent_sub_id) { $childs = nc_get_subdivision_children($subdivision['Subdivision_ID']); if (!empty($childs) && in_array($dest_parent_sub_id, $childs)) { throw new Exception(TOOLS_COPYSUB_ERROR_LEVEL_COUNT); } } $query_values = array(); foreach ($fields as $v) { $query_values[] = "'" . $db->escape($subdivision[$v]) . "'"; } $insert_values_subdivisions[$subdivision['Subdivision_ID']] = "(" . join(',', $query_values) . ")"; } $nc_core->event->execute("addSubdivisionPrep", $dest_catalogue_id, 0); foreach ($insert_values_subdivisions as $Subdivision_ID => $insert_value_subdivisions) { $db->query("INSERT INTO `Subdivision` (" . join(',', $query_fields_subdivisions) . ") VALUES {$insert_value_subdivisions}"); if ($db->is_error) { throw new nc_Exception_DB_Error($db->last_query, $db->last_error); } $inserted_id = $db->insert_id; $rel[$Subdivision_ID] = $inserted_id; if (!is_dir($nc_core->FILES_FOLDER . $inserted_id)) { @mkdir($nc_core->FILES_FOLDER . $inserted_id, $nc_core->DIRCHMOD); @chmod($nc_core->FILES_FOLDER . $inserted_id, $nc_core->DIRCHMOD); } } $nc_core->event->execute("addSubdivision", $dest_catalogue_id, $rel); // компоненты в разделе для копирования $sub_classes = !$with_сс ? null : $db->get_results("SELECT * FROM `Sub_Class`\n WHERE `Subdivision_ID` IN (" . join(',', $sub_ids) . ")\n ORDER BY `Sub_Class_ID`", ARRAY_A); $query_fields_subclasses = array(); $insert_values_subclasses = array(); if (!empty($sub_classes)) { $fields = array_keys($sub_classes[0]); unset($fields[0]); foreach ($fields as $v) { $query_fields_subclasses[] = "`" . $v . "`"; } foreach ($sub_classes as $sub_class) { $rel_cc[$sub_class['Sub_Class_ID']] = 0; $sub_class['Subdivision_ID'] = $rel[$sub_class['Subdivision_ID']]; $sub_class['Sub_Class_Name'] = str_replace('%NAME%', $sub_class['Sub_Class_Name'], $templates['cc_name']); $sub_class['EnglishName'] = str_replace('%KEYWORD%', $sub_class['EnglishName'], $templates['cc_keyword']); $sub_class['Created'] = $sub_class['LastUpdated'] = date("Y-m-d H:i:s"); $sub_class['Catalogue_ID'] = $dest_catalogue_id; if (!$nc_core->sub_class->validate_english_name($sub_class['EnglishName'])) { throw new Exception(CONTROL_CONTENT_SUBDIVISION_INDEX_ERROR_THREE_KEYWORD_INVALID . "<br/>" . $sub_class['EnglishName']); } $query_values = array(); foreach ($fields as $v) { $query_values[] = "'" . $db->escape($sub_class[$v]) . "'"; } $insert_values_subclasses[$sub_class['Sub_Class_ID']] = "(" . join(',', $query_values) . ")"; } foreach ($sub_classes as $sub_class) { $nc_core->event->execute("addSubClassPrep", $dest_catalogue_id, $sub_class['Subdivision_ID'], 0); $db->query("INSERT INTO `Sub_Class` (" . join(',', $query_fields_subclasses) . ") VALUES {$insert_values_subclasses[$sub_class['Sub_Class_ID']]}"); if ($db->is_error) { throw new nc_Exception_DB_Error($db->last_query, $db->last_error); } $inserted_id = $db->insert_id; $k = $sub_class['Sub_Class_ID']; $rel_cc[$k] = $inserted_id; $class_id = $sub_class['Class_ID']; $is_system_table = $db->get_var("SELECT `System_Table_ID` FROM `Class` WHERE `Class_ID` = '" . $class_id . "' "); $sub_id = $rel[$sub_class['Subdivision_ID']]; $nc_core->event->execute("addSubClass", $dest_catalogue_id, $sub_id, $rel_cc[$k]); if (!is_dir($nc_core->FILES_FOLDER . $sub_id . "/" . $rel_cc[$k])) { @mkdir($nc_core->FILES_FOLDER . $sub_id . "/" . $rel_cc[$k], $nc_core->DIRCHMOD); @chmod($nc_core->FILES_FOLDER . $sub_id . "/" . $rel_cc[$k], $nc_core->DIRCHMOD); } // объекты для копирования $messages = !$with_object || $is_system_table ? null : $db->get_results("SELECT * FROM `Message" . $class_id . "` WHERE `Sub_Class_ID` = '" . $k . "' ORDER BY `Message_ID`", ARRAY_A); $query_fields_messages = array(); $insert_values_messages = array(); if (!empty($messages)) { $fields = array_keys($messages[0]); unset($fields[0]); foreach ($fields as $v) { $query_fields_messages[] = "`" . $v . "`"; } $msg_ids = array(); $rel_message = array(); foreach ($messages as $message) { $rel_message[$message['Message_ID']] = 0; $message['Subdivision_ID'] = $rel[$message['Subdivision_ID']]; $message['Sub_Class_ID'] = $rel_cc[$message['Sub_Class_ID']]; $message['Created'] = $message['LastUpdated'] = date("Y-m-d H:i:s"); $msg_ids[] = $message['Message_ID']; $query_values = array(); foreach ($fields as $v) { $query_values[] = "'" . $db->escape($message[$v]) . "'"; } $insert_values_messages[$message['Message_ID']] = "(" . join(',', $query_values) . ")"; } // копирование файлов объекта $file_fields = array(); $tmp = $db->get_results("SELECT `Field_ID` AS `id`, `Field_Name` AS `name` FROM `Field` WHERE `Class_ID`='" . $class_id . "' AND `TypeOfData_ID` = '6' ", ARRAY_A); if ($tmp) { foreach ($tmp as $v) { $file_fields[$v['id']] = $v['name']; } $filetable = $db->get_results("SELECT * FROM `Filetable`\n WHERE `Field_ID` IN (" . join(',', array_keys($file_fields)) . ")\n AND `Message_ID` IN (" . join(',', $msg_ids) . ") ", ARRAY_A); } // Поля типа "множественная загрузка" в компоненте $multifile_fields = $db->get_results("SELECT `Field_ID`, `Format`, `Field_Name`\n FROM `Field`\n WHERE Class_ID='" . $class_id . "'\n AND TypeOfData_ID='" . NC_FIELDTYPE_MULTIFILE . "'", ARRAY_A); foreach ($messages as $message) { $message_id = $message['Message_ID']; // событие $nc_core->event->execute("addMessagePrep", $dest_catalogue_id, $rel[$message['Subdivision_ID']], $rel_cc[$message['Sub_Class_ID']], $class_id, 0); $db->query("INSERT INTO `Message" . $class_id . "` (" . join(',', $query_fields_messages) . ") VALUES {$insert_values_messages[$message_id]}"); if ($db->is_error) { throw new nc_Exception_DB_Error($db->last_query, $db->last_error); } $inserted_id = $db->insert_id; $k = $message_id; $rel_message[$k] = $inserted_id; // событие $nc_core->event->execute("addMessage", $dest_catalogue_id, $rel[$message['Subdivision_ID']], $rel_cc[$message['Sub_Class_ID']], $class_id, $rel_message[$message_id]); if (!empty($file_fields)) { foreach ($file_fields as $field_id => $field_name) { if ($value = $message[$field_name]) { $is_copy = 0; if (!empty($filetable)) { foreach ($filetable as $v) { if ($v['Message_ID'] == $message_id && $v['Field_ID'] == $field_id) { $file_path = rtrim($nc_core->FILES_FOLDER, '/') . $v['File_Path'] . $v['Virt_Name']; $new_name = md5($file_path . date("H:i:s d.m.Y") . uniqid("netcat")); $new_file_path = $rel[$message['Subdivision_ID']] . "/" . $rel_cc[$message['Sub_Class_ID']]; @copy($file_path, $nc_core->FILES_FOLDER . $new_file_path . "/" . $new_name); $to_filetable[] = "('" . $db->escape($v['Real_Name']) . "', '" . $new_name . "', '/" . $new_file_path . "/',\n '" . $v['File_Type'] . "', '" . $v['File_Size'] . "', '" . $rel_message[$message_id] . "',\n '" . $field_id . "', '" . $v['Content_Disposition'] . "')"; $is_copy = 1; } } } if ($is_copy) { continue; } $file_data = explode(':', $value); $file_name = $file_data[0]; $ext = nc_substr($file_name, nc_strrpos($file_name, ".")); // расширение файла if ($file_data[3]) { $new_name = nc_get_filename_for_original_fs($file_name, $nc_core->FILES_FOLDER . $rel[$message['Subdivision_ID']] . "/" . $rel_cc[$message['Sub_Class_ID']] . "/"); @copy($nc_core->FILES_FOLDER . $file_data[3], $nc_core->FILES_FOLDER . $rel[$message['Subdivision_ID']] . "/" . $rel_cc[$message['Sub_Class_ID']] . "/" . $new_name); $dt = $file_data[0] . ":" . $file_data[1] . ":" . $file_data[2] . ":" . $rel[$message['Subdivision_ID']] . "/" . $rel_cc[$message['Sub_Class_ID']] . "/" . $new_name; $db->query("UPDATE `Message" . $class_id . "` SET `" . $field_name . "` = '" . $dt . "' WHERE `Message_ID` = '" . $rel_message[$message_id] . "' "); } else { @copy($nc_core->FILES_FOLDER . $field_id . "_" . $message_id . $ext, $nc_core->FILES_FOLDER . $field_id . "_" . $rel_message[$message_id] . $ext); } } } } // проходим по каждому полю foreach ((array) $multifile_fields as $field) { $field_id = (int) $field['Field_ID']; $settings_http_path = nc_standardize_path_to_folder($nc_core->HTTP_FILES_PATH . "/multifile/{$field_id}/"); $settings_path = nc_standardize_path_to_folder($nc_core->DOCUMENT_ROOT . '/' . $nc_core->SUB_FOLDER . '/' . $settings_http_path); //получаем список файлов $sql = "SELECT `Priority`, `Name`, `Size`, `Path`, `Preview` FROM `Multifield` WHERE `Field_ID` = {$field_id} AND `Message_ID` = {$message_id}"; $files = $db->get_results($sql, ARRAY_A); foreach ((array) $files as $file) { foreach (array('Path', 'Preview') as $path) { $file_path = $file[$path]; if ($file_path) { $parts = explode('/', nc_standardize_path_to_file($file_path)); $file_name = array_pop($parts); $new_file_name = nc_get_filename_for_original_fs($file_name, $settings_path); @copy($settings_path . $file_name, $settings_path . $new_file_name); $file[$path] = $settings_http_path . $new_file_name; } } $priority = (int) $file['Priority']; $name = $db->escape($file['Name']); $size = (int) $file['Size']; $path = $db->escape($file['Path']); $preview = $db->escape($file['Preview']); $sql = "INSERT INTO `Multifield` (`Field_ID`, `Message_ID`, `Priority`, `Name`, `Size`, `Path`, `Preview`) VALUES " . "({$field_id}, {$rel_message[$message_id]}, {$priority}, '{$name}', {$size}, '{$path}', '{$preview}')"; $db->query($sql); } } } } } } //при копировании разделов проставлялись нули, если поле RecordsPerPage было не заполнено $sub_cc_ids = join(', ', (array) $rel_cc); if (!empty($sub_cc_ids)) { $db->query("UPDATE `Sub_Class`\n SET `RecordsPerPage` = NULL\n WHERE `RecordsPerPage`= 0\n AND `Sub_Class_ID` IN ({$sub_cc_ids})"); } // копирование файлов $system_fields = $nc_core->get_system_table_fields("Subdivision"); $file_fields = array(); if (!empty($system_fields)) { foreach ($system_fields as $v) { if ($v['type'] == 6) { $file_fields[$v['id']] = $v['name']; } } } if (!empty($file_fields)) { $filetable = $db->get_results("SELECT * FROM `Filetable`\n WHERE `Field_ID` IN (" . join(',', array_keys($file_fields)) . ")\n AND `Message_ID` IN (" . join(',', $sub_ids) . ") ", ARRAY_A); foreach ($subdivisions as $subdivision) { $sub_id = $subdivision['Subdivision_ID']; foreach ($file_fields as $field_id => $field_name) { if ($value = $subdivision[$field_name]) { $is_copy = 0; if (!empty($filetable)) { foreach ($filetable as $v) { if ($v['Message_ID'] == $sub_id && $v['Field_ID'] == $field_id) { $file_path = rtrim($nc_core->FILES_FOLDER, '/') . $v['File_Path'] . $v['Virt_Name']; $new_name = md5($file_path . date("H:i:s d.m.Y") . uniqid("netcat")); @copy($file_path, $nc_core->FILES_FOLDER . $rel[$sub_id] . "/" . $new_name); $to_filetable[] = " ('" . $db->escape($v['Real_Name']) . "', '" . $new_name . "', '/" . $rel[$sub_id] . "/',\n '" . $v['File_Type'] . "', '" . $v['File_Size'] . "', '" . $rel[$sub_id] . "',\n '" . $field_id . "', '" . $v['Content_Disposition'] . "')"; // $db->debug(); $is_copy = 1; } } } if ($is_copy) { continue; } $file_data = explode(':', $value); $file_name = $file_data[0]; $ext = nc_substr($file_name, nc_strrpos($file_name, ".")); // расширение файла if ($file_data[3]) { $new_name = nc_get_filename_for_original_fs($file_name, $nc_core->FILES_FOLDER . $rel[$sub_id] . "/"); @copy($nc_core->FILES_FOLDER . $file_data[3], $nc_core->FILES_FOLDER . $rel[$sub_id] . "/" . $new_name); $dt = $file_data[0] . ":" . $file_data[1] . ":" . $file_data[3] . ":" . $rel[$sub_id] . "/" . $new_name; $db->query("UPDATE `Subdivision` SET `" . $field_name . "` = '" . $dt . "' WHERE `Subdivision_ID` = '" . $rel[$sub_id] . "' "); // $db->debug(); } else { @copy($nc_core->FILES_FOLDER . $field_id . "_" . $sub_id . $ext, $nc_core->FILES_FOLDER . $field_id . "_" . $rel[$sub_id] . $ext); } } } } } // update filetable if (!empty($to_filetable)) { $db->query("INSERT INTO `Filetable` (`Real_Name`, `Virt_Name`, `File_Path`,\n `File_Type`, `File_Size`, `Message_ID`, `Field_ID`, `Content_Disposition` )\n VALUES " . join(',', $to_filetable) . " "); } // рекурсивное копирование подразделов if ($with_child) { foreach ($rel as $k => $v) { $childs = $db->get_col("SELECT `Subdivision_ID` FROM `Subdivision` WHERE `Parent_Sub_ID` = '" . $k . "' "); if ($childs) { nc_copy_subdivision($childs, 0, $v, $with_child, $with_сс, $with_object, $templates); } } } return 0; }
/** * * @param string|int $class_id - ID компонента или название системной таблицы(User|Catalogue|Subdivision|Template) * @param string|int $field - название или ID поля в которое сохранять * @param int $message_id - ID объекта|пользователя|сайта|раздела|макета * @param array $file - массив с данными о файле из $_FILES либо * path — путь к файлу(/netcat/tmp/foto.jpg) или ссылка(http://example.com/foto.jpg) * type — mime-тип, попытается определить автоматически если не задан, по умолчанию image/jpeg * name — имя файла, возьмется из ссылки если не задано * folder — нестандартная папка в которую сохранить файл, только для стандартной ФС * @param bool $no еdit - игнорировать настройки поля изменяющие файл * @param bool $message_put - режим работы внутри системы * @return array * download_path — ссылка для скачивания под оригинальным именем (ссылка с "h_") * url — путь к файлу от корня сайта * preview_url — путь к превью файла от корня сайта * name — изначальное имя файла * size — размер * type — mime-тип */ public function field_save_file($class_id, $field, $message_id, $file, $noеdit = false, $message_put = false) { $DOCUMENT_ROOT = nc_core('DOCUMENT_ROOT'); $FILES_FOLDER = nc_core('FILES_FOLDER'); $files_http_path = nc_core('SUB_FOLDER') . nc_core('HTTP_FILES_PATH'); $db = nc_core('db'); $message_id = intval($message_id); $component = new nc_Component($class_id); $systemTableID = $component->get_system_table_id(); $systemTableName = $systemTableID ? $class_id : ''; $fields = $component->get_fields(NC_FIELDTYPE_FILE); if (!empty($fields)) { foreach ($fields as $v) { if ($v['id'] == $field || $v['name'] == $field) { $rawformat = $v['format']; $field_id = $v['id']; $field_name = $v['name']; } } } else { return null; //wrong class or field } if (!$systemTableID) { $msg = $db->get_row("SELECT `Sub_Class_ID`, `Subdivision_ID` FROM `Message{$class_id}` WHERE `Message_ID` = '{$message_id}'", ARRAY_A); } else { $msg = $db->get_row("SELECT COUNT(*) FROM `{$systemTableName}` WHERE `{$systemTableName}_ID` = {$message_id}", ARRAY_A); } if (empty($msg)) { return null; //wrong message } $result = array(); #delete old file require_once $this->core->INCLUDE_FOLDER . "s_files.inc.php"; DeleteFile($field_id, $field_name, $class_id, $systemTableName, $message_id); $format = nc_field_parse_format($rawformat, NC_FIELDTYPE_FILE); $fileurl = $file['path']; $filesrc = $file['tmp_name']; if (!$fileurl && !$filesrc) { return null; //no file to save } if (!$filesrc && $fileurl && !(preg_match("~^[^=]+://~", $fileurl) && ($buf = @file_get_contents($fileurl))) && !file_exists($DOCUMENT_ROOT . $fileurl)) { //и по внутренней нет return null; } $filename = $file['name'] ? $file['name'] : substr($fileurl, strrpos($fileurl, '/') + 1); $filename = str_replace(array('<', '>'), '_', $filename); $filetype = $file['type']; $filesize = $file['size']; $folder = trim($file['folder'], '/'); // расширение файла $ext = substr($filename, strrpos($filename, ".")); if (!$systemTableID) { $File_Path = $msg['Subdivision_ID'] . "/" . $msg['Sub_Class_ID'] . "/"; } elseif ($systemTableID == 1) { $File_Path = "c/"; } elseif ($systemTableID == 3) { $File_Path = "u/"; } elseif ($systemTableID == 4) { $File_Path = "t/"; } else { $File_Path = $message_id ? $message_id . "/" : ""; //sic! why eval? $File_PathNew = "\$message/"; } // будущее имя файла на диске + путь switch ($format['fs']) { case NC_FS_PROTECTED: // hash // имя файла $put_file_name = md5($filename . date("H:i:s d.m.Y") . uniqid("netcat")); break; case NC_FS_ORIGINAL: // пользователь сам указал папку if ($folder && preg_match("/^[a-z][a-z0-9\\/]+\$/is", $folder)) { $File_Path = $folder . "/"; } // сгенерировать имя файла $put_file_name = nc_get_filename_for_original_fs($filename, $FILES_FOLDER . $File_Path); $db_string_path = ":" . ($File_PathNew ? $File_PathNew : $File_Path) . $put_file_name; break; case NC_FS_SIMPLE: // FieldID_MessageID.ext $File_Path = ''; // в папку netcat_files //sic! why eval? $put_file_name = $field_id . ($message_put ? '_$message' : "_" . $message_id) . $ext; break; } $this->create_dir($FILES_FOLDER . $File_Path); //для простой ФС нужно скопировать временный файл //он будет обрабатываться и после добавления объекта переименован в FieldID_MessageID.ext //при добавлении объекта или раздела пока неизвестен путь, поэтому файл попадет в папку netcat_files и потом перенесен $save_mame = $format['fs'] == NC_FS_SIMPLE && $message_put ? $filesrc : $put_file_name; $save_path = $FILES_FOLDER . $File_Path . $save_mame; $save_path_preview = $FILES_FOLDER . $File_Path . 'preview_' . $save_mame; if ($filesrc) { @move_uploaded_file($filesrc, $save_path); } else { if ($buf) { @file_put_contents($save_path, $buf); } else { @copy($DOCUMENT_ROOT . $fileurl, $save_path); } } $resize_format = nc_field_parse_resize_options($rawformat); require_once $this->core->INCLUDE_FOLDER . "classes/nc_imagetransform.class.php"; if (!$noеdit) { if ($resize_format['use_preview']) { @nc_ImageTransform::imgResize($save_path, $save_path_preview, $resize_format['preview_width'], $resize_format['preview_height']); } if ($resize_format['use_resize']) { @nc_ImageTransform::imgResize($save_path, $save_path, $resize_format['resize_width'], $resize_format['resize_height']); $filesize = filesize($save_path); } if ($resize_format['use_crop']) { @nc_ImageTransform::imgCrop($save_path, $save_path, $resize_format['crop_x0'], $resize_format['crop_y0'], $resize_format['crop_x1'], $resize_format['crop_y1'], NULL, 90, 0, 0, $resize_format['crop_ignore'] ? $resize_format['crop_ignore_width'] : 0, $resize_format['crop_ignore'] ? $resize_format['crop_ignore_height'] : 0); $filesize = filesize($save_path); } } $filesize = $filesize ? $filesize : filesize($save_path); $filetype = $filetype ? $filetype : ($filetype = $this->_guess_content_type($save_path) ? $filetype : "image/jpeg"); // для защищенной надо записать файл в базу if ($format['fs'] == NC_FS_PROTECTED) { $query = $db->query("INSERT INTO `Filetable`\n (`Real_Name`, `File_Path`, `Virt_Name`, `File_Type`, `File_Size`, `Field_ID`, `Content_Disposition`, `Message_ID`)\n VALUES ('" . $db->escape($filename) . "', '/" . $db->escape($File_Path) . "', '" . $db->escape($put_file_name) . "', '" . $db->escape($filetype) . "',\n '" . intval($filesize) . "', '" . intval($field_id) . "', '" . intval($format['disposition']) . "', '" . $message_id . "')"); if ($query) { $filetable_lastid = $db->insert_id; $result['download_path'] = $files_http_path . $File_Path . 'h_' . $put_file_name; } } $db_string = $filename . ":" . $filetype . ":" . $filesize . $db_string_path; $result['url'] = $files_http_path . $File_Path . $put_file_name; $result['preview_url'] = $resize_format['use_preview'] ? $files_http_path . $File_Path . 'preview_' . $put_file_name : ""; $result['name'] = $filename; $result['size'] = $filesize; $result['type'] = $filetype; if (!$message_put) { //запишем в объект сущности $query = $db->query("UPDATE `" . ($systemTableID ? $systemTableName : "Message" . $class_id) . "`\n SET `{$field_name}` = '" . $db->escape($db_string) . "'\n WHERE `" . ($systemTableID ? $systemTableName : "Message") . "_ID` = {$message_id}"); } else { //данные для использования в скриптах добавления/изменения после message_put.php $result['FileFS'] = $format['fs']; $result['tmpNewFile'] = $put_file_name; $result['File_Path'] = $File_Path; $result['File_PathNew'] = $File_PathNew; $result['filetable_lastid'] = $filetable_lastid; $result['fldValue'] = $db_string; } return $result; }
/** * Функция копирует один файл из первого поля во второй * в пределах одного объекта * новый файл будет в ФС, которая задана в формате поле-приемника * * @param int message - id объекта * @param int field_src - id поля источника * @param int field_dst - id поля приемниеп * @param int classID (оппоционально) id компонента * * @todo Реализовать копирование файлов системных таблиц * @todo Реализовать копирование файлов различных объектов (возможно, из разных компонентов) * @return bool */ function nc_copy_filefield($message, $field_src, $field_dst, $classID = 0) { global $nc_core; // Если не задан класс, то вытащим его из базы if (!$classID) { $classID = $nc_core->db->get_var("SELECT `Class_ID` FROM `Field` WHERE `Field_ID` = '" . intval($field_src) . "'"); } // проверка аргументов $message += 0; $field_src += 0; $field_dst += 0; $classID += 0; if (!$message || !$field_src || !$field_dst || !$classID) { return 0; } # поиск исходного файла // латинское имя поля $field_name_src = $nc_core->db->get_var("SELECT `Field_Name` FROM `Field` WHERE `Field_ID` = '" . $field_src . "'"); if (!$field_name_src) { return 0; } // Значение поля в таблице объектов $message_field = $nc_core->db->get_row("SELECT * FROM `Message" . $classID . "` WHERE `Message_ID` = '" . $message . "'", ARRAY_A); $file_data = explode(':', $message_field[$field_name_src]); $file_name = $file_data[0]; $file_type = $file_data[1]; $file_size = $file_data[2]; $ext = substr($file_name, strrpos($file_name, ".")); // расширение файла // если ли файл в Filetable ? $filetable = $nc_core->db->get_row("SELECT * FROM `Filetable`\n WHERE `Message_ID` = '" . intval($message) . "' AND `Field_ID` = '" . intval($field_src) . "'", ARRAY_A); // определения полного пути к файлу if ($filetable) { // исходный файл в protected $path_src = rtrim($nc_core->FILES_FOLDER, '/') . $filetable['File_Path'] . $filetable['Virt_Name']; } else { if ($file_data[3]) { // orignal $path_src = $nc_core->FILES_FOLDER . $file_data[3]; } else { // simple $path_src = $nc_core->FILES_FOLDER . $field_src . "_" . $message . $ext; } } # копирование // получение информации о поле-приемника $field_info_desc = $nc_core->db->get_row("SELECT `Field_Name`, `Format` FROM `Field` WHERE `Field_ID` = '" . $field_dst . "'", ARRAY_A); if (!$field_info_desc) { return 0; } //удаление старого файла require_once $nc_core->INCLUDE_FOLDER . "s_files.inc.php"; DeleteFile($field_dst, $field_info_desc['Field_Name'], $classID, 0, $message); // определение типа фс применика $fs = nc_field_parse_format($field_info_desc['Format'], NC_FIELDTYPE_FILE); $fs = $fs['fs']; // определние имени файла на диске и диретории $in_db = $file_name . ":" . $file_type . ":" . $file_size; // то, что запишится в БД switch ($fs) { case NC_FS_PROTECTED: $path_dsc = $message_field['Subdivision_ID'] . '/' . $message_field['Sub_Class_ID'] . '/'; $name_dsc = md5($file_name . date("H:i:s d.m.Y") . uniqid("netcat")); $nc_core->db->query("INSERT INTO `Filetable`(Real_Name, Virt_Name, File_Path, File_Type, File_Size, Message_ID, Field_ID)\n VALUES('" . $file_name . "', '" . $name_dsc . "', '/" . $path_dsc . "','" . $file_type . "', '" . $file_size . "', '" . $message . "', '" . $field_dst . "')"); break; case NC_FS_ORIGINAL: $path_dsc = $message_field['Subdivision_ID'] . '/' . $message_field['Sub_Class_ID'] . '/'; $name_dsc = nc_get_filename_for_original_fs($file_name, $nc_core->FILES_FOLDER . $path_dsc); $in_db .= ":" . $path_dsc . $name_dsc; break; case NC_FS_SIMPLE: $path_dsc = ''; $name_dsc = $field_dst . "_" . $message . $ext; break; } // обновление инфы в БД $nc_core->db->query("UPDATE `Message" . $classID . "` SET `" . $field_info_desc['Field_Name'] . "` = '" . $in_db . "' WHERE `Message_ID` = '" . $message . "'"); print $nc_core->FILES_FOLDER . $path_dsc . $name_dsc; // копирование файла copy($path_src, $nc_core->FILES_FOLDER . $path_dsc . $name_dsc); return 1; }
$File_Path[$j] = "c/"; } elseif ($systemTableID == 3) { $File_Path[$j] = "u/"; } elseif ($systemTableID == 4) { $File_Path[$j] = "t/"; $message = $TemplateID; } else { // $File_Path[$j] = ($message ? $message : "\$message")."/"; $File_Path[$j] = $message . "/"; // при создании раздела имя папки не известно $File_PathNew[$j] = "\$message/"; $fld_name[$j] = $fld[$i]; } } // сгенерировать имя файла $put_file_name = nc_get_filename_for_original_fs($filename, $FILES_FOLDER . $File_Path[$j], $tmpNewFile); // то, что пойдет в БД $fldValue[$i] .= ":" . ($File_PathNew[$j] ? $File_PathNew[$j] : $File_Path[$j]) . $put_file_name; break; case NC_FS_SIMPLE: // FieldID_MessageID.ext $put_file_name = $fldID[$i] . "_\$message" . $ext; $File_Path[$j] = ''; // в папку netcat_files break; } $FileFS[$j] = $fldFS[$i]; // i и j - разные счетчики. В файлах add.php, message.php, etc работа идет с j $tmpNewFile[$j] = $put_file_name; # Create dirs if (!isset($DIRCHMOD)) {
/** * Функции для создания thumbnails для полей типа файл * * * @global object $nc_core * @param int $classID - идентифиактор класса (компонента) * @param int $message - номер объекты * @param int $field_src_id - идентификатор поля источника * @param int $field_dst_id - идентификатор поля приемника * @param int $width Ширина нового изображения * @param int $height Высота нового изображения * @param int $mode [optional] Режим уменьшения: 0 - пропорционально уменьшает; 1 - вписывает в указанные размеры, обрезая края * @param string $format [optional] Формат создаваемого изображения (jpg, gif, png, bmp) * @param int $quality [optional] Качество сжатия изображения (0-100) при $format=='jpg' * @param string $field_name_src * @return bool true в случае удачи, false - в случае ошибки. * @access public * @static */ public static function createThumb_byID($classID, $message, $field_src_id, $field_dst_id, $width, $height, $mode = 0, $format = NULL, $quality = 90, $field_name_src = '', $is_sys = false) { global $nc_core; // проверка аргументов $message += 0; $field_src_id += 0; $field_dst_id += 0; $classID += 0; if (!$message || !$field_src_id || !$field_dst_id || !$classID) { return false; } # поиск исходного файла // латинское имя поля if (!$field_name_src) { $field_name_src = $nc_core->db->get_var("SELECT `Field_Name` FROM `Field` WHERE `Field_ID` = '" . $field_src_id . "'"); } if (!$field_name_src) { return 0; } // Значение поля в таблице объектов $message_field = $is_sys ? $nc_core->db->get_row("SELECT * FROM `User` WHERE `User_ID` = '" . $message . "'", ARRAY_A) : $nc_core->db->get_row("SELECT * FROM `Message" . $classID . "` WHERE `Message_ID` = '" . $message . "'", ARRAY_A); $file_data = explode(':', $message_field[$field_name_src]); $file_name = $file_data[0]; $file_type = $file_data[1]; $file_size = $file_data[2]; $ext = substr($file_name, strrpos($file_name, ".")); // расширение файла $file_name = substr($file_name, 0, strrpos($file_name, ".")); // имя файла без расширения. // если ли файл в Filetable ? $filetable = $nc_core->db->get_row("SELECT * FROM `Filetable`\n WHERE `Message_ID` = '" . intval($message) . "' AND `Field_ID` = '" . intval($field_src_id) . "'", ARRAY_A); // определения полного пути к файлу if ($filetable) { // исходный файл в protected $path_src = rtrim($nc_core->FILES_FOLDER, '/') . $filetable['File_Path'] . $filetable['Virt_Name']; } else { if ($file_data[3]) { // orignal $path_src = $nc_core->FILES_FOLDER . $file_data[3]; } else { // simple $path_src = $nc_core->FILES_FOLDER . $field_src_id . "_" . $message . $ext; } } $img_size = getimagesize($path_src); if (!$format) { $format = strtolower(substr($img_size['mime'], strpos($img_size['mime'], '/') + 1)); } // получение информации о поле-приемника $field_info_desc = $nc_core->db->get_row("SELECT `Field_Name`, `Format` FROM `Field` WHERE `Field_ID` = '" . $field_dst_id . "'", ARRAY_A); if (!$field_info_desc) { return false; } //удаление старого файла require_once $nc_core->INCLUDE_FOLDER . "s_files.inc.php"; DeleteFile($field_dst_id, $field_info_desc['Field_Name'], $classID, 0, $message); // определение типа фс применика $fs = nc_field_parse_format($field_info_desc['Format'], NC_FIELDTYPE_FILE); $fs = $fs['fs']; $file_name .= "_thumb" . ++self::$_thumbPostfix; // определние имени файла на диске и диретории switch ($fs) { case NC_FS_PROTECTED: $path_dsc = $is_sys ? 'u/' : $message_field['Subdivision_ID'] . '/' . $message_field['Sub_Class_ID'] . '/'; $name_dsc = md5($file_name . date("H:i:s d.m.Y") . uniqid("netcat")); break; case NC_FS_ORIGINAL: $path_dsc = $message_field['Subdivision_ID'] . '/' . $message_field['Sub_Class_ID'] . '/'; $name_dsc = nc_get_filename_for_original_fs($file_name . ($format ? ".{$format}" : ''), $nc_core->FILES_FOLDER . $path_dsc); break; case NC_FS_SIMPLE: $path_dsc = ''; $name_dsc = $field_dst_id . "_" . $message . ($format ? ".{$format}" : ''); break; } // копирование файла //copy($path_src, $nc_core->FILES_FOLDER.$path_dsc.$name_dsc); // создание thumb $path_dest = $is_sys ? $nc_core->FILES_FOLDER . '/u/' . $name_dsc : $nc_core->FILES_FOLDER . $path_dsc . $name_dsc; self::imgResize($path_src, $path_dest, $width, $height, $mode, $format, $quality); switch ($fs) { case NC_FS_PROTECTED: $img_size = getimagesize($path_dest); if ($img_size === false) { if (file_exists($path_dest)) { unlink($path_dest); } return false; } $dst_File_Type = $img_size['mime']; $dst_File_Size = filesize($path_dest); $insert_filetable_sql = "INSERT INTO `Filetable`(Real_Name, Virt_Name, File_Path, File_Type, File_Size, Message_ID, Field_ID)\n VALUES('" . $nc_core->db->escape($file_name) . "." . $format . "', '" . $nc_core->db->escape($name_dsc) . "', '/" . $nc_core->db->escape($path_dsc) . "','" . $dst_File_Type . "', '" . $dst_File_Size . "', '" . $message . "', '" . $field_dst_id . "')"; $nc_core->db->query($insert_filetable_sql); $in_db = $file_name . ":" . $dst_File_Type . ":" . $dst_File_Size; // то, что запишится в БД break; case NC_FS_ORIGINAL: $in_db = $file_name . "." . $format . ":" . $format . ":" . $file_size; // то, что запишится в БД $in_db .= ":" . ($is_sys ? 'u/' . $name_dsc : $path_dsc . $name_dsc); break; default: $in_db = $file_name . "." . $format . ":" . $format . ":" . $file_size; // то, что запишится в БД break; } $is_sys ? $nc_core->db->query("UPDATE `User` SET `" . $field_info_desc['Field_Name'] . "` = '" . $nc_core->db->escape($in_db) . "' WHERE `User_ID` = '" . $message . "'") : $nc_core->db->query("UPDATE `Message" . $classID . "` SET `" . $field_info_desc['Field_Name'] . "` = '" . $nc_core->db->escape($in_db) . "' WHERE `Message_ID` = '" . $message . "'"); return true; }