diff --git a/README.md b/README.md index ac6cc47..272a70e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,15 @@ -# rating +### rating -Модуль рейтинг Только для AVE.CMS ALT \ No newline at end of file +## Модуль Рейтинг v1.26.1 + +### Данный модуль предназначен присваивать рейтинг документам. + + * Для оценки документа (рейтинга), нужно разместить системный тег [mod_rating] на странице необходимого документа. + * Вывод результатов (РЕЗУЛЬТАТОВ! НЕ ВОЗМОЖНОСТИ СТАВИТЬ ОЦЕНКУ!) рейтинга документа в других документах, запросами и .т.д. : + * Разместите в нужном месте [mod_rating:[tag:docid]] или [mod_rating:ХХХ] где XXX - ID документа, рейтинг которого нужно вывести. + +### Changelog: + +04.09.2019 - версия 1.26.1 - адаптация для версии ave.cms 3.26 + +10.06.2016 - старт версии 1.1 \ No newline at end of file diff --git a/admin/admin_ratings.tpl b/admin/admin_ratings.tpl new file mode 100644 index 0000000..33c7676 --- /dev/null +++ b/admin/admin_ratings.tpl @@ -0,0 +1,73 @@ +
{#RATING_MODULE_NAME#}
+ +
+
+ {#RATING_STATISTIC#} +
+
+ + + + +
+
+
{#RATING_LAST_TEN#}
+ +
+ + + + + + + + + + + + + + + + + + + + + {if $ratings} + {foreach from=$ratings item=rating} + + + + + + + + + {/foreach} + {else} + + + + {/if} + +
{#RATING_ID#}{#RATING_DOCUMENT#}{#RATING_RATE#}{#RATING_USER_ID#}{#RATING_DATE#}{#RATING_IP#}
{$rating->Id}{$rating->rating_name} (ID: {$rating->rating_id_doc}) + {section name=stars loop=$rating->rating_vote step=1 start=0} + + {/section} + {$rating->rating_id_user|escape}{$rating->rating_date|date_format:'%d %B %Y, %H:%M'|pretty_date}{$rating->rating_user_ip|escape}
+
    +
  • {#RATING_NO_ITEMS#}
  • +
+
+
+ diff --git a/admin/admin_settings.tpl b/admin/admin_settings.tpl new file mode 100644 index 0000000..e514abc --- /dev/null +++ b/admin/admin_settings.tpl @@ -0,0 +1,81 @@ +
{#RATING_MODULE_NAME#}
+ +
+
+ {#RATING_MODULE_SETTINGS#} +
+
+ + + + +
+
+
{#RATING_MODULE_SETTINGS#}
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
{#RATING_ENABLE#}
{#RATING_SETTINGS_STARS#} + +
{#RATING_ROUND#} + +
{#RATING_FOR_GROUPS#} + +
+ +
+
+ diff --git a/admin/star.png b/admin/star.png new file mode 100644 index 0000000..3614a35 Binary files /dev/null and b/admin/star.png differ diff --git a/class/rating.php b/class/rating.php new file mode 100644 index 0000000..6b11e0b --- /dev/null +++ b/class/rating.php @@ -0,0 +1,310 @@ +Query(" + SELECT * + FROM " . PREFIX . "_module_rating_settings + WHERE Id = '" . $this->_config_id . "' + ")->FetchAssocArray(); + } + + if ($param == '') return $settings; + + // В противном случае возвращаем уже имеющиеся значения + return (isset($settings[$param]) ? $settings[$param] : null); + } + + /** + * Метод, предназначенный для получения Title документа. + * + * @param string $id ID документа + */ + function _ratingGetDocumentTitle ($id) + { + global $AVE_DB; + + $doc_title = $AVE_DB->Query(" + SELECT document_title + FROM " . PREFIX . "_documents + WHERE id = '" . $id . "' + ")->GetCell(); + + // В противном случае возвращаем уже имеющиеся значения + return $doc_title; + } + + /** + * Метод, предназначенный для вывода модуля рейтинга в публичной части + * + * @param string $doc_id ID документа + * @param string $type параметр определяющий где выводится модуль (документ|запрос) + */ + function show ($doc_id, $type) + { + global $AVE_DB, $AVE_Template; + + // Проверяем, что в настройках модуль активен + if ($this->_ratingSettingsGet('rating_active') == 1) + { + // Разрешаем показ модуля на странице + $rating_sett['display_rating'] = 1; + + // Если группа пользователя, который в текущий момент просматривает документ попадает в список + // разрешенных (в настройках модуля), тогда создаем флаг, который будет разрешать к показу + // функцию голосования + if (in_array(UGROUP, explode(',', $this->_ratingSettingsGet('rating_user_groups')))) + { + $rating_sett['rating_can'] = 1; + } + + $rating_sett['rating_stars'] = $this->_ratingSettingsGet('rating_stars'); // Кол-во звезд + $rating_sett['rating_round'] = $this->_ratingSettingsGet('rating_round'); // Округление + + $rating = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_rating_summary + WHERE rating_id_doc = '" . $doc_id . "' + ")->FetchAssocArray(); + + @$rating['rating_type'] = $type; + @$rating['rating_total'] = (int)$rating['rating_total']; + @$rating['rating_sum'] = (int)$rating['rating_sum']; + @$rating['rating_math'] = (round(100/$rating_sett['rating_stars'], 0)); + @$rating['rating_percent'] = (round($rating['rating_sum']/$rating['rating_total'], $rating_sett['rating_round']))*$rating['rating_math']; + @$rating['rating_doc_id'] = $doc_id; + @$rating['rating_rating'] = round($rating['rating_sum']/$rating['rating_total'], $rating_sett['rating_round']); + + $AVE_Template->assign($rating); + $AVE_Template->assign($rating_sett); + $AVE_Template->display($this->tpl_dir . $this->rating_tpl); + } + } + + /** + * Метод, предназначенный для обработки голоса + * + * @param string $doc_id ID документа + * @param string $rate Голос + */ + function vote ($doc_id, $rate) + { + global $AVE_DB, $AVE_Template; + + + // Если группа пользователя, который в текущий момент просматривает документ попадает в список + // разрешенных (в настройках модуля), тогда создаем флаг, который будет разрешать к показу + // функцию голосования + if (in_array(UGROUP, explode(',', $this->_ratingSettingsGet('rating_user_groups')))) + { + + $user_indent = (isset($_SESSION['user_id']) ? "AND rating_id_user = '". (int)$_SESSION['user_id'] ."'" : "AND rating_user_ip = '". $_SERVER['REMOTE_ADDR'] . "'"); + + $rating_exist_detail = (int)$AVE_DB->Query(" + SELECT COUNT(*) FROM ". PREFIX . "_module_rating_details + WHERE + rating_id_doc = ". $doc_id ." + ". $user_indent ." + ")->GetCell(); + + $rating_exist_summary = (int)$AVE_DB->Query(" + SELECT COUNT(*) FROM ". PREFIX . "_module_rating_summary + WHERE rating_id_doc = " . $doc_id + )->GetCell(); + + if ($rate < 1 || $rate > $this->_ratingSettingsGet('rating_stars')) exit; + + if ($rating_exist_detail === 1) + { + exit (json_encode(array(0,$AVE_Template->get_config_vars('RATING_ALREADY')))); + } + else + { + $AVE_DB->Query(" + INSERT INTO ". PREFIX . "_module_rating_details + SET + rating_id_doc = '" . $doc_id . "', + rating_id_user = '" . (int)$_SESSION['user_id'] ."', + rating_vote = '" . $rate . "', + rating_date = '" . time() . "', + rating_user_ip = '" . $_SERVER['REMOTE_ADDR'] . "' + "); + + if ($rating_exist_summary === 1) + { + $AVE_DB->Query(" + UPDATE ". PREFIX . "_module_rating_summary + SET + rating_total = rating_total + 1, + rating_sum = rating_sum + " . $rate . " + WHERE + rating_id_doc = ". $doc_id ." + "); + } + else + { + $AVE_DB->Query(" + INSERT INTO ". PREFIX . "_module_rating_summary + SET + rating_id_doc = '" . $doc_id . "', + rating_total = '1', + rating_sum = '" . $rate . "' + "); + } + + $rating = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_rating_summary + WHERE rating_id_doc = '" . $doc_id . "' + ")->FetchAssocArray(); + $rating_sett['rating_stars'] = $this->_ratingSettingsGet('rating_stars'); // Кол-во звезд + $rating_sett['rating_round'] = $this->_ratingSettingsGet('rating_round'); // Округление + $rating['rating_math'] = (round(100/$rating_sett['rating_stars'], 0)); + $rating['rating_total'] = (int)$rating['rating_total']; + $rating['rating_percent'] = (round($rating['rating_sum']/$rating['rating_total'], $rating_sett['rating_round']))*$rating['rating_math']; + $rating['rating_rating'] = round($rating['rating_sum']/$rating['rating_total'], $rating_sett['rating_round']); + + exit (json_encode(array(1,$AVE_Template->get_config_vars('RATING_THANKS'), $rating['rating_total'], $rating['rating_percent'], $rating['rating_rating']))); + } + } + else + { + exit (json_encode(array(0,$AVE_Template->get_config_vars('RATING_UGROUP')))); + } + + exit; + } + + /** + * Метод, предназначенный для вывода последних + * голосов на главной странице модуля + * + * @param string $adm_dir - путь к шаблонам модуля + */ + function ratingAdminListShow ($adm_dir) + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT * FROM " . PREFIX . "_module_rating_details + ORDER BY Id DESC + LIMIT 0, 10 + "); + // Формируем массив из полученных данных + while ($row = $sql->FetchRow()) + { + $row->rating_name = $this->_ratingGetDocumentTitle($row->rating_id_doc); + $row->rating_id_user = get_username_by_id($row->rating_id_user); + + $ratings[] = $row; + } + + $AVE_Template->assign('ratings', $ratings); + $AVE_Template->assign('content', $AVE_Template->fetch($adm_dir . $this->_admin_ratings_tpl)); + } + + /** + * Метод, предназначенный для управления настройками модуля + * + * @param string $adm_dir - путь к шаблонам модуля + */ + function ratingAdminSettingsEdit ($adm_dir) + { + global $AVE_DB, $AVE_Template; + + // Если в запросе содержится подзапрос на сохранение данных (пользователь нажал кнопку + // сохранить изменения), тогда выполняем запрос к БД на обновление информации. + + if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'save') + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_rating_settings + SET + rating_user_groups = '" . @implode(',', $_POST['rating_user_groups']) . "', + rating_stars = '" . @(int)$_POST['rating_stars'] . "', + rating_round = '" . @(int)$_POST['rating_round'] . "', + rating_active = '" . @(int)$_POST['rating_active'] . "' + WHERE + Id = 1 + "); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('RATING_SETTINGS_SAVE')); + + // Выполняем обновление страницы с настройками модуля + header('Location:index.php?do=modules&action=modedit&mod=rating&moduleaction=settings&cp=' . SESSION); + } + + // Получаем список всех настроек модуля + $row = $this->_ratingSettingsGet(); + $row['rating_user_groups'] = explode(',', $row['rating_user_groups']); + + // Передаем данные в шаблон и показываем страницу с настройками модуля + $AVE_Template->assign($row); + $AVE_Template->assign('content', $AVE_Template->fetch($adm_dir . $this->_admin_settings_tpl)); + } + +} +?> \ No newline at end of file diff --git a/css/rating.css b/css/rating.css new file mode 100644 index 0000000..999ecd9 --- /dev/null +++ b/css/rating.css @@ -0,0 +1,68 @@ +.rating { + position: relative; + display: block; + float: left; + height: 16px; +} + +.rating_name, .rating_total, .rating_summary { + position: relative; + float: left; + height: 16px; + line-height: 16px; +} + +.rating_total, .rating_summary { + margin: 0 0 0 5px; + font-size: 12px; +} + +.rating_vote { + position: relative; + float: left; + margin: 0; + height: 16px; + background: url(../images/skin.png) left top repeat-x; + cursor: pointer; +} + +.rating_not_vote { + cursor: default; +} + +.rating_hover, .rating_percent { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 0; + background: url(../images/skin.png) repeat-x; +} + +.rating_percent { + background-position: left center; +} + +.rating_hover { + background-position: left bottom; +} + +.rating_mark { + position: relative; + float: left; + width: 18px; + height: 16px; +} + +.rating_status { + position: absolute; + top: 16px; + right: 0; + left: 0; + display: none; + height: 16px; + color: #aaa; + text-align: left; + font-size: 11px; + line-height: 20px; +} \ No newline at end of file diff --git a/images/skin.png b/images/skin.png new file mode 100644 index 0000000..9b5a025 Binary files /dev/null and b/images/skin.png differ diff --git a/images/skin_old.png b/images/skin_old.png new file mode 100644 index 0000000..628c3ef Binary files /dev/null and b/images/skin_old.png differ diff --git a/index.php b/index.php new file mode 100644 index 0000000..4ca25aa --- /dev/null +++ b/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/info.php b/info.php new file mode 100644 index 0000000..185c129 --- /dev/null +++ b/info.php @@ -0,0 +1,20 @@ + 'rating', + 'ModuleVersion' => '1.26.1', + 'ModuleAutor' => 'AVE.cms Team', + 'ModuleCopyright' => '© 2007-' . date('Y') . ' AVE.cms', + 'ModuleStatus' => 1, + 'ModuleIsFunction' => 1, + 'ModuleTemplate' => 0, + 'ModuleAdminEdit' => 1, + 'ModuleFunction' => 'mod_rating', + 'ModuleTag' => '[mod_rating]', + 'ModuleTagLink' => null, + 'ModuleAveTag' => '#\\\[mod_rating(:[\\\d]+)?]#', + 'ModulePHPTag' => "" + ); +?> \ No newline at end of file diff --git a/js/rating.js b/js/rating.js new file mode 100644 index 0000000..e3d1ac8 --- /dev/null +++ b/js/rating.js @@ -0,0 +1,43 @@ +window.onload = function() { + // Рейтинг + $('.rating_mark').click(function(e) { + e.preventDefault(); + var rating, doc_id, mark; + rating = $(this).parents('.rating'); + doc_id = rating.attr('data-id'); + mark = parseInt($(this).attr('data-mark')); + $.ajax({ + type: 'GET', + url: '/index.php?module=rating&action=vote', + data: ({ 'mark':mark, 'doc_id': doc_id }), + success: function(data) { + var array = $.parseJSON(data); + if (array[0]) + { + rating.find('.rating_percent').css('width',array[3]+'%'); + rating.find('.rating_total_num').text(array[2]); + rating.find('.rating_summary').find('strong').text(array[4]); + } + rating.find('.rating_status').text(array[1]).fadeIn(); + setTimeout(function() { + rating.find('.rating_status').fadeOut(); + }, 3000); + } + }); + }); + // + $('.rating_mark').hover( + function () { + var rating, mark, hover, stars; + rating = $(this).parents('.rating'); + mark = parseInt($(this).attr('data-mark')); + stars = rating.attr('data-stars'); + hover = Math.round(mark / stars * 100); + rating.find('.rating_hover').css('width', hover+'%'); + }, + function () { + $(this).parents('.rating').find('.rating_hover').css('width', 0); + } + ); + +}; \ No newline at end of file diff --git a/lang/index.php b/lang/index.php new file mode 100644 index 0000000..4ca25aa --- /dev/null +++ b/lang/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/lang/ru.txt b/lang/ru.txt new file mode 100644 index 0000000..51b8105 --- /dev/null +++ b/lang/ru.txt @@ -0,0 +1,37 @@ +[name] +MODULE_NAME = "Рейтинг документов" +MODULE_DESCRIPTION = "Звездный рейтинг документов" + +[public] +RATING_NAME = "Рейтинг" +RATING_SUMMARY = "Оценка:" +RATING_NOT = "нет оценки" +RATING_VOTES = "Голосов:" +RATING_FROM = "из" +RATING_THANKS = "Спасибо, ваш голос учтён!" +RATING_ALREADY = "Вы уже голосовали!" +RATING_UGROUP = "У вас нет прав для голосования!" + +[admin] +RATING_MODULE_NAME = "Звездный рейтинг" +RATING_MODULE_SETTINGS = "Настройки модуля" +RATING_ENABLE = "Модуль активен" +RATING_SETTINGS_STARS = "Количество звезд" +RATING_ROUND = "Округление значения рейтинга" +RATING_ROUND_1 = "Целое число (0)" +RATING_ROUND_2 = "Десятые (0.0)" +RATING_ROUND_3 = "Сотые (0.00)" +RATING_ROUND_4 = "Тысячные (0.000)" +RATING_SETTINGS_SAVE = "Изменил настройки модуля «Звездный рейтинг»" +RATING_FOR_GROUPS = "Группы пользователей, которым разрешены комментарии:" +RATING_BUTTON_SAVE = "Сохранить настройки" + +RATING_STATISTIC = "Статистика" +RATING_LAST_TEN = "Последние 10 оценок" +RATING_NO_ITEMS = "Нет данных по рейтингу документов" +RATING_ID = "Id" +RATING_DATE = "Дата создания" +RATING_DOCUMENT = "Документ" +RATING_USER_ID = "Пользователь" +RATING_RATE = "Рейтинг (Оценка)" +RATING_IP = "IP Пользователя" \ No newline at end of file diff --git a/module.php b/module.php new file mode 100644 index 0000000..b989564 --- /dev/null +++ b/module.php @@ -0,0 +1,104 @@ +tpl_dir = BASE_DIR . '/modules/rating/templates/'; + + // ланги + $lang_file = BASE_DIR . '/modules/rating/lang/' . $_SESSION['user_language'] . '.txt'; + $AVE_Template->config_load($lang_file, 'public'); + $config_vars = $AVE_Template->get_config_vars(); + $AVE_Template->assign('config_vars', $config_vars); + + // выводим рейтинг + $rating->show($doc_id, $type); +} + +//Публичные функции модуля +if (!defined('ACP') && !empty($_REQUEST['action']) && $_REQUEST['module'] == 'rating') +{ + // подключаем класс + require_once(BASE_DIR . '/modules/rating/class/rating.php'); + $rating = new docRating; + + // ланги + $lang_file = BASE_DIR . '/modules/rating/lang/' . $_SESSION['user_language'] . '.txt'; + $AVE_Template->config_load($lang_file, 'public'); + + switch($_REQUEST['action']) + { + case 'vote': // Учет голоса + + $percent = $rating->vote((int)$_REQUEST['doc_id'],(int)$_REQUEST['mark']); + $rating->vote((int)$_REQUEST['doc_id'], (int)$_REQUEST['mark']); + break; + } +} + +//Административные функции +if (defined('ACP') && !empty($_REQUEST['moduleaction'])) +{ + // Подключаем основной класс и создаем объект + require_once(BASE_DIR . '/modules/rating/class/rating.php'); + $rating = new docRating; + + $adm_dir = BASE_DIR . '/modules/rating/admin/'; + $tpl_dir = BASE_DIR . '/modules/rating/templates/'; + + // Определяем директори, где хранятся файлы с шаблонами модуля и подключаем языковые переменные + $lang_file = BASE_DIR . '/modules/rating/lang/' . $_SESSION['user_language'] . '.txt'; + $AVE_Template->config_load($lang_file, 'admin'); + $config_vars = $AVE_Template->get_config_vars(); + $AVE_Template->assign('config_vars', $config_vars); + + // Определяем, какой параметр пришел из строки запроса браузера + switch ($_REQUEST['moduleaction']) + { + // Если 1, тогда отображаем список всех голосов + case '1': + $rating->ratingAdminListShow($adm_dir); + break; + + // Если settings, тогда открываем страницу с настройками данного модуля + case 'settings': + // Подключаем файл класса для работы с пользователями, создаем объект и получаем список + // всех групп пользователей, имеющихся в системе. + require_once(BASE_DIR . '/class/class.user.php'); + $AVE_User = new AVE_User; + + $AVE_Template->assign('groups', $AVE_User->userGroupListGet()); + $rating->ratingAdminSettingsEdit($adm_dir); + break; + } +} + +?> \ No newline at end of file diff --git a/sql.php b/sql.php new file mode 100644 index 0000000..ca23b49 --- /dev/null +++ b/sql.php @@ -0,0 +1,107 @@ + \ No newline at end of file diff --git a/templates/rating.tpl b/templates/rating.tpl new file mode 100644 index 0000000..4d4fccb --- /dev/null +++ b/templates/rating.tpl @@ -0,0 +1,58 @@ +{* + +*} + +{if $display_rating ==1 } + + {assign var='width_1_star' value='18'} + + + + {if $rating_type == 'document'} + + + +
+
{#RATING_NAME#}:
+
+
+ {if $rating_can} +
+ {section name=stars loop=$rating_stars step=1 start=0} +
+ {/section} + {/if} +
+
({#RATING_VOTES#} {$rating_total})
+ +
{#RATING_SUMMARY#} {$rating_rating}
+
+
+ + {elseif $rating_type == 'request'} + +
+
+
+
+
{#RATING_SUMMARY#} {if $rating_rating != "0"}{$rating_rating}{else}{#RATING_NOT#}{/if}
+
+ + {/if} + +{/if} \ No newline at end of file