|
С помощью событий на добавление, изменение и удаление результатов голосований можно реализовать свой собственный рейтинг.
Например плюс-минус или среднее арифметическое от оценок. Внимание! В примере указаны ID инфоблоков 3 и 4. У вас могут быть другие. Пример автоматического пересчета рейтинга:
// файл /bitrix/php_interface/init.php
// пример автоматического пересчета суммарных значений рейтинга
// при добавлении, изменении и удалении результатов голосования
// Регистрируем обработчики
AddEventHandler("askaron.ibvote", "OnAfterIbvoteEventAdd", Array("CMyIbvote", "OnAfterIbvoteEventAddHandler"));
AddEventHandler("askaron.ibvote", "OnAfterIbvoteEventUpdate", Array("CMyIbvote", "OnAfterIbvoteEventUpdateHandler"));
AddEventHandler("askaron.ibvote", "OnAfterIbvoteEventDelete", Array("CMyIbvote", "OnAfterIbvoteEventDeleteHandler"));
// Класс с обработчиками событий для "Честного голосования".
// В функции CalcRating можно задать свою собственную функцию вычисления рейтинга. Например, +/-.
class CMyIbvote
{
// Список инфоблоков, для которых будет применяться пересчет рейтинга
static private $arIblockList = array(3, 4);
// Максимальная оценка при голосовании.
// Используется для расчета стандартного рейтинга.
static private $maxVote = 5;
// обработчики событий
static public function OnAfterIbvoteEventAddHandler(&$arFields)
{
if($arFields["ID"]>0)
{
self::UpdateRating($arFields["ELEMENT_ID"]);
}
}
static public function OnAfterIbvoteEventUpdateHandler($ID, &$arFields)
{
$res = CAskaronIbvoteEvent::GetByID($ID);
if ( $arItem = $res->Fetch() )
{
self::UpdateRating( $arItem["ELEMENT_ID"] );
}
}
static public function OnAfterIbvoteEventDeleteHandler($ID, &$arFields)
{
self::UpdateRating($arFields["ELEMENT_ID"]);
}
// функция, которая перезаписывает рейтинг
static private function UpdateRating( $ELEMENT_ID )
{
$ELEMENT_ID = intval($ELEMENT_ID);
if ($ELEMENT_ID > 0)
{
if(CModule::IncludeModule("iblock"))
{
// узнать номер инфоблока у элемента и заодно проверить, что элемент существует.
$IBLOCK_ID = self::GetIblockByElementID($ELEMENT_ID);
if ( $IBLOCK_ID )
{
// проверить, что элемент инфоблока в массиве из нашего списка
if ( in_array( $IBLOCK_ID, self::$arIblockList ) )
{
// теперь можно посчитать сумму и количество:
$count = 0;
$sum = 0;
$arFilter = array(
"ELEMENT_ID" => $ELEMENT_ID,
);
$res = CAskaronIbvoteEvent::GetList( array(), $arFilter );
while ( $arFields = $res->Fetch() )
{
$sum = $sum + $arFields["ANSWER"];
$count++;
}
// записываем рейтинг
if ( $count > 0 )
{
$rating = self::CalcRating( $count, $sum );
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array(
"vote_count" => $count,
"vote_sum" => $sum,
"rating" => $rating,
));
}
else
{
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array(
"vote_count" => "",
"vote_sum" => "",
"rating" => "",
));
}
// сбрасываем тэгированный кеш инфоблока
self::ClearCacheByIblockId($IBLOCK_ID);
}
}
}
}
}
// вычисление нового значения рейтинга
static private function CalcRating( $count, $sum )
{
// формула рейтинга +/-
// $result = 2*$sum - 3*$count;
// стандартная формула из компонента "Честное голосование":
// rating = ( SUM(vote)+31.25 ) / ( COUNT(*)+10 )
$result = round( ( $sum + 31.25 / 5 * self::$maxVote )/( $count+10 ), 2 );
return $result;
}
// очистка кэша инфоблока
static private function ClearCacheByIblockId($IBLOCK_ID)
{
global $CACHE_MANAGER;
$IBLOCK_ID=intval($IBLOCK_ID);
if( defined('BX_COMP_MANAGED_CACHE') && is_object( $CACHE_MANAGER ) && ( $IBLOCK_ID>0 ) )
{
$CACHE_MANAGER->ClearByTag( "iblock_id_".$IBLOCK_ID );
}
}
// поиск элемента инфоблока и получения ID инфоблока
static private function GetIblockByElementID($ID)
{
$result = false;
$arFilter = array('ID' => $ID);
$arSelect = array('ID', 'IBLOCK_ID');
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nTopCount"=>1), $arSelect);
if ( $arFields = $res->Fetch() )
{
$result = intval($arFields['IBLOCK_ID']);
}
return $result;
}
}
OnStartCheckVoting |
Описание курса
|