/** * @param ForumUser2Section[] $sections * @param $limit * @param $offset * @param null $sectionId * @return array|static[] */ protected static function _findRecent($sections, $limit, $offset, $sectionId = null) { $guest = false; $sectionsIds = []; if (1 === count($sections) && is_null($sections[0])) { if (is_null($sectionId)) { return []; } $sectionsIds = [$sectionId]; $guest = true; } elseif (count($sections)) { $sectionsIds = ArrayHelper::get()->transform($sections, 'section_id'); } $userId = WebApp::get()->user()->isConnected() ? WebApp::get()->user()->id : 0; $reload = !WebApp::get()->cache()->exists('User:'******':visibleSubcategories'); $ids = []; if (!$reload) { $info = WebApp::get()->cache()->value('User:'******':visibleSubcategories'); if ($info['time'] < time() - 720) { //force refresh once every 30m $reload = true; } else { $ids = $info['categories']; } } if ($reload) { $condition = new ModelCondition(['model' => ForumSubcategory::className()]); $condition->with = ['category']; if ($guest) { $groups = [ForumSection::findByPk($sectionId)->default_visitors_group_id]; } else { $groups = ArrayHelper::get()->transform($sections, 'group_id'); } if ($groups) { $groups = implode(', ', $groups); $condition->join = "LEFT JOIN forum_groups2categories ON (forum_groups2categories.category_id = category.id AND forum_groups2categories.group_id IN ({$groups}))"; $condition->addCondition("forum_groups2categories.canread IS NULL OR forum_groups2categories.canread = 1"); $condition->addInCondition('category.section_id', $sectionsIds); $categories = ForumSubcategory::findAll($condition); } else { $categories = []; } $ids = []; foreach ($categories as $cat) { if (!isset($ids[$cat->category->section_id])) { $ids[$cat->category->section_id] = []; } $ids[$cat->category->section_id][] = $cat->id; } WebApp::get()->cache()->set('User:'******':visibleSubcategories', ['time' => time(), 'categories' => $ids]); } $finalIDs = []; if ($guest) { $finalIDs = $ids[$sectionId]; } else { foreach ($sections as $s) { if (isset($ids[$s->section_id])) { foreach ($ids[$s->section_id] as $id) { $finalIDs[] = $id; } } } } if (!$finalIDs) { return []; } $condition = new ModelCondition(['model' => __CLASS__]); $condition->with = ['category', 'subcategory', 'lastActiveUser', 'owner']; $condition->addInCondition('subcategory_id', $finalIDs); $condition->compareColumn('deleted', 0); $condition->order = "GREATEST(IFNULL(t.edit_time, t.create_time), IFNULL(t.last_reply_date, t.create_time)) DESC"; $condition->limit = $limit; $condition->offset = $offset; return self::findAll($condition); }