Esempio n. 1
0
 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;
 }
Esempio n. 2
0
/**
 * Копирование объекта из одного шаблона в разделе в другой.
 *
 * Пользователь должен обладать правами: изменение в разделе, где
 * находится объект, и удаление в разделе, куда переносится объект.
 *
 * @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;
}
Esempio n. 3
0
/**
 * 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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
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;
 }
Esempio n. 6
0
/**
 * Функция копирует один файл из первого поля во второй
 * в пределах одного объекта
 * новый файл будет в ФС, которая задана в формате поле-приемника
 *
 * @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;
}
Esempio n. 7
0
                 $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)) {
Esempio n. 8
0
 /**
  *  Функции для создания 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;
 }