С помощью событий на добавление, изменение и удаление результатов голосований можно реализовать свой собственный рейтинг.

Например плюс-минус или среднее арифметическое от оценок. Внимание! В примере указаны 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;
   }
}



0  


 OnStartCheckVoting | Описание курса