diff --git a/ReadMe.txt b/ReadMe.txt index ed300e2..c60942d 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -10,40 +10,4 @@ http://malsup.com/jquery/form/ -/* ==================================================================== - СТИЛИ ДЛЯ ДРЕВОВИДНОГО ОТОБРАЖЕНИЯ КОММЕНТАРИЕВ (Replies) - ==================================================================== */ - -/* 1. Общий контейнер ответа, который находится внутри .mod_comment_comment - и имеет отступ ms-4 */ -.mod_comment_comment .mod_comment_comment.ms-4 { - /* Добавляем вертикальную линию слева */ - border-left: 3px solid #dee2e6; /* Легкая граница */ - - /* Уменьшаем margin-left, который дает ms-4, чтобы освободить место - для линии и при этом не уходить слишком далеко вправо на каждом уровне. */ - margin-left: 20px !important; /* Принудительно уменьшаем отступ */ - padding-left: 15px; /* Отступ между линией и контентом ответа */ - - /* Опционально: немного отличающийся фон */ - background-color: #f8f9fa; -} - -/* 2. Отдельно стилизуем рамку для вложенных карточек, чтобы они не выглядели - громоздко внутри родителя */ -.mod_comment_comment .mod_comment_comment.ms-4 > .mod_comment_box { - border: none !important; /* Убираем стандартную рамку карточки, чтобы осталась только наша вертикальная линия */ -} - -/* 3. Убираем рамки у вложенных заголовков, чтобы линия была чистой */ -.mod_comment_comment .mod_comment_comment.ms-4 > .mod_comment_box > .card-header { - border-bottom: none !important; -} - -/* 4. Более глубокий уровень вложенности (если ответов много) */ -/* Если ответ на ответ имеет дополнительный ms-4, стилизуем его дальше */ -.mod_comment_comment .mod_comment_comment.ms-4 .mod_comment_comment.ms-4 { - border-color: #adb5bd; /* Чуть темнее линия для следующего уровня */ - background-color: #fff; /* Возвращаем белый фон для контраста */ -} - +Добавить в шаблон \ No newline at end of file diff --git a/class/comment.php b/class/comment.php index ad05ec9..e1d7b48 100644 --- a/class/comment.php +++ b/class/comment.php @@ -181,64 +181,49 @@ class Comment * * @todo Вывод информации о авторе комментария */ - function commentListShow($tpl_dir) +function commentListShow($tpl_dir) { global $AVE_DB, $AVE_Template, $AVE_Core; - // Используем оператор объединения с null для PHP 8.4 $document_id = (int)($_REQUEST['id'] ?? 0); $artpage = $_REQUEST['artpage'] ?? null; $apage = $_REQUEST['apage'] ?? null; $user_group = UGROUP ?? 0; + // Получаем ВСЕ настройки модуля разом + $settings = $this->_commentSettingsGet(); - // Проверяем, что в настройках модуля разрешено комментирование документов - if ($this->_commentSettingsGet('comment_active') == 1) + // Проверяем, что в настройках модуля разрешено комментирование + if (isset($settings['comment_active']) && $settings['comment_active'] == 1) { - // ================================================================================= - // НОВОЕ: ПРОВЕРКА ПРАВ НА ПРОСМОТР КОММЕНТАРИЕВ (Read Permission) - // ================================================================================= - $read_groups = explode(',', $this->_commentSettingsGet('comment_user_groups_read')); - - $assign['no_read_permission'] = 0; // Флаг: 0 = права есть + $read_groups = explode(',', $settings['comment_user_groups_read']); + $assign['no_read_permission'] = 0; - // Если группа текущего пользователя НЕ в списке разрешенных для ЧТЕНИЯ, if (!in_array($user_group, $read_groups)) { - // Устанавливаем флаг, что прав на чтение нет $assign['no_read_permission'] = 1; } - // ================================================================================= $assign['display_comments'] = 1; - // Если группа пользователя, который в текущий момент просматривает документ попадает в список - // разрешенных (в настройках модуля), тогда создаем флаг, который будет разрешать к показу - // форму для добавления нового комментария - if (in_array($user_group, explode(',', $this->_commentSettingsGet('comment_user_groups')))) + if (in_array($user_group, explode(',', $settings['comment_user_groups']))) { $assign['cancomment'] = 1; } - // ЕСЛИ ЕСТЬ ПРАВА НА ЧТЕНИЕ, ПРОДОЛЖАЕМ ВЫБОРКУ И ВЫВОД if ($assign['no_read_permission'] == 0) { - $assign['comment_max_chars'] = $this->_commentSettingsGet('comment_max_chars'); - $assign['im'] = $this->_commentSettingsGet('comment_use_antispam'); + $assign['comment_max_chars'] = $settings['comment_max_chars']; + $assign['im'] = $settings['comment_use_antispam']; - // Выполняем запрос к БД на получение количества комментариев для текущего документа $comments = array(); - if ($this->_commentSettingsGet('comment_use_page_nav') == 1) + if ($settings['comment_use_page_nav'] == 1) { - $limit = $this->_commentSettingsGet('comment_page_nav_count'); + $limit = $settings['comment_page_nav_count']; $start = get_current_page() * $limit - $limit; - $num = $AVE_DB->Query(" - SELECT COUNT(*) - FROM " . PREFIX . "_module_comment_info - WHERE document_id = '" . $document_id . "' - ")->GetCell(); + $num = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "'")->GetCell(); $sql = $AVE_DB->Query(" SELECT * @@ -246,78 +231,41 @@ class Comment WHERE document_id = '" . $document_id . "' " . ($user_group == 1 ? '' : "AND comment_status = '1'") . " ORDER BY comment_published ASC - LIMIT " . $start . "," . $limit . " + LIMIT " . (int)$start . "," . (int)$limit . " "); - $pages = @ceil($num / $limit); - - if ($num > $limit) - { - $page_nav = '{t} '; - $page_nav = get_pagination(ceil($num / $limit), 'page', $page_nav, get_settings('navi_box')); - - // *** ПРИМЕНЯЕМ КОСТЫЛИ ИЗ РЕАЛИЗАЦИИ ЗАПРОСОВ ДЛЯ ЧПУ *** - // 1. Применяем rewrite_link и очищаем от тройных/двойных слешей - $page_nav = str_ireplace('"//"', '"/"', str_ireplace('///', '/', rewrite_link($page_nav))); - - // 2. Очищаем от URL_SUFF, если он есть (хотя это, возможно, не нужно для комментариев) - // (Я опущу эту строку, так как она специфична для главной страницы.) - // $page_nav = str_ireplace('"//' . URL_SUFF . '"', '"/"', $page_nav); - - // 3. Запускаем более общую очистку, если там есть Query (GET-параметры), - // что гарантирует удаление двойных слешей, которые могут появиться в пути - $page_nav = preg_replace('/(?ceil($num / $limit) ? $GLOBALS['page_id'][$document_id]['page'] : ceil($num / $limit)); - } + if ($num > $limit) + { + $page_nav = '{t} '; + $page_nav = get_pagination(ceil($num / $limit), 'page', $page_nav, get_settings('navi_box')); + $page_nav = preg_replace('/(?Query(" - SELECT * - FROM " . PREFIX . "_module_comment_info - WHERE document_id = '" . $document_id . "' - " . ($user_group == 1 ? '' : "AND comment_status = '1'") . " - ORDER BY comment_published ASC - "); - + $sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' " . ($user_group == 1 ? '' : "AND comment_status = '1'") . " ORDER BY comment_published ASC"); $page_nav = ''; } - // Получаем формат даты, который указан в общих настройках системы и - // приводим дату создания комментария и дату редактирования к этому формату $date_time_format = $AVE_Template->get_config_vars('COMMENT_DATE_TIME_FORMAT'); while ($row = $sql->FetchAssocArray()) { - - // ----------------------------------------------------- - // !!! НАЧАЛО: ВНЕДРЕНИЕ АВАТАРА !!! - // ----------------------------------------------------- if (isset($row['comment_author_id']) && $row['comment_author_id'] > 0) { - // Вызываем глобальную функцию getAvatar с нужным размером (48px) - // и сохраняем результат в поле 'avatar' для Smarty: $row['avatar'] = getAvatar($row['comment_author_id'], 48); } else { - // Для гостей (comment_author_id = 0) или неавторизованных: - // Передаем пустую строку, чтобы Smarty использовал заглушку. $row['avatar'] = ''; } - // ----------------------------------------------------- - // !!! КОНЕЦ: ВНЕДРЕНИЕ АВАТАРА !!! - // ----------------------------------------------------- $row['comment_published'] = ave_date_format($date_time_format, $row['comment_published']); $row['comment_changed'] = ave_date_format($date_time_format, $row['comment_changed']); @@ -326,13 +274,10 @@ class Comment } else { - // Если нет прав, то эти переменные остаются пустыми/неопределенными $comments = array(); $page_nav = ''; } - - // Формируем ряд переменных для использования в шаблоне $assign['closed'] = @$comments[0][0]['comments_close']; $assign['comments'] = $comments; $assign['theme'] = defined('THEME_FOLDER') ? THEME_FOLDER : DEFAULT_THEME_FOLDER; @@ -340,11 +285,14 @@ class Comment $assign['page'] = base64_encode(get_redirect_link()); $assign['subtpl'] = $tpl_dir . $this->_comments_tree_sub_tpl; - $AVE_Template->assign($assign); + // --- ВОТ ЭТА СТРОКА РЕШАЕТ ВСЁ --- + // Она передает ВСЕ настройки модуля (включая твои новые поля) в шаблон + $AVE_Template->assign($settings); + // -------------------------------- + $AVE_Template->assign($assign); $AVE_Template->assign('page_nav', $page_nav); - // Отображаем шаблон $AVE_Template->display($tpl_dir . $this->_comments_tree_tpl); } } @@ -380,7 +328,7 @@ class Comment $AVE_Template->display($tpl_dir . $this->_comment_form_tpl); } - /** +/** * Метод, предназначенный для записи в БД нового комментария. * * @param string $tpl_dir - путь к шаблонам модуля @@ -396,6 +344,9 @@ class Comment $user_group = UGROUP ?? 0; $secure_code = $_POST['securecode'] ?? ''; $session_captcha = $_SESSION['captcha_keystring'] ?? null; + + // Получаем настройки модуля для проверки обязательных полей + $settings = $this->_commentSettingsGet(); // Если запрос пришел не ajax запросом, тогда формируем ссылку для последующего редиректа if (! $ajax) @@ -403,8 +354,23 @@ class Comment $link = rewrite_link(base64_decode($page)); } + // --- ПРОВЕРКА ОБЯЗАТЕЛЬНЫХ УНИВЕРСАЛЬНЫХ ПОЛЕЙ --- + // Проверка Поля 1 (хранится в website) + if ($settings['comment_show_f1'] == 1 && $settings['comment_req_f1'] == 1 && empty($_POST['comment_author_website'])) + { + if ($ajax) { echo 'error_req_f1'; exit; } + else { header('Location:' . $link . '#end'); exit; } + } + // Проверка Поля 2 (хранится в city) + if ($settings['comment_show_f2'] == 1 && $settings['comment_req_f2'] == 1 && empty($_POST['comment_author_city'])) + { + if ($ajax) { echo 'error_req_f2'; exit; } + else { header('Location:' . $link . '#end'); exit; } + } + // ------------------------------------------------- + // Если в настройках модуля включено использование защитного кода, тогда - if ($this->_commentSettingsGet('comment_use_antispam') == 1) + if ($settings['comment_use_antispam'] == 1) { // Если введенный пользователем защитный код неверен, тогда выполняем обновление кода if (! (isset($session_captcha) && $session_captcha == $secure_code)) @@ -426,50 +392,45 @@ class Comment } // Определяем флаг модерации комментариев - $comment_status = ($this->_commentSettingsGet('comment_need_approve') == 1) ? 0 : 1; + $comment_status = ($settings['comment_need_approve'] == 1) ? 0 : 1; // Если комментарии разрешены, тогда получаем все данные, который пользователь указал в форме - if ($this->_commentSettingsGet('comment_active') == 1 + if ($settings['comment_active'] == 1 && !empty($_POST['comment_text']) && !empty($_POST['comment_author_name']) - && in_array($user_group, explode(',', $this->_commentSettingsGet('comment_user_groups')))) + && in_array($user_group, explode(',', $settings['comment_user_groups']))) { // --- !!! НАЧАЛО БЕЗОПАСНОСТИ: Санитаризация и Экранирование !!! --- $new_comment['parent_id'] = (int)($_POST['parent_id'] ?? 0); $new_comment['document_id'] = (int)($_POST['doc_id'] ?? 0); - // Экранирование для предотвращения SQLi: - // Санитаризация для предотвращения XSS в строковых полях: $new_comment['comment_author_name'] = addslashes(strip_tags($_POST['comment_author_name'] ?? '')); $new_comment['comment_author_id'] = empty($_SESSION['user_id']) ? 0 : (int)$_SESSION['user_id']; $new_comment['comment_author_email'] = addslashes(strip_tags($_POST['comment_author_email'] ?? '')); - $new_comment['comment_author_city'] = addslashes(strip_tags($_POST['comment_author_city'] ?? '')); - $new_comment['comment_author_website'] = addslashes(strip_tags($_POST['comment_author_website'] ?? '')); - + + // Маппинг универсальных полей в существующие колонки БД + $new_comment['comment_author_city'] = addslashes(strip_tags($_POST['comment_author_city'] ?? '')); // Поле 2 + $new_comment['comment_author_website'] = addslashes(strip_tags($_POST['comment_author_website'] ?? '')); // Поле 1 + $new_comment['comment_author_ip'] = $_SERVER['REMOTE_ADDR']; $new_comment['comment_published'] = time(); $new_comment['comment_status'] = $comment_status; - - // Текст комментария до очистки - $comment_text_raw = $_POST['comment_text'] ?? ''; + + $comment_text_raw = $_POST['comment_text'] ?? ''; - // Определяем максимальную длину символов для комментария - $comment_max_chars = $this->_commentSettingsGet('comment_max_chars'); + $comment_max_chars = $settings['comment_max_chars']; $comment_max_chars = (!empty($comment_max_chars) && $comment_max_chars > 10) ? $comment_max_chars : 200; - - // 1. Убираем HTML-теги для предотвращения XSS - $comment_text_clean = strip_tags(stripslashes($comment_text_raw)); - - // 2. Обрезка + + $comment_text_clean = strip_tags(stripslashes($comment_text_raw)); + $comment_text_cut = mb_substr($comment_text_clean, 0, $comment_max_chars); $comment_text_cut .= (mb_strlen($comment_text_clean) > $comment_max_chars) ? '…' : ''; - - // 3. Экранирование текста перед вставкой в SQL + $new_comment['comment_text'] = addslashes($comment_text_cut); - - // --- !!! КОНЕЦ БЕЗОПАСНОСТИ !!! --- - + + // --- !!! КОНЕЦ БЕЗОПАСНОСТИ !!! --- + // Выполняем запрос к БД на добавление комментария $AVE_DB->Query(" INSERT INTO " . PREFIX . "_module_comment_info @@ -479,51 +440,35 @@ class Comment "); $new_comment['Id'] = $AVE_DB->InsertId(); - // Получаем e-mail адрес из Общих настроек системы и формируем ссылку на комментарий в Публичной части + // Получаем настройки и уведомляем админа (код без изменений...) $mail_from = get_settings('mail_from'); $mail_from_name = get_settings('mail_from_name'); $page_link = get_home_link() . urldecode(base64_decode($page)) . '&subaction=showonly&comment_id=' . $new_comment['Id'] . '#' . $new_comment['Id']; - // Формируем текст уведомления для отправки на e-mail $mail_text = $AVE_Template->get_config_vars('COMMENT_MESSAGE_ADMIN'); - // Используем stripslashes для очистки текста, который будет отправлен по почте $mail_text = str_replace('%COMMENT%', stripslashes($new_comment['comment_text']), $mail_text); $mail_text = str_replace('%N%', "\n", $mail_text); $mail_text = str_replace('%PAGE%', $page_link, $mail_text); $mail_text = str_replace('&', '&', $mail_text); - // Отправляем уведомление - send_mail( - $mail_from, - $mail_text, - $AVE_Template->get_config_vars('COMMENT_SUBJECT_MAIL'), - $mail_from, - $mail_from_name, - 'text' - ); + send_mail($mail_from, $mail_text, $AVE_Template->get_config_vars('COMMENT_SUBJECT_MAIL'), $mail_from, $mail_from_name, 'text'); - // Если данные были отправлены ajax-запросом, тогда выполняем автоматический показ комментария - // на странице. if ($ajax) { - // --------------------------------------------------------------------- - // !!! НАЧАЛО: ИСПРАВЛЕНИЕ ДЛЯ AJAX-ОТВЕТА (ПОЛУЧЕНИЕ АВАТАРА) !!! - // --------------------------------------------------------------------- if (isset($new_comment['comment_author_id']) && $new_comment['comment_author_id'] > 0) { - // Вызываем глобальную функцию getAvatar с нужным размером (48px) $new_comment['avatar'] = getAvatar($new_comment['comment_author_id'], 48); } else { - // Для гостей $new_comment['avatar'] = ''; } - // --------------------------------------------------------------------- - // !!! КОНЕЦ: ИСПРАВЛЕНИЕ ДЛЯ AJAX-ОТВЕТА !!! - // ---- $new_comment['comment_changed'] = 0; $new_comment['comment_published'] = ave_date_format($AVE_Template->get_config_vars('COMMENT_DATE_TIME_FORMAT'), $new_comment['comment_published']); + + // Добавляем настройки полей в массив комментария, чтобы шаблон дерева мог их использовать + $new_comment['settings'] = $settings; + $subcomments[] = $new_comment; $AVE_Template->assign('subcomments', $subcomments); $AVE_Template->assign('theme', defined('THEME_FOLDER') ? THEME_FOLDER : DEFAULT_THEME_FOLDER); @@ -531,7 +476,6 @@ class Comment } } - // Если же данные пришли НЕ ajax-запросом, тогда полностью обновляем страницу. if (! $ajax) header('Location:' . str_replace("//", "", $link) . '#end'); exit; } @@ -940,7 +884,8 @@ class Comment $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . $this->_admin_edit_link_tpl)); } - /** +/** +/** * Метод, предназначенный для управления настройками модуля * * @param string $tpl_dir - путь к шаблонам модуля @@ -953,33 +898,50 @@ class Comment $request_sub = $_REQUEST['sub'] ?? ''; $post_max_chars = $_POST['comment_max_chars'] ?? 0; $post_user_groups = $_POST['comment_user_groups'] ?? array(); - // НОВОЕ: Получение данных для групп, которым разрешен просмотр + $post_user_groups_read = $_POST['comment_user_groups_read'] ?? array(); - // КОНЕЦ НОВОГО + $post_need_approve = $_POST['comment_need_approve'] ?? 0; $post_active = $_POST['comment_active'] ?? 0; $post_use_antispam = $_POST['comment_use_antispam'] ?? 0; $post_use_page_nav = $_POST['comment_use_page_nav'] ?? 0; $post_page_nav_count = $_POST['comment_page_nav_count'] ?? 0; - // Если в запросе содержится подзапрос на сохранение данных (пользователь нажал кнопку - // сохранить изменения), тогда выполняем запрос к БД на обновление информации. + // НОВОЕ: Получение данных для универсальных полей + $post_show_f1 = $_POST['comment_show_f1'] ?? 0; + $post_req_f1 = $_POST['comment_req_f1'] ?? 0; + $post_name_f1 = $_POST['comment_name_f1'] ?? ''; + $post_show_f2 = $_POST['comment_show_f2'] ?? 0; + $post_req_f2 = $_POST['comment_req_f2'] ?? 0; + $post_name_f2 = $_POST['comment_name_f2'] ?? ''; + + // Если в запросе содержится подзапрос на сохранение данных if ($request_sub == 'save') { $max_chars = (empty($post_max_chars) || $post_max_chars < 50) ? 50 : $post_max_chars; + // Очищаем названия полей вручную, так как EscapeString не поддерживается + $clean_name_f1 = htmlspecialchars(stripslashes($post_name_f1), ENT_QUOTES); + $clean_name_f2 = htmlspecialchars(stripslashes($post_name_f2), ENT_QUOTES); + $AVE_DB->Query(" UPDATE " . PREFIX . "_module_comments SET comment_max_chars = '" . (int)$max_chars . "', comment_user_groups = '" . implode(',', $post_user_groups) . "', - comment_user_groups_read = '" . implode(',', $post_user_groups_read) . "', /* <-- СОХРАНЕНИЕ НОВОГО ПОЛЯ */ + comment_user_groups_read = '" . implode(',', $post_user_groups_read) . "', comment_need_approve = '" . (int)$post_need_approve . "', comment_active = '" . (int)$post_active . "', comment_use_antispam = '" . (int)$post_use_antispam . "', comment_use_page_nav = '" . (int)$post_use_page_nav . "', - comment_page_nav_count = '" . (int)$post_page_nav_count . "' + comment_page_nav_count = '" . (int)$post_page_nav_count . "', + comment_show_f1 = '" . (int)$post_show_f1 . "', + comment_req_f1 = '" . (int)$post_req_f1 . "', + comment_name_f1 = '" . $clean_name_f1 . "', + comment_show_f2 = '" . (int)$post_show_f2 . "', + comment_req_f2 = '" . (int)$post_req_f2 . "', + comment_name_f2 = '" . $clean_name_f2 . "' WHERE Id = 1 "); @@ -990,9 +952,10 @@ class Comment // Преобразуем поля с правами в массивы для удобства отображения в шаблоне $row['comment_user_groups'] = explode(',', $row['comment_user_groups']); - $row['comment_user_groups_read'] = explode(',', $row['comment_user_groups_read']); /* <-- ПОЛУЧЕНИЕ НОВОГО ПОЛЯ */ + $row['comment_user_groups_read'] = explode(',', $row['comment_user_groups_read']); - // Передаем данные в шаблон и показываем страницу с настройками модуля + + // Передаем данные в шаблон $AVE_Template->assign($row); $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . $this->_admin_settings_tpl)); } diff --git a/js/comment.js b/js/comment.js index 0e193e8..0386803 100644 --- a/js/comment.js +++ b/js/comment.js @@ -139,7 +139,7 @@ } } - function validate(formData, jqForm, options){ +function validate(formData, jqForm, options){ $('.alert').remove(); var form = jqForm ? jqForm[0] : $('#mod_comment_new form')[0]; @@ -156,6 +156,27 @@ $(form.comment_author_email).focus(); return false; } + + // --- НОВОЕ: Проверка динамических полей --- + + // Проверка Поля №1 (website) + if (typeof REQ_F1 !== 'undefined' && REQ_F1 == '1') { + if (form.comment_author_website && !form.comment_author_website.value) { + alert("Пожалуйста, заполните поле: " + NAME_F1); + $(form.comment_author_website).focus(); + return false; + } + } + + // Проверка Поля №2 (city) + if (typeof REQ_F2 !== 'undefined' && REQ_F2 == '1') { + if (form.comment_author_city && !form.comment_author_city.value) { + alert("Пожалуйста, заполните поле: " + NAME_F2); + $(form.comment_author_city).focus(); + return false; + } + } + // ------------------------------------------ // Проверка текста if (!form.comment_text || !form.comment_text.value){ diff --git a/lang/ru.txt b/lang/ru.txt index 0b482a7..46f0dda 100644 --- a/lang/ru.txt +++ b/lang/ru.txt @@ -89,4 +89,6 @@ COMMENT_BUTTON_CANCEL = "Отменить" COMMENT_CHARS_LEFT = "Количество оставшихся символов" COMMENT_BUTTON_CANCEL = "Отменить" COMMENT_BUTTON_RESET = "Очистить" -COMMENT_FOR_GROUPS_READ = "Группы пользователей, которым разрешен просмотр комментариев:" \ No newline at end of file +COMMENT_FOR_GROUPS_READ = "Группы пользователей, которым разрешен просмотр комментариев:" +COMMENT_HEADER_NAME = "Значение" +COMMENT_HEADER_PARAMETR = "Параметр" \ No newline at end of file diff --git a/sql.php b/sql.php index 2209654..06653e4 100644 --- a/sql.php +++ b/sql.php @@ -3,13 +3,7 @@ /** * AVE.cms - Модуль Комментарии * - * Данный файл является частью модуля "Комментарии" и содержит mySQL-запросы - * к базе данных при операцих установки, обновления и удаления модуля через Панель управления. - * - * @package AVE.cms - * @subpackage module_Comment - * @since 1.4 - * @filesource + * Обновленная структура с поддержкой произвольных полей */ $module_sql_install = array(); @@ -20,18 +14,25 @@ $module_sql_deinstall[] = "DROP TABLE IF EXISTS `%%PRFX%%_module_comments`;"; $module_sql_deinstall[] = "DROP TABLE IF EXISTS `%%PRFX%%_module_comment_info`;"; // ================================================================================= -// 1. ИЗМЕНЕНИЯ ДЛЯ УСТАНОВКИ МОДУЛЯ +// 1. УСТАНОВКА МОДУЛЯ (CREATE TABLE) // ================================================================================= $module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comments` ( `Id` tinyint(1) unsigned NOT NULL auto_increment, `comment_max_chars` smallint(3) unsigned NOT NULL default '1000', `comment_user_groups` text NOT NULL, - `comment_user_groups_read` text NOT NULL, /* <-- НОВОЕ ПОЛЕ ДЛЯ ПРАВ НА ПРОСМОТР */ + `comment_user_groups_read` text NOT NULL, `comment_need_approve` enum('0','1') NOT NULL default '0', `comment_active` enum('1','0') NOT NULL default '1', `comment_use_antispam` enum('1','0') NOT NULL default '1', `comment_use_page_nav` enum('1','0') NOT NULL default '1', `comment_page_nav_count` varchar(5) NOT NULL, + /* НОВЫЕ УНИВЕРСАЛЬНЫЕ ПОЛЯ НАСТРОЕК */ + `comment_show_f1` tinyint(1) NOT NULL default '1', + `comment_req_f1` tinyint(1) NOT NULL default '0', + `comment_name_f1` varchar(255) NOT NULL default '', + `comment_show_f2` tinyint(1) NOT NULL default '1', + `comment_req_f2` tinyint(1) NOT NULL default '0', + `comment_name_f2` varchar(255) NOT NULL default '', PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; @@ -42,8 +43,8 @@ $module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comment_info` ( `comment_author_name` varchar(255) NOT NULL, `comment_author_id` int(10) unsigned NOT NULL default '0', `comment_author_email` varchar(255) NOT NULL, - `comment_author_city` varchar(255) NOT NULL, - `comment_author_website` varchar(255) NOT NULL, + `comment_author_city` varchar(255) NOT NULL, /* Маппим Field 2 сюда */ + `comment_author_website` varchar(255) NOT NULL, /* Маппим Field 1 сюда */ `comment_author_ip` varchar(15) NOT NULL, `comment_published` int(10) unsigned NOT NULL default '0', `comment_changed` int(10) unsigned NOT NULL default '0', @@ -53,65 +54,36 @@ $module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comment_info` ( PRIMARY KEY (`Id`), KEY `document_id` (`document_id`), KEY `parent_id` (`parent_id`), - KEY `comment_status` (`comment_status`) + KEY `comment_status` (`comment_status`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;"; -// ИЗМЕНЕННАЯ СТРОКА: Устанавливаем права на просмотр по умолчанию для всех групп: 1, 2, 3, 4 -$module_sql_install[] = "INSERT INTO `%%PRFX%%_module_comments` VALUES (1, 1000, '1,3', '1,2,3,4', '0', '1', '1' , '0', '');"; -// ^ max chars, ^ write groups, ^ read groups (ИСПРАВЛЕНО), ^ need_approve ... +// Начальные данные (добавлены дефолтные значения для новых полей в конце строки) +$module_sql_install[] = "INSERT INTO `%%PRFX%%_module_comments` VALUES (1, 1000, '1,3', '1,2,3,4', '0', '1', '1' , '0', '', 1, 0, '', 1, 0, '');"; // ================================================================================= -// 2. ИЗМЕНЕНИЯ ДЛЯ ОБНОВЛЕНИЯ МОДУЛЯ (Добавление нового поля) +// 2. ОБНОВЛЕНИЕ МОДУЛЯ (ALTER TABLE) // ================================================================================= -// Обновление версии модуля (оставлено без изменений) $module_sql_update[] = " - UPDATE - `%%PRFX%%_module` + UPDATE `%%PRFX%%_module` SET ModuleAveTag = '" . $modul['ModuleAveTag'] . "', ModulePHPTag = '" . $modul['ModulePHPTag'] . "', ModuleVersion = '" . $modul['ModuleVersion'] . "' - WHERE - ModuleSysName = '" . $modul['ModuleSysName'] . "' + WHERE ModuleSysName = '" . $modul['ModuleSysName'] . "' LIMIT 1; "; -// Добавление нового столбца comment_user_groups_read в существующую таблицу -$module_sql_update[] = " - ALTER TABLE - `%%PRFX%%_module_comments` - ADD - `comment_user_groups_read` TEXT NOT NULL - AFTER - `comment_user_groups`; -"; +// Добавление новых столбцов управления полями +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_show_f1` TINYINT(1) NOT NULL DEFAULT '1';"; +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_req_f1` TINYINT(1) NOT NULL DEFAULT '0';"; +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_name_f1` VARCHAR(255) NOT NULL DEFAULT '';"; -// ИЗМЕНЕННАЯ СТРОКА: Заполнение нового столбца значением по умолчанию для всех групп: 1, 2, 3, 4 -$module_sql_update[] = " - UPDATE - `%%PRFX%%_module_comments` - SET - `comment_user_groups_read` = '1,2,3,4' - WHERE - `Id` = 1; -"; +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_show_f2` TINYINT(1) NOT NULL DEFAULT '1';"; +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_req_f2` TINYINT(1) NOT NULL DEFAULT '0';"; +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_name_f2` VARCHAR(255) NOT NULL DEFAULT '';"; -$module_sql_update[] = " - ALTER TABLE - `%%PRFX%%_module_comments` - ADD - `comment_use_page_nav` ENUM('0','1') NOT NULL DEFAULT '1' - AFTER - `comment_use_antispam`; -"; +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_user_groups_read` TEXT NOT NULL AFTER `comment_user_groups`;"; +$module_sql_update[] = "UPDATE `%%PRFX%%_module_comments` SET `comment_user_groups_read` = '1,2,3,4' WHERE `Id` = 1;"; -$module_sql_update[] = " - ALTER TABLE - `%%PRFX%%_module_comments` - ADD - `comment_page_nav_count` VARCHAR(5) NOT NULL - AFTER - `comment_use_page_nav`; -"; ?> \ No newline at end of file diff --git a/templates/admin_settings.tpl b/templates/admin_settings.tpl index 8e59e76..47438ca 100644 --- a/templates/admin_settings.tpl +++ b/templates/admin_settings.tpl @@ -6,16 +6,15 @@ -
@@ -25,81 +24,99 @@
- - - - - +
{#COMMENT_ENABLE_COMMENT#}
+ + + + + + + + + + + + + + + + - - - - + + + + + + - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - -
{#COMMENT_HEADER_NAME#}{#COMMENT_HEADER_PARAMETR#}{#COMMENT_HEADER_NAME#}{#COMMENT_HEADER_PARAMETR#}
{#COMMENT_ENABLE_COMMENT#}{#COMMENT_CHECK_ADMIN#}
{#COMMENT_CHECK_ADMIN#} - -
{#COMMENT_SPAMPROTECT#}{#COMMENT_USE_PAGE_NAV#}
{#COMMENT_SPAMPROTECT#} - -
{#COMMENT_PAGE_NAV_COUNT#}{#COMMENT_MAX_CHARS#}
{#COMMENT_USE_PAGE_NAV#} - -
{#COMMENT_PAGE_NAV_COUNT#} - -
{#COMMENT_FOR_GROUPS#} - -
{#COMMENT_FOR_GROUPS_READ#} - -
{#COMMENT_MAX_CHARS#}
+ + {#COMMENT_FOR_GROUPS#} + + + + {#COMMENT_FOR_GROUPS_READ#} + + + + + + Дополнительное поле №1 + Дополнительное поле №2 + + + Заголовок поля 1: + + +
+ +    + +
+ + Заголовок поля 2: + + +
+ +    + +
+ + + + + + + + +
\ No newline at end of file diff --git a/templates/comments_tree.tpl b/templates/comments_tree.tpl index cd7e6d2..940f87c 100644 --- a/templates/comments_tree.tpl +++ b/templates/comments_tree.tpl @@ -99,17 +99,27 @@ {/if} - {* Сайт и Город *} + {* ДИНАМИЧЕСКИЕ ПОЛЯ (Field 1 и Field 2) *}
+ {* Поле №1 *} + {if $comment_show_f1 == 1}
- - + +
+ {/if} + {* Поле №2 *} + {if $comment_show_f2 == 1}
- - + +
+ {/if}
{* Текст комментария *} @@ -169,10 +179,7 @@ {/if} - - {* ===================================================================== *} - {* НОВОЕ: МОДАЛЬНОЕ ОКНО ПОДТВЕРЖДЕНИЯ УДАЛЕНИЯ КОММЕНТАРИЯ (Bootstrap 5) *} - {* ===================================================================== *} + {* Модальное окно удаления ... *} {/foreach} \ No newline at end of file