Ejemplo n.º 1
0
 /**
  * Чтение событий
  *
  * @param array      $aEventTypes    Список типов событий
  * @param array|null $aUsersList     Список пользователей, чьи события читать
  * @param int        $iCount         Количество
  * @param int        $iFromId        ID события с которого начинать выборку
  *
  * @return array
  */
 public function ReadEvents($aEventTypes, $aUsersList, $iCount = null, $iFromId = null)
 {
     if (!is_null($aUsersList) and !count($aUsersList)) {
         return array();
     }
     if (!$iCount) {
         $iCount = Config::Get('module.stream.count_default');
     }
     $aEventTypes = $this->getEventTypesFilter($aEventTypes);
     if (!count($aEventTypes)) {
         return array();
     }
     /**
      * Получаем список событий
      */
     $aEvents = $this->oMapper->Read($aEventTypes, $aUsersList, $iCount, $iFromId);
     /**
      * Составляем список объектов для загрузки
      */
     $aNeedObjects = array();
     foreach ($aEvents as $oEvent) {
         if (isset($this->aEventTypes[$oEvent->getEventType()]['related'])) {
             $aNeedObjects[$this->aEventTypes[$oEvent->getEventType()]['related']][] = $oEvent->getTargetId();
         }
         $aNeedObjects['user'][] = $oEvent->getUserId();
     }
     /**
      * Получаем объекты
      */
     $aObjects = array();
     foreach ($aNeedObjects as $sType => $aListId) {
         if (count($aListId)) {
             $aListId = array_unique($aListId);
             $sMethod = 'loadRelated' . ucfirst($sType);
             if (method_exists($this, $sMethod)) {
                 if ($aRes = $this->{$sMethod}($aListId)) {
                     foreach ($aRes as $oObject) {
                         $aObjects[$sType][$oObject->getId()] = $oObject;
                     }
                 }
             }
         }
     }
     /**
      * Формируем результирующий поток
      */
     foreach ($aEvents as $key => $oEvent) {
         /**
          * Жестко вытаскиваем автора события
          */
         if (isset($aObjects['user'][$oEvent->getUserId()])) {
             $oEvent->setUser($aObjects['user'][$oEvent->getUserId()]);
             /**
              * Аттачим объекты
              */
             if (isset($this->aEventTypes[$oEvent->getEventType()]['related'])) {
                 $sTypeObject = $this->aEventTypes[$oEvent->getEventType()]['related'];
                 if (isset($aObjects[$sTypeObject][$oEvent->getTargetId()])) {
                     $oEvent->setTarget($aObjects[$sTypeObject][$oEvent->getTargetId()]);
                 } else {
                     unset($aEvents[$key]);
                 }
             } else {
                 unset($aEvents[$key]);
             }
         } else {
             unset($aEvents[$key]);
         }
     }
     return $aEvents;
 }