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