/** * Копирование объекта из одного шаблона в разделе в другой. * * Пользователь должен обладать правами: изменение в разделе, где * находится объект, и удаление в разделе, куда переносится объект. * * @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; }
include_once $NETCAT_FOLDER . "vars.inc.php"; require $ADMIN_FOLDER . "function.inc.php"; require_once $INCLUDE_FOLDER . "s_common.inc.php"; $classID = (int) $classID; $message = (int) $message; $cc = (int) $cc; if (!$classID || !$message || !$cc) { trigger_error("Wrong params", E_USER_ERROR); } if (!$nc_core->token->verify()) { BeginHtml($Title2, $Title2, "http://" . $DOC_DOMAIN . "/management/class/"); nc_print_status(NETCAT_TOKEN_INVALID, 'error'); EndHtml(); exit; } nc_copy_message($classID, $message, $cc); $reload_frame = $cc == $db->get_var("SELECT `Sub_Class_ID` FROM `Message" . $classID . "` WHERE `Message_ID` = '" . $message . "' LIMIT 1"); ?> <html> <head> <title></title> <script type="text/javascript" > <?php if ($reload_frame) { echo "opener.window.location.reload();"; } ?>