|  | С помощью событий на добавление, изменение и удаление результатов голосований можно реализовать свой собственный рейтинг. 
 Например плюс-минус или среднее арифметическое от оценок. Внимание! В примере указаны 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 |
		
		Описание курса
 |