From 204cc148d188d304c7d7ef1336bc95e83aaad964 Mon Sep 17 00:00:00 2001 From: Repellent Date: Fri, 10 Jun 2016 22:50:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=84=D0=B0=D0=B9=D0=BB=20=D0=B2=20=D1=80=D0=B5=D0=BF?= =?UTF-8?q?=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rating/class.rating.php | 310 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 310 insertions(+) create mode 100644 rating/class.rating.php diff --git a/rating/class.rating.php b/rating/class.rating.php new file mode 100644 index 0000000..6b11e0b --- /dev/null +++ b/rating/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