コード例 #1
0
 /**
  * @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);
 }