Beispiel #1
0
        $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}'] */");
Beispiel #2
0
/**
 * Перемещение объекта из одного шаблона в разделе в другой.
 *
 * Пользователь должен обладать правами: изменение в разделе, где
 * находится объект, и удаление в разделе, куда переносится объект.
 *
 * @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;
}