Repellent
9 years ago
1 changed files with 310 additions and 0 deletions
@ -0,0 +1,310 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* Класс работы с модулем Звездный рейтинг |
||||
* |
||||
* @package AVE.cms |
||||
* @subpackage mod_rating |
||||
* @filesource |
||||
*/ |
||||
|
||||
class docRating |
||||
{ |
||||
/** |
||||
* Свойства класса |
||||
*/ |
||||
|
||||
/** |
||||
* Идентификатор записи с настройками модуля |
||||
* |
||||
* @var int |
||||
*/ |
||||
var $_config_id = 1; |
||||
|
||||
/** |
||||
* Имя файла с шаблоном списка голосов в административной части |
||||
* |
||||
* @var string |
||||
*/ |
||||
var $_admin_ratings_tpl = 'admin_ratings.tpl'; |
||||
|
||||
/** |
||||
* Имя файла с шаблоном редактирования настроек модуля в административной части |
||||
* |
||||
* @var string |
||||
*/ |
||||
var $_admin_settings_tpl = 'admin_settings.tpl'; |
||||
|
||||
/** |
||||
* Имя файла с шаблоном в публичной части |
||||
* |
||||
* @var string |
||||
*/ |
||||
var $rating_tpl = 'rating.tpl'; |
||||
|
||||
/** |
||||
* Внешние методы класса |
||||
*/ |
||||
|
||||
/** |
||||
* Метод, предназначенный для получения основных настроек модуля, которые задаются в Панели управления. |
||||
* |
||||
* @param string $param название параметра |
||||
* @return mixed значение настройки |
||||
*/ |
||||
function _ratingSettingsGet ($param = '') |
||||
{ |
||||
global $AVE_DB; |
||||
|
||||
// Определяем статическую переменную, которая будет хранить полученные настройки |
||||
// на протяжении всего срока жизни объекта. |
||||
static $settings = null; |
||||
|
||||
// Если переменная $settings еще не имеет значений, тогда выполняем |
||||
// запрос к БД на получение данных |
||||
if ($settings === null) |
||||
{ |
||||
$settings = $AVE_DB->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)); |
||||
} |
||||
|
||||
} |
||||
?> |
Loading…
Reference in new issue