/** * Возвращает похожие записи для объекта топика (по тегам) * * @param ModuleTopic_EntityTopic $oTopic * * @return array */ public function getSimilarTopicsForTopic(ModuleTopic_EntityTopic $oTopic) { if ($oTopic == null) { return array(); } // Вытаскиваем переменные с файлов Config // Максимальное количество топиков, которое выводится в блоке - iCountTopics // По какому параметру сортировать записи - sOrderBy // Как сортировать топики в выдаче $iCountTopics = Config::Get('plugin.similar.max_topics_count'); $sOrderBy = Config::Get('plugin.similar.topics_order_by'); $iOrderByDirection = Config::Get('plugin.similar.topics_order_by_direction'); $sLang = null; if (in_array('l10n', $this->Plugin_GetActivePlugins())) { $sLang = $this->PluginL10n_L10n_GetLangForQuery(); } // Генерируем ключ для кеша $key = "simular_topics_by_tags_for_" . $oTopic->getId() . ($sLang ? "_{$sLang}" : "") . "_{$iCountTopics}_{$sOrderBy}_{$iOrderByDirection}"; if (!($aTopicIds = $this->Cache_Get($key))) { $aTopicIds = $this->oMapper->getTopicIdForTags($oTopic->getTagsArray(), $iCountTopics + 1, $sOrderBy, $iOrderByDirection, $sLang); unset($aTopicIds[array_search($oTopic->getId(), $aTopicIds)]); // Кешируем массив топиков на один час $this->Cache_Set($aTopicIds, $key, array('topic_update'), 60 * 10); } // Пытаемся вытянуть массив топиков из кеша // Массив id'шек топиков похожих на текущий // Достаем топики вместе с дополнительной информацией (автор, блог и т.д.) $aTopics = $this->Topic_GetTopicsAdditionalData($aTopicIds, array('user' => array(), 'blog' => array('owner' => array()))); // Удаляем топики из недоступных для пользователя блогов $oUser = $this->User_GetUserCurrent(); $aInaccessibleBlogIds = $this->Blog_GetInaccessibleBlogsByUser($oUser); foreach ($aTopics as $oTopic) { if (in_array($oTopic->getBlogId(), $aInaccessibleBlogIds)) { unset($aTopics[$oTopic->getTopicId()]); } } return $aTopics; }