$sortMap * @return array{page: int, per_page: int, sort: string, order: string, search: string} */ public static function parseParams(array $sortMap, string $defaultSort = 'created_at'): array { $sort = $_GET['sort'] ?? $defaultSort; $order = strtoupper($_GET['order'] ?? 'DESC') === 'ASC' ? 'ASC' : 'DESC'; $page = max(1, (int) ($_GET['page'] ?? 1)); $perPage = min(self::MAX_PER_PAGE, max(1, (int) ($_GET['per_page'] ?? self::DEFAULT_PER_PAGE))); $search = trim($_GET['search'] ?? ''); if (!isset($sortMap[$sort])) { errorResponse('Neplatný parametr řazení', 400); } return [ 'page' => $page, 'per_page' => $perPage, 'sort' => $sortMap[$sort], 'order' => $order, 'search' => $search ? mb_substr($search, 0, 100) : '', ]; } /** * Spusti COUNT + SELECT dotazy s pagination a vrati vysledek. * * @param PDO $pdo * @param string $countSql - COUNT(*) dotaz * @param string $dataSql - SELECT dotaz (bez LIMIT/OFFSET) * @param array $params - parametry pro prepared statement * @param array{page: int, per_page: int, sort: string, order: string} $pagination * @return array{items: array>, * pagination: array{total: int, page: int, per_page: int, total_pages: int}} */ public static function paginate( PDO $pdo, string $countSql, string $dataSql, array $params, array $pagination ): array { $page = $pagination['page']; $perPage = $pagination['per_page']; $stmt = $pdo->prepare($countSql); $stmt->execute($params); $total = (int) $stmt->fetchColumn(); $offset = ($page - 1) * $perPage; $totalPages = (int) ceil($total / $perPage); $sql = "{$dataSql} LIMIT {$perPage} OFFSET {$offset}"; $stmt = $pdo->prepare($sql); $stmt->execute($params); $items = $stmt->fetchAll(); return [ 'items' => $items, 'pagination' => [ 'total' => $total, 'page' => $page, 'per_page' => $perPage, 'total_pages' => $totalPages, ], ]; } }