/** * Чтение событий * * @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; }