/** * Копирование объекта из одного шаблона в разделе в другой. * * Пользователь должен обладать правами: изменение в разделе, где * находится объект, и удаление в разделе, куда переносится объект. * * @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; }
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); } }
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; }
/** * Вывод поля типа Файл в альтернативных формах шаблона * @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; }
/** * Функция для помещения в корзину объектов компонентов * @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(' ', ' ', $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); }
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; }