310 lines
11 KiB
PHP
310 lines
11 KiB
PHP
<?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));
|
||
}
|
||
|
||
}
|
||
?>
|