Ergänzt AJAX-Livesuche für Seiten, Beiträge und Mediathek
CMS quality / php (8.2) (push) Canceled after 0s
CMS quality / php (8.4) (push) Canceled after 0s
CMS quality / browser (push) Canceled after 0s
CMS quality / mysql (push) Canceled after 0s

This commit is contained in:
kantarci committed 2026-09-14 11:09:24 +02:00
1 parent 11b60fc5d8
commit 41d87f62a4
20 files changed
+703 -311

No files matched your search

+12 -7
View File
@@ -39,17 +39,22 @@ final class MediaLibrary
*
* @return array{items: list<array<string, mixed>>, total: int, page: int, pages: int, perPage: int}
*/
public function page(int $page, bool $withArchived = false, int $perPage = self::PER_PAGE): array
public function page(int $page, bool $withArchived = false, int $perPage = self::PER_PAGE, string $query = ''): array
{
$where = $withArchived ? '' : ' WHERE archived = 0';
$total = (int) $this->db->fetchOne('SELECT COUNT(*) FROM media'.$where);
$qb = $this->db->createQueryBuilder()->from('media');
if (!$withArchived) {
$qb->andWhere('archived = 0');
}
if ('' !== trim($query)) {
$qb->andWhere('(LOWER(title) LIKE :query ESCAPE \'!\' OR LOWER(alt) LIKE :query ESCAPE \'!\')')
->setParameter('query', '%'.str_replace(['!', '%', '_'], ['!!', '!%', '!_'], mb_strtolower(trim($query))).'%');
}
$total = (int) (clone $qb)->select('COUNT(*)')->executeQuery()->fetchOne();
$perPage = max(1, min(96, $perPage));
$pages = max(1, (int) ceil($total / $perPage));
$page = max(1, min($pages, $page));
$items = $this->db->fetchAllAssociative(
'SELECT * FROM media'.$where.' ORDER BY created_at DESC, id DESC LIMIT ? OFFSET ?',
[$perPage, ($page - 1) * $perPage],
);
$items = $qb->select('*')->orderBy('created_at', 'DESC')->addOrderBy('id', 'DESC')
->setMaxResults($perPage)->setFirstResult(($page - 1) * $perPage)->executeQuery()->fetchAllAssociative();
return [
'items' => array_map($this->present(...), $items),