/** * Отображает анонсы статей * * Страницы с анонсами могут иметь несколько типов: * 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]); }