Example #1
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;
}
Example #2
0
function imageResize($field, $width, $height, $mode = 0, $sys_table = NULL)
{
    global $nc_core, $classID, $message, $db;
    $field_id = $db->get_var("SELECT Field_ID FROM Field WHERE Class_ID='{$classID}' AND Field_Name='" . mysql_real_escape_string($field) . "'");
    if ($_FILES['f_' . $field] && !$_FILES['f_' . $field]['error']) {
        require_once $nc_core->INCLUDE_FOLDER . 'classes/nc_imagetransform.class.php';
        $pic = $nc_core->DOCUMENT_ROOT . nc_file_path($sys_table ? $sys_table : $classID, $message, $field);
        $im = getimagesize($pic);
        if ($im[0] <= $width && $im[1] <= $height && !$mode || $im[0] == $width && $im[1] == $height && $mode) {
            return;
        }
        nc_ImageTransform::imgResize($pic, $pic, $width, $height, $mode, NULL, 90, $message, $field_id);
    }
}
Example #3
0
function razdelcatalog($idsub)
{
    $rez = "";
    $rez .= "<table cellpadding='0' cellspacing='0' border='0'>";
    $rez .= "<tr>";
    $mont = mysql_query("SELECT * FROM `Subdivision` where `Parent_Sub_ID`='" . $idsub . "' order by Priority ASC;");
    $j = 0;
    while ($montrow = mysql_fetch_array($mont)) {
        $rez .= "<td style='border:0;' valign='top'>";
        $rez .= "<a href='" . $montrow['Hidden_URL'] . "'>";
        $rez .= "<img src='" . x_resize_crop(nc_file_path('Subdivision', $montrow['Subdivision_ID'], 2396), 250, 200) . "' />";
        $rez .= $montrow['Subdivision_Name'];
        $rez .= "</a>";
        $rez .= "</td>";
        $j++;
        if ($j % 2 == 0) {
            $rez .= "</tr><tr>";
        }
    }
    $rez .= "</tr>";
    $rez .= "</table>";
    return $rez;
}
Example #4
0
/**
 * Вывод поля типа Файл в альтернативных формах шаблона
 * @param string имя поля
 * @param string дополнительные свойства для <input type=file>
 * @param int идентификатор компонента, его стоит указывать при вызове функции т.к. в функции s_list_class() его глобальное значение будет иное
 * @param bool выводить описание поля или нет
 * @return string
 */
function nc_file_field($field_name, $style = "", $classID = "", $caption = false, $getData = false)
{
    // для получения значения поля
    global $fldValue, $fldID;
    global $db, $action, $current_cc, $message, $DOMAIN_NAME, $user_table_mode, $systemTableID, $systemMessageID, $UserID;
    # если системные таблицы, $message другой
    switch ($systemTableID) {
        case 3:
            # если "пользователи" то вот так вот
            $message = $UserID ? $UserID : $message;
            break;
        case 2:
        case 4:
            # если другие системные таблицы
            $message = $systemMessageID;
            break;
    }
    $nc_core = nc_Core::get_object();
    // текущее значение компонента
    if (!$classID) {
        $classID = $nc_core->sub_class->get_current('Class_ID');
    }
    $show_field_errors = $classID == $nc_core->sub_class->get_current('Class_ID');
    $sysTable = $systemTableID ? $systemTableID : $nc_core->component->get_by_id($classID, 'System_Table_ID');
    $component = new nc_Component($classID, $sysTable);
    $fields = $component->get_fields(NC_FIELDTYPE_FILE);
    // поиск поля
    $field = 0;
    foreach ($fields as $v) {
        if ($v['name'] == $field_name) {
            $field = $v;
        }
    }
    // поля не существует
    if (!$field) {
        if ($show_field_errors) {
            trigger_error("<b>nc_file_field()</b>: Incorrect field name (" . $field_name . ")", E_USER_WARNING);
        }
        return false;
    }
    // поле не доступно для редактирования
    if ($field['edit_type'] == 3 || $field['edit_type'] == 2 && !nc_field_check_admin_perm()) {
        return false;
    }
    // вывод функции
    $result = '';
    if (is_array($fldID)) {
        $t = array_flip($fldID);
        $value = $fldValue[$t[$field['id']]];
    }
    $field_id = $field['id'];
    # вывод Caption, если нужно
    if ($caption) {
        $description = $field['description'] ? $field['description'] : $field['name'];
        $result .= $description . ($field['not_null'] ? " (*)" : "") . ":<br />\r\n";
    }
    # проверим, есть ли в параметре "style", атрибуты
    $style_attr = nc_reg_search_html_attr($style);
    # прописываем параметры из $style
    $style_opt = "";
    if (!in_array("size", $style_attr)) {
        $style_opt .= "size='50'";
    }
    if ($style_opt) {
        $style_opt = " " . $style_opt;
    }
    # само поле
    $result .= "<input name='f_" . $field_name . "'" . $style_opt . ($style ? " " . $style : "") . " type='file' />\r\n";
    # старое значение
    if ($systemTableID && $value || $action == 'change' && ($old = $GLOBALS["f_" . $field_name . "_old"])) {
        $system_tables = array(1 => "Catalogue", 2 => "Subdivision", 3 => "User", 4 => "Template");
        $filepath = nc_file_path($systemTableID ? $system_tables[$systemTableID] : $classID, $message, $field_id, 'h_');
        list($filename, $filetype, $filesize) = explode(':', $old ? $old : $value);
        $result .= "<input type='hidden' name='f_" . $field_name . "_old' value='" . ($old ? $old : $value) . "' /><br/>\r\n";
        $result .= NETCAT_MODERATION_FILES_UPLOADED . ": ";
        $result .= "<a target='_blank' href='http://" . $DOMAIN_NAME . $filepath . "'>" . htmlspecialchars($filename) . "</a> (" . nc_bytes2size($filesize) . ")";
        # "удалить файл", если поле не обязательно для заполнения
        if (!$field['not_null']) {
            $result .= " <input id='k" . $field_id . "' type='checkbox' name='f_KILL" . $field_id . "' value='1' /> <label for='k" . $field_id . "'>" . NETCAT_MODERATION_FILES_DELETE . "</label>\r\n";
        }
    }
    return $result;
}
Example #5
0
 /**
  * Функция для помещения в корзину объектов компонентов
  * @param mixed `message` - идентификаторы объектов подлежащих удалению в виде массива или id
  * @param int `class_id` номер компонента, в котором производится удаление
  */
 public function add($messages, $class_id)
 {
     global $AUTH_USER_ID;
     $db = $this->db;
     // проверка лимита корзины
     $r = $db->get_col("SELECT `XML_Filesize` FROM `Trash_Data` GROUP BY `XML_Filename`");
     if ($r && array_sum($r) > $this->core->get_settings('TrashLimit') * 1024 * 1024) {
         $this->trash_full = 1;
         throw new nc_Exception_Trash_Full('Trashbin full');
     }
     if (!is_dir($this->core->TRASH_FOLDER) || !is_writable($this->core->TRASH_FOLDER)) {
         throw new nc_Exception_Trash_Folder_Fail('Folder');
     }
     if (!class_exists('DOMDocument')) {
         nc_print_status(NETCAT_ADMIN_DOMDocument_NOT_FOUND, 'error');
         $db->query("UPDATE `Settings` SET `Value` = '0' WHERE `Key` = 'TrashUse'");
         exit;
     }
     $doc = new DOMDocument();
     $doc->preserveWhiteSpace = false;
     $doc->formatOutput = true;
     $doc->encoding = 'utf-8';
     // validate params
     $class_id = intval($class_id);
     if (!$class_id) {
         throw new Exception("Inccorrect param \$class_id");
     }
     if (!is_array($messages)) {
         $messages = array($messages);
     }
     $messages = array_unique(array_map("intval", $messages));
     // Проверяем, чтобы ключи не повторялись
     $already_in_trash = $db->get_col("SELECT `Message_ID`\n                                      FROM `Trash_Data`\n                                      WHERE `Class_ID` = " . $class_id . "\n                                      AND `Message_ID` IN (" . join(',', $messages) . ")");
     if (!empty($already_in_trash)) {
         throw new nc_Exception_Trash_Already_Exists($class_id, $already_in_trash);
     }
     // Выбираем данные о пользовательских полях компонента
     $component = new nc_Component($class_id);
     $fields = $component->get_fields();
     if ($fields) {
         foreach ($fields as &$v) {
             foreach ($v as &$d) {
                 $d = $this->encode_to_file($d);
             }
         }
     }
     // выбираем все данные удаляемых объектов из таблицы
     $data = $db->get_results("\n    SELECT `m`.*, `sub`.`Subdivision_Name`, `sub`.`Parent_Sub_ID`, `sub`.`Catalogue_ID`,\n    `sub`.`EnglishName`, `sub`.`Checked` AS `subChecked`,\n    `cc`.`Sub_Class_Name`, `cc`.`EnglishName` AS `ccEnglishName`, `cc`.`Checked` AS `ccChecked`, `m`.`Checked`\n    FROM `Message" . $class_id . "` as `m`\n    LEFT JOIN `Subdivision` as `sub` ON `sub`.`Subdivision_ID` = `m`.`Subdivision_ID`\n    LEFT JOIN `Sub_Class` as `cc` ON `cc`.`Sub_Class_ID` = `m`.`Sub_Class_ID`\n    WHERE `Message_ID` IN ( " . join(',', $messages) . " ) ", ARRAY_A);
     if ($data) {
         foreach ($data as &$v) {
             foreach ($v as &$d) {
                 $d = $this->encode_to_file($d);
             }
         }
     }
     // массив значений объекта, номеров объекта, разделов и компонентов
     $values = $message_ids = $subdivisions = $sub_classes = array();
     if (!empty($data)) {
         foreach ($data as $value) {
             $values[$value['Message_ID']] = $value;
             $subdivisions[$value['Subdivision_ID']] = array('Subdivision_Name' => $value['Subdivision_Name'], 'Parent_Sub_ID' => $value['Parent_Sub_ID'], 'Catalogue_ID' => $value['Catalogue_ID'], 'EnglishName' => $value['EnglishName'], 'Checked' => $value['subChecked']);
             $sub_classes[$value['Sub_Class_ID']] = array('Sub_Class_Name' => $value['Sub_Class_Name'], 'Subdivision_ID' => $value['Subdivision_ID'], 'EnglishName' => $value['ccEnglishName'], 'Checked' => $value['ccChecked']);
             $sub_class_ids[] = $value['Sub_Class_ID'];
             $message_ids[] = $value['Message_ID'];
         }
     }
     // комментарии
     $comments_data = $db->get_results("SELECT * FROM\n                             `Comments_Text`\n                             WHERE `Sub_Class_ID` IN (" . join(',', $sub_class_ids) . ")\n                             AND `Message_ID` IN (" . join(',', $message_ids) . ")", ARRAY_A);
     if ($comments_data) {
         foreach ($comments_data as &$v) {
             foreach ($v as &$d) {
                 $d = $this->encode_to_file($d);
             }
         }
     }
     // создаем новый файл или пишем в существующий
     // берем последний файл из корзины данного компонента, смотрим размер и соответствие полей
     $new_file = 1;
     $ex_trash = $db->get_row("SELECT `Trash_ID`, `XML_Filename`, `XML_Filesize`\n                              FROM `Trash_Data`\n                              WHERE `Type` = " . self::TYPE_MESSAGE . "\n                                    AND `Class_ID` = '" . $class_id . "'\n                              ORDER BY UNIX_TIMESTAMP(`Created`) DESC\n                              LIMIT 1", ARRAY_A);
     if ($db->num_rows && $ex_trash['XML_Filesize'] < $this->max_file_size) {
         $doc->load($this->core->TRASH_FOLDER . $class_id . '/' . $ex_trash['XML_Filename']);
         $xpath = new DOMXPath($doc);
         $ex_fields = $xpath->query("/netcatml/fields/field");
         // проверка соответствия полей
         $num_check_fields = 0;
         foreach ($ex_fields as $v) {
             foreach ($fields as $val) {
                 if ($val['id'] == $v->attributes->getNamedItem('field_id')->value && $val['type'] == $v->attributes->getNamedItem('type_of_data_id')->value) {
                     $num_check_fields++;
                 }
             }
         }
         // новый файл нужен в случае несоответствия полей
         $new_file = $num_check_fields != count($fields);
     }
     if ($new_file) {
         $root_element = $doc->createElement('netcatml');
         $doc->appendChild($root_element);
         $subs_element = $doc->createElement('subdivisions');
         $root_element->appendChild($subs_element);
         $ccs_element = $doc->createElement('sub_classes');
         $root_element->appendChild($ccs_element);
         $fields_element = $doc->createElement('fields');
         $root_element->appendChild($fields_element);
         $messages_element = $doc->createElement('messages');
         $root_element->appendChild($messages_element);
         $comments_element = $doc->createElement('comments');
         $root_element->appendChild($comments_element);
     } else {
         $subs_element = $xpath->query("/netcatml/subdivisions")->item(0);
         $ccs_element = $xpath->query("/netcatml/sub_classes")->item(0);
         $fields_element = $xpath->query("/netcatml/fields")->item(0);
         $fields_element = $xpath->query("/netcatml/fields")->item(0);
         $messages_element = $xpath->query("/netcatml/messages")->item(0);
         $comments_element = $xpath->query("/netcatml/comments")->item(0);
     }
     foreach ($subdivisions as $sub_id => $v) {
         if (!$new_file && ($t = $xpath->query("/netcatml/subdivisions/subdivision[@subdivision_id='" . $sub_id . "']")) && $t->length) {
             continue;
         }
         $element = $doc->createElement('subdivision');
         $element->setAttribute('subdivision_id', $sub_id);
         $element->setAttribute('catalogue_id', $v['Catalogue_ID']);
         $element->setAttribute('parent_sub_id', $v['Parent_Sub_ID']);
         $element->appendChild($doc->createElement('Subdivision_Name', $v['Subdivision_Name']));
         $element->appendChild($doc->createElement('EnglishName', $v['EnglishName']));
         $element->appendChild($doc->createElement('Checked', $v['Checked']));
         $subs_element->appendChild($element);
     }
     foreach ($sub_classes as $cc_id => $v) {
         if (!$new_file && ($t = $xpath->query("/netcatml/sub_classes/sub_class[@sub_class_id='" . $cc_id . "']")) && $t->length) {
             continue;
         }
         $element = $doc->createElement('sub_class');
         $element->setAttribute('sub_class_id', $cc_id);
         $element->setAttribute('subdivision_id', $v['Subdivision_ID']);
         $element->setAttribute('class_id', $class_id);
         $element->appendChild($doc->createElement('Sub_Class_Name', $v['Sub_Class_Name']));
         $element->appendChild($doc->createElement('EnglishName', $v['EnglishName']));
         $element->appendChild($doc->createElement('Checked', $v['Checked']));
         $ccs_element->appendChild($element);
     }
     if ($new_file) {
         foreach ($fields as $v) {
             $element = $doc->createElement('field');
             $element->setAttribute('field_id', $v['id']);
             $element->setAttribute('type_of_data_id', $v['type']);
             $element->appendChild($doc->createElement('Field_Name', $v['name']));
             $element->appendChild($doc->createElement('Description', $v['description']));
             $fields_element->appendChild($element);
         }
     }
     if (!empty($comments_data)) {
         $v_ar = array('User_ID', 'Date', 'Updated', 'Comment');
         foreach ($comments_data as $v) {
             $element = $doc->createElement('comment');
             $element->setAttribute('comment_id', $v['id']);
             $element->setAttribute('parent_comment_id', $v['Parent_Comment_ID']);
             $element->setAttribute('parent_comment_id', $v['Parent_Comment_ID']);
             $element->setAttribute('sub_class_id', $v['Sub_Class_ID']);
             $element->setAttribute('message_id', $v['Message_ID']);
             foreach ($v_ar as $pr) {
                 $element->appendChild($doc->createElement($pr, $v[$pr]));
             }
             $comments_element->appendChild($element);
         }
     }
     $v_ar = array('User_ID', 'Priority', 'Checked', 'IP', 'UserAgent', 'Parent_Message_ID', 'Created', 'LastUpdated', 'LastUser_ID', 'LastIP', 'LastUserAgent', 'Keyword');
     foreach ($values as $message_id => $v) {
         $element = $doc->createElement('message');
         $element->setAttribute('message_id', $message_id);
         $element->setAttribute('class_id', $class_id);
         $element->setAttribute('subdivision_id', $v['Subdivision_ID']);
         $element->setAttribute('sub_class_id', $v['Sub_Class_ID']);
         foreach ($v_ar as $pr) {
             $ch_element = $doc->createElement($pr, $v[$pr]);
             $element->appendChild($ch_element);
         }
         foreach ($fields as $field) {
             if ($field['type'] == 1 || $field['type'] == 3) {
                 $ch_element = $doc->createElement($field['name'], "");
                 $cdata = $doc->createCDATASection($v[$field['name']]);
                 $ch_element->appendChild($cdata);
             } else {
                 $ch_element = $doc->createElement($field['name'], $v[$field['name']]);
             }
             //$ch_element = $doc->createElement($field['name'], str_replace('&nbsp;', ' ', $v[$field['name']]) );
             if ($field['type'] == NC_FIELDTYPE_FILE) {
                 $ch_element->setAttribute('path', nc_file_path($class_id, $message_id, $field['id']));
             }
             $element->appendChild($ch_element);
         }
         $messages_element->appendChild($element);
     }
     $this->core->files->create_dir($this->core->TRASH_FOLDER . $class_id);
     $xml_filename = $new_file ? md5(rand(0, 10000) . time() . $class_id . $message_id) : $ex_trash['XML_Filename'];
     $xml_filesize = $doc->save($this->core->TRASH_FOLDER . $class_id . '/' . $xml_filename);
     if (!$xml_filesize) {
         throw new nc_Exception_Trash_Folder_Fail('');
         $this->folder_fail = 1;
     }
     @chmod($this->core->TRASH_FOLDER . $class_id . '/' . $xml_filename, $this->core->FILECHMOD);
     $ip = $this->db->escape($_SERVER['REMOTE_ADDR']);
     $ua = $this->db->escape($_SERVER['HTTP_USER_AGENT']);
     foreach ($message_ids as $message_id) {
         $insert[] = "(" . $message_id . ", " . $class_id . ", " . $values[$message_id]['Subdivision_ID'] . ",\n                     " . $values[$message_id]['Sub_Class_ID'] . ",\n                     '" . date("Y-m-d H:i:s") . "', '" . $xml_filename . "' , " . $xml_filesize . ",\n                     '" . $ip . "', '" . $ua . "' , '" . $AUTH_USER_ID . "')";
     }
     $db->query("INSERT INTO `Trash_Data` (`Message_ID` ,`Class_ID`, `Subdivision_ID`,`Sub_Class_ID` ,`Created` ,`XML_Filename` ,`XML_Filesize` ,`IP` ,`UserAgent` ,`User_ID`)\n        VALUES " . join(',', $insert));
     if ($this->db->is_error) {
         throw new nc_Exception_DB_Error($this->db->last_query, $this->db->last_error);
     }
     for ($i = 0; $i < count($insert); $i++) {
         $this->deleted_ids[] = $db->insert_id + $i;
     }
     if (!$new_file) {
         $db->query("UPDATE `Trash_Data` SET `XML_Filesize` = '" . $xml_filesize . "' WHERE `XML_Filename` = '" . $ex_trash['XML_Filename'] . "' ");
     }
     /*
      // Отмечаем поля типа "Файл", чтобы потом поменять их статус в таблице filetable
      if( !empty($file_fields) ){
      $deleted_files = $db->query("UPDATE `filetable` SET `Deleted` = 1 WHERE `Field_ID` IN (".join(',',$file_fields).")  AND `Message_ID` IN (".join(',',$messages_to_trash).")");
      }
     *
     */
     return count($this->deleted_ids);
 }
Example #6
0
 public static function putWatermark($classID, $field, $message, $watermark, $mode = 0)
 {
     global $nc_core, $db;
     $message = intval($message);
     $src = nc_file_path($classID, $message, $field);
     if (!$src) {
         return false;
     }
     // вставляем ватермарк
     self::putWatermark_file($src, $watermark, $mode);
     // теперь нужно обновить размер
     $systemTableID = 0;
     $system_tables = array("Catalogue" => 1, "Subdivision" => 2, "User" => 3, "Template" => 4);
     // определяем таблицу и первичный ключ в ней
     if (!is_int($classID)) {
         $table = $db->escape($classID);
         $pk = $db->escape($classID) . "_ID";
         $systemTableID = $system_tables[$classID];
     } else {
         $table = "Message" . intval($classID);
         $pk = "Message_ID";
     }
     // определяем номер поля и его имя
     if (is_int($field)) {
         $field_id = intval($field);
         $field_name = $db->get_var("SELECT `Field_Name` FROM `Field` WHERE `Field_ID` = '" . $field_id . "' ");
     } else {
         $field_name = $db->escape($field);
         $field_id = $db->get_var("SELECT `Field_ID` FROM `Field` WHERE `Field_Name` = '" . $field_name . "' AND " . ($systemTableID ? "`System_Table_ID` = '" . $systemTableID . "'" : "`Class_ID` = '" . $classID . "' ") . " ");
     }
     // новое значение
     clearstatcache();
     $filesize = filesize($nc_core->DOCUMENT_ROOT . $src);
     $old_value = $db->get_var("SELECT `" . $field_name . "` FROM `" . $table . "` WHERE `" . $pk . "` = '" . $message . "' ");
     $new_value = preg_replace("/:(\\d+):/", ':' . $filesize . ':', $old_value);
     $new_value = preg_replace("/:(\\d+)\$/", ':' . $filesize, $new_value);
     $db->query("UPDATE `" . $table . "` SET `" . $field_name . "` = '" . $db->escape($new_value) . "' WHERE `" . $pk . "` = '" . $message . "' ");
     // и в таблице Filetable
     $db->query("UPDATE `Filetable` SET `File_Size` = '" . $filesize . "' WHERE `Message_ID` = '" . $message . "' AND `Field_ID` = '" . $field_id . "' ");
     return true;
 }