/** * @Route("/", methods="GET") * @Request({"filter": "array", "page":"int"}) */ public function indexAction($filter = [], $page = 0) { $query = Post::query(); $filter = array_merge(array_fill_keys(['status', 'search', 'author', 'order', 'limit'], ''), $filter); extract($filter, EXTR_SKIP); if (!App::user()->hasAccess('blog: manage all posts')) { $author = App::user()->id; } if (is_numeric($status)) { $query->where(['status' => (int) $status]); } if ($search) { $query->where(function ($query) use($search) { $query->orWhere(['title LIKE :search', 'slug LIKE :search'], ['search' => "%{$search}%"]); }); } if ($author) { $query->where(function ($query) use($author) { $query->orWhere(['user_id' => (int) $author]); }); } if (!preg_match('/^(date|title|comment_count)\\s(asc|desc)$/i', $order, $order)) { $order = [1 => 'date', 2 => 'desc']; } $limit = (int) $limit ?: App::module('blog')->config('posts.posts_per_page'); $count = $query->count(); $pages = ceil($count / $limit); $page = max(0, min($pages - 1, $page)); $posts = array_values($query->offset($page * $limit)->related('user', 'comments')->limit($limit)->orderBy($order[1], $order[2])->get()); return compact('posts', 'pages', 'count'); }