$db->query("\n UPDATE Message{$dragged_class}\n SET Created = Created,\n Priority = Priority + 1\n WHERE Sub_Class_ID = {$dragged['Sub_Class_ID']}\n AND Priority BETWEEN {$target['Priority']} AND ({$dragged['Priority']} - 1)"); // Change dragged object's priority $db->query("\n UPDATE Message{$dragged_class}\n SET Created = Created,\n Priority = {$target['Priority']}\n WHERE Message_ID = {$dragged_id}"); } die("1 /* OK */"); } // message to subclass if ($dragged_type == 'message' && $target_type == 'subclass') { $dragged_class = (int) $dragged_class; if (!$dragged_class) { die("0 /* Wrong message class */"); } $subclass = $db->get_row("SELECT Sub_Class_ID, Subdivision_ID, Class_ID FROM Sub_Class WHERE Sub_Class_ID={$target_id}", ARRAY_A); $message = $db->get_row("SELECT Subdivision_ID, Sub_Class_ID FROM Message{$dragged_class} WHERE Message_ID={$dragged_id}", ARRAY_A); if (!$subclass) { die("0 /* Subclass [{$target_id}] doesn't exist */"); } $subdivision_id = $subclass['Subdivision_ID']; $sql = "SELECT `Sub_Class_ID` FROM `Sub_Class` WHERE `Subdivision_ID` = {$subdivision_id} AND `Class_ID` = {$dragged_class} " . "ORDER BY `Priority` LIMIT 1"; $subclass = $db->get_row($sql, ARRAY_A); if (!$subclass) { die("0 /* Can't move message between distinct classes */"); } $new_target_id = $subclass['Sub_Class_ID']; $res = nc_move_message($dragged_class, $dragged_id, $new_target_id); if (!$res) { die("0 /* Error while moving message */"); } die("1 /* OK */"); } die("0 /* Wrong request ['{$dragged_type} {$dragged_id}' {$position} '{$target_type} {$target_id}'] */");
/** * Перемещение объекта из одного шаблона в разделе в другой. * * Пользователь должен обладать правами: изменение в разделе, где * находится объект, и удаление в разделе, куда переносится объект. * * @param integer ID класса объекта * @param integer ID объекта * @param integer ID шаблона в разделе, куда переносится объект * @return boolean */ function nc_move_message($class_id, $message_id, $destination_cc_id) { global $nc_core; $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_move_message()", E_USER_WARNING); return false; } $db = $nc_core->db; // перемещаемое сообщение $message = $db->get_row("SELECT sd.`Catalogue_ID`,\n m.*\n FROM `Message" . $class_id . "` AS m,\n `Subdivision` as sd\n WHERE m.`Message_ID`='" . $message_id . "'\n AND m.`Subdivision_ID`=sd.`Subdivision_ID` ", ARRAY_A); // сабкласс назначения $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` ", ARRAY_A); // существует ли объект и компонент в разделе if (!$message || !$dest_subclass) { $what = $message ? 'subclass' : 'object'; trigger_error("nc_move_message: {$what} doesn't exist", E_USER_WARNING); return false; } // перемещать можно только в рамках одного компонента if ($dest_subclass['Class_ID'] != $class_id) { trigger_error("nc_move_message: destination subclass belongs to different class", E_USER_WARNING); return false; } // перенос в самого себя if ($dest_subclass['Sub_Class_ID'] == $message['Sub_Class_ID']) { return true; } // права 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_move_message: insufficient rights", E_USER_WARNING); return false; } // execute core action $nc_core->event->execute("updateMessagePrep", $dest_subclass['Catalogue_ID'], $dest_subclass['Subdivision_ID'], $dest_subclass['Sub_Class_ID'], $dest_subclass['Class_ID'], $message_id); // файлы $file_fields = $db->get_results("SELECT `Field_ID`, `Field_Name` FROM `Field` WHERE `Class_ID`='" . $class_id . "' AND TypeOfData_ID = '6' ", ARRAY_A); if (!empty($file_fields)) { $FILES_FOLDER = $nc_core->FILES_FOLDER; $DOCUMENT_ROOT = $nc_core->DOCUMENT_ROOT; $SUB_FOLDER = $nc_core->SUB_FOLDER; $DIRCHMOD = $nc_core->DIRCHMOD; $INCLUDE_FOLDER = $nc_core->INCLUDE_FOLDER; // создание директорий $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 @chmod($dir, $DIRCHMOD); } unset($dirs); $dest_path = "/{$dest_subclass['Subdivision_ID']}/{$dest_subclass['Sub_Class_ID']}/"; require_once $INCLUDE_FOLDER . "s_common.inc.php"; foreach ($file_fields as $field) { $value = $message[$field['Field_Name']]; if (!$value) { continue; } // файла нет $file_id = $db->get_var("SELECT `ID` FROM `Filetable` WHERE `Field_ID` = '" . $field['Field_ID'] . "' AND `Message_ID` = '" . $message_id . "'"); if ($file_id) { $file_path = nc_file_path($class_id, $message_id, $field['Field_ID']); if ($file_path) { preg_match("#/([0-9a-f]{32})\$#i", $file_path, $regs); } if (file_exists(rtrim($DOCUMENT_ROOT, '/') . $SUB_FOLDER . $file_path) && !rename($DOCUMENT_ROOT . $SUB_FOLDER . $file_path, rtrim($FILES_FOLDER, '/') . $dest_path . $regs[1])) { return false; } $db->query("UPDATE `Filetable` SET `File_Path`='" . $dest_path . "' WHERE `ID` = '" . $file_id . "'"); $is_moved = 1; } if ($is_moved) { 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 . $message['Subdivision_ID'] . "/" . $message['Sub_Class_ID']); if (file_exists($nc_core->FILES_FOLDER . $file_data[3]) && !rename($nc_core->FILES_FOLDER . $file_data[3], $nc_core->FILES_FOLDER . $dest_path . $new_name)) { return false; } $dt = $file_data[0] . ":" . $file_data[1] . ":" . $file_data[2] . ":" . ltrim($dest_path, '/') . $new_name; $db->query("UPDATE `Message" . $class_id . "` SET `" . $field['Field_Name'] . "` = '" . $dt . "' WHERE `Message_ID` = '" . $message_id . "' "); } } } // сообствено перемещение $db->query("UPDATE Message{$class_id}\n SET Subdivision_ID={$dest_subclass[Subdivision_ID]},\n Sub_Class_ID={$dest_subclass[Sub_Class_ID]},\n Priority = {$dest_subclass[Next_Priority]}\n WHERE Message_ID = {$message_id}"); // обновление приоритетов $db->query("UPDATE Message{$class_id}\n SET Created=Created, LastUpdated=LastUpdated,\n Priority = Priority-1\n WHERE Sub_Class_ID = {$message[Sub_Class_ID]}\n AND Priority > {$message['Priority']}"); //перемещение комментариев объекта if ($nc_core->modules->get_by_keyword('comments')) { $db->query("UPDATE `Comments_Text`\n SET `Sub_Class_ID`={$dest_subclass[Sub_Class_ID]}\n WHERE `Message_ID` = {$message_id}\n AND `Sub_Class_ID`={$message[Sub_Class_ID]}"); $db->query("UPDATE `Comments_Count`\n SET `Sub_Class_ID`={$dest_subclass[Sub_Class_ID]}\n WHERE `Message_ID` = {$message_id}\n AND `Sub_Class_ID`={$message[Sub_Class_ID]}"); } // execute core action $nc_core->event->execute("updateMessage", $dest_subclass['Catalogue_ID'], $dest_subclass['Subdivision_ID'], $dest_subclass['Sub_Class_ID'], $dest_subclass['Class_ID'], $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) { nc_move_message($class_id, $child_id, $destination_cc_id); } } return true; }