public function convert($ClassID, $action = 'convert') { $nc_core = nc_Core::get_object(); $db = $nc_core->db; $fs = $action == 'convert' ? 1 : 0; if ($action == 'convert') { $this->db->query("UPDATE `Class` SET `File_Mode` = 1, `File_Path` = IF(`ClassTemplate` > 0, CONCAT('/', `ClassTemplate`, '/', `Class_ID`,'/'), CONCAT('/', `Class_ID`,'/')) WHERE `Class_ID` = " . $ClassID . " OR `ClassTemplate` = " . $ClassID); } if ($this->db->errno) { return nc_print_status(CONTROL_CLASS_CONVERT_DB_ERROR, 'error', null, 1); } $classes_data = $this->db->get_results("SELECT * FROM `Class` WHERE `Class_ID` = " . $ClassID . " OR `ClassTemplate` = " . $ClassID . " ORDER BY `ClassTemplate` ASC", ARRAY_A); foreach ($classes_data as $class_data) { $templates = $this->get_class_templates_list(); //save tpls $class_editor = new nc_class_editor($nc_core->CLASS_TEMPLATE_FOLDER, $db); $class_editor->load($class_data['ClassTemplate']); $path = $class_editor->get_absolute_path() . $class_data['Class_ID'] . "/class_v40_backup.html"; if ($action == 'convert') { $new_temlates = $this->convert_class_templates($class_data); $class_editor->save_new_class($class_data['Class_ID'], $new_temlates); foreach ($templates as $field_name => $tmp) { $fields[$field_name] = "<!-- {$field_name} -->" . $class_data[$field_name] . "<!-- /{$field_name} -->"; } $backup_content = join("\n\n", $fields); nc_save_file($path, $backup_content); } else { $restore_content = nc_check_file($path) ? nc_get_file($path) : false; if (!$restore_content) { return nc_print_status(CONTROL_CLASS_CONVERT_UNDO_FILE_ERROR, 'error', null, 1); } foreach ($templates as $field_name => $tmp) { if (preg_match("#<!-- ?{$field_name} ?-->(.*)<!-- ?/ ?{$field_name} ?-->#is", $restore_content, $matches)) { $restored_templates[$field_name] = $matches[1]; } } if ($restored_templates && is_array($restored_templates)) { $query = array(); foreach ($restored_templates as $field_name => $tmp) { $query[] = "`" . $field_name . "` = '" . $db->prepare($tmp) . "'"; } // сообственно, добавление $SQL = "\nUPDATE `Class`"; $SQL .= "\n SET `File_Mode` = 0 , " . join(",\n ", $query); $SQL .= "\n WHERE `Class_ID` = " . $class_data['Class_ID']; $this->db->query($SQL); if ($this->db->errno) { return nc_print_status(CONTROL_CLASS_CONVERT_DB_ERROR, 'error', null, 1); } } } $message = nc_print_status(CONTROL_CLASS_CONVERT_OK, 'OK', null, 1); $message .= "<a href='index.php?phase=4&ClassID=" . $ClassID . "&fs=" . $fs . "'>" . CONTROL_CLASS_CONVERT_OK_GOEDIT . "</a>"; } return $message; //no errors }
/** * Добавление нового компонента ( шаблона компонента ) * * @param string $class_name - имя компонента * @param string $class_group - группа компонента * @param array $params - массив параметров компонента * @param int $class_template - номер класса, если идёт создание шаблона * @param string $type - тип шаблона компонента * * @throws nc_Exception_DB_Error * @return int номер созданного компонент */ public function add($class_name, $class_group, $params, $class_template = 0, $type = 'useful') { $nc_core = nc_Core::get_object(); $db = $nc_core->db; $class_name = $db->escape($class_name); $class_group = $db->escape($class_group); $type = $db->escape($type); $class_template = intval($class_template); $File_Mode = nc_get_file_mode('Class', $class_template); if ($File_Mode) { $class_editor = new nc_class_editor($nc_core->CLASS_TEMPLATE_FOLDER, $db); $class_editor->load($class_template); if (is_array($params)) { $template_content = array_merge((array) $nc_core->input->fetch_post(), $params); } } // все параметры компонента $params_int = array('AllowTags', 'RecordsPerPage', 'NL2BR', 'UseCaptcha', 'CacheForUser'); if (!$class_template) { $params_int[] = 'System_Table_ID'; } $params_text = array('FormPrefix', 'FormSuffix', 'RecordTemplate', 'SortBy', 'RecordTemplateFull', 'TitleTemplate', 'AddTemplate', 'EditTemplate', 'AddActionTemplate', 'EditActionTemplate', 'SearchTemplate', 'FullSearchTemplate', 'SubscribeTemplate', 'Settings', 'AddCond', 'EditCond', 'SubscribeCond', 'DeleteCond', 'CheckActionTemplate', 'DeleteActionTemplate', 'CustomSettingsTemplate', 'ClassDescription', 'DeleteTemplate', 'TitleList'); if ($File_Mode) { $params_text = $class_editor->get_clear_fields($params_text); $params['File_Mode'] = 1; $params_text[] = 'File_Mode'; } // добавление имени и группы $query = array("`Class_Name`", "`Class_Group`"); $values = array("'" . $class_name . "'", "'" . $class_group . "'"); // добавление шаблона компонента if ($class_template) { $query[] = "`ClassTemplate`"; $values[] = "'" . $class_template . "'"; // System Table ID в любом случае берётся от компонента $query[] = "`System_Table_ID`"; $values[] = "'" . $this->get_by_id($class_template, 'System_Table_ID') . "'"; } // тип шаблона компонента if ($type) { $query[] = "`Type`"; $values[] = "'" . $type . "'"; } // добавление всех параметров компонента foreach ($params_int as $v) { $value = isset($params[$v]) ? intval($params[$v]) : 0; $query[] = "`" . $v . "`"; $values[] = "'" . $value . "'"; } foreach ($params_text as $v) { $value = isset($params[$v]) ? $params[$v] : ''; $query[] = "`" . $v . "`"; $values[] = "'" . $db->prepare($value) . "'"; } if (!$class_template) { $nc_core->event->execute("addClassPrep", 0); } else { $nc_core->event->execute("addClassTemplatePrep", $class_template, 0); } // собственно добавление $SQL = "INSERT INTO `Class` (" . join(', ', $query) . ") VALUES (" . join(', ', $values) . ") "; $db->query($SQL); if ($db->is_error) { throw new nc_Exception_DB_Error($db->last_query, $db->last_error); } $new_class_id = $db->insert_id; if ($File_Mode) { $class_editor->save_new_class($new_class_id, $template_content); } // трансляция события создания компонента if (!$class_template) { CreateMessageTable($new_class_id, $db); $nc_core->event->execute("addClass", $new_class_id); } else { $nc_core->event->execute("addClassTemplate", $class_template, $new_class_id); } return $new_class_id; }
/** * Парсинг файла с импортированным шаблоном * * @param str file * * @return int component id */ function ParseClassFile4($file) { // system superior object $nc_core = nc_Core::get_object(); $db =& $nc_core->db; $db->captured_errors = array(); $VersionNumber = $nc_core->get_settings("VersionNumber"); $insert_flag = "%INSERT_ID%"; $f = fopen($file, "r"); // STEP 1: System version check $tpl_version = trim(fgets($f, 256)); if (!nc_version_control($tpl_version)) { nc_print_status(sprintf(CONTROL_CLASS_IMPORT_ERROR_VERSION_ID, $tpl_version, $VersionNumber), 'info'); return false; } // STEP 2: skip export info fgets($f, 256); $path_for_file_mode = array(); // STEP 3: import component data $insert_into_class = trim(fgets($f, 65536)); // все компоненты в utf-8 if (!$nc_core->NC_UNICODE) { $insert_into_class = $nc_core->utf8->utf2win($insert_into_class); } $res1 = $db->query($insert_into_class); if ($res1) { $insert_id = $db->insert_id; $path_for_file_mode[$insert_id] = "/{$insert_id}/"; } else { nc_print_status(CONTROL_CLASS_IMPORT_ERROR_CLASS_IMPORT, 'info'); return false; } // STEP 4: import component templates $tpl_id = array(); $next_data = trim(fgets($f, 65536)); while (preg_match("/^INSERT INTO/is", $next_data)) { // все компоненты в utf-8 if (!$nc_core->NC_UNICODE) { $next_data = $nc_core->utf8->utf2win($next_data); } // replace ID $next_data = str_replace($insert_flag, $insert_id, $next_data); if (!$db->query($next_data)) { nc_print_status(CONTROL_CLASS_IMPORT_ERROR_CLASS_TEMPLATE_IMPORT, 'info'); $db->query("DELETE FROM `Class` WHERE `Class_ID` = '" . $insert_id . "'"); return false; } $path_for_file_mode[$db->insert_id] = "/{$insert_id}/{$db->insert_id}/"; $tpl_id[] = $db->insert_id; $next_data = trim(fgets($f, 65536)); } foreach ($path_for_file_mode as $id => $path) { $SQL = "UPDATE `Class` \n SET `File_Path` = '{$path}' \n WHERE `Class_ID` = {$id}"; $db->query($SQL); } // STEP 5: create MessageXX table $create_message = $next_data; $create_message = str_replace($insert_flag, $insert_id, $create_message); $create_message = str_replace('%%MYSQL_CHARSET%%', $nc_core->MYSQL_CHARSET, $create_message); $res2 = $db->query($create_message); if ($res2 != 0) { nc_print_status(CONTROL_CLASS_IMPORT_ERROR_MESSAGE_TABLE, 'info'); $db->query("DELETE FROM `Class` WHERE `Class_ID` = '" . $insert_id . "' OR `ClassTemplate` = '" . $insert_id . "'"); return false; } // STEP 6: append component fields while (!feof($f) && ($insert_into_field = preg_replace("/FileMode.*/m", '', trim(fgets($f, 4096))))) { if (!$nc_core->NC_UNICODE) { $insert_into_field = $nc_core->utf8->utf2win($insert_into_field); } $insert_into_field = str_replace($insert_flag, $insert_id, $insert_into_field); if ($insert_into_field) { $res3 = $db->query($insert_into_field); if ($db->captured_errors) { nc_print_status(CONTROL_CLASS_IMPORT_ERROR_FIELD, 'info'); $db->query("DELETE FROM `Class` WHERE `Class_ID` = '" . $insert_id . "' OR `ClassTemplate` = '" . $insert_id . "'"); $db->query("DROP TABLE `Message" . $insert_id . "`"); $db->query("DELETE FROM `Field` WHERE `Class_ID` = '" . $insert_id . "'"); return false; } } } $import_all_text = file_get_contents($file); $serialize_field = str_replace('FileMode ', '', strstr($import_all_text, 'FileMode')); if ($serialize_field) { $serialize_field = explode('___class_templates___', $serialize_field); $fields = unserialize($serialize_field[0]); $_POST = array_merge($_POST, $fields); $file_class = new nc_class_editor($nc_core->CLASS_TEMPLATE_FOLDER, $nc_core->db, 'Class'); $file_class->save_new_class($insert_id); if ($serialize_field[1]) { $serialize_remplates = explode('___class_templates_separator___', $serialize_field[1]); $file_class->load($insert_id); for ($i = 0, $count = count($serialize_remplates); $i < $count; ++$i) { $fields = unserialize($serialize_remplates[$i]); $_POST = array_merge($_POST, $fields); $file_class->save_new_class($tpl_id[$i]); } } } return $insert_id; }