示例#1
0
 /**
  * Отображает анонсы статей
  *
  * Страницы с анонсами могут иметь несколько типов:
  * byCat - по категории (показываются анонсы для статей данной категории и ее подкатегорий)
  * byDate - по дате (показываются статьи по определенным датам - за год, за месяц, за день)
  * index - главная страница (показывает анонсы всех статей, кроме запрещенных к показу на главной)
  * В зависимости от типа, базовый запрос, определяемый в начале метода, дополняется соответствующими условиями.
  *
  * Если категория представляет собой особый тип статьи (статья-категория), автоматически вызывается действие
  * actionFull.
  *
  * @return string
  * @throws NotFoundHttpException
  * @throws \app\components\TemporaryUnavailableException
  */
 public function actionShort()
 {
     // Получаем список всех категорий, переиндексированный по id категорий
     $categories = GlobalHelper::getCategories();
     // Создаем объект ActiveQuery, общий для всех вариантов (категорий, поиска, вывода по датам)
     $query = Post::find()->where(['approve' => Post::APPROVED])->orderBy(['date' => SORT_DESC]);
     // Определяем тип
     $type = Yii::$app->request->get('type');
     $subCategories = '';
     // Если выборка по категориям
     if ($type == 'byCat') {
         // Получаем id категории и ее дочерних (если они есть) в виде массива
         $categoryIds = GlobalHelper::getCategoryIdByUrl(Yii::$app->request->get('cat'));
         // Записываем id текущей категории в глобальный параметр
         $categoryId = GlobalHelper::getCategoryIdByUrl(Yii::$app->request->get('cat'), true);
         Yii::$app->params['category'] = $categoryId;
         // Проверяем, является ли категория статьей и если да, запускаем метод actionFull
         if ($categories[$categoryId[0]]['category_art'] != 0) {
             Yii::$app->params['category_art'] = $categories[$categoryId[0]]['category_art'];
             return $this->actionFull();
         }
         // Если страница первая, проверяем, есть ли у данной категории подкатегории.
         // Если есть, выводим их сверху
         $subCats = [];
         if (Yii::$app->request->get('page') == 1) {
             foreach ($categories as $cat) {
                 if ($cat['parent_id'] == $categoryId[0] && $cat['category_art'] == 0) {
                     $subCats[] = $cat['id'];
                 }
             }
             if (!empty($subCats)) {
                 $subCategories = $this->renderPartial('short_cat', ['categories' => $subCats]);
             }
         }
         // Добавляем к списку подкатегорий запрашиваемую категорию
         $subCats[] = $categoryId[0];
         $query->andWhere('category_id IN (' . implode(',', $subCats) . ')');
     }
     // Если выборка по датам
     if ($type == 'byDate') {
         //var_dump(Yii::$app->request->get('year'));
         $y = Yii::$app->request->get('year') ? Yii::$app->request->get('year') : date('Y');
         $m = Yii::$app->request->get('month');
         $d = Yii::$app->request->get('day');
         // Записываем дату в глобальный параметр для постраничной навигации
         Yii::$app->params['date'] = $y . ($m ? '/' . $m : '') . ($d ? '/' . $d : '');
         $date = $y;
         $dateFormat = '%Y';
         // Если задан месяц
         if ($m) {
             $dateFormat .= '-%m';
             $date .= '-' . $m;
             if ($d) {
                 $dateFormat .= '-%d';
                 $date .= '-' . $d;
             }
         }
         $query->andWhere("DATE_FORMAT( DATE, '{$dateFormat}' ) = :date", [':date' => $date]);
     }
     // Если главная страница и просто страницы
     if (!$type || $type == 'index') {
         $query->andWhere(['allow_main' => 1]);
     }
     // Постраничная навигация
     $countPosts = clone $query;
     $pages = new Pagination(['totalCount' => $countPosts->count(), 'route' => 'post/short']);
     $posts = $query->offset($pages->offset)->limit($pages->limit)->all();
     // Рендеринг контента
     return $this->render('short', ['posts' => $posts, 'pages' => $pages, 'categories' => $categories, 'subCategories' => $subCategories]);
 }