310 lines
11 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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));
}
}
?>