Merge branch 'PaginatorOhneJS2' into dev
This commit is contained in:
@@ -0,0 +1,171 @@
|
||||
<?php
|
||||
/**
|
||||
* Hilfsfunktionen rund um die Suchergebnisse.
|
||||
*
|
||||
* Werden sowohl von content/search-results.php (No-JS-Rendering)
|
||||
* als auch von php/controller/search-results-data.php (JSON für
|
||||
* die JS-Hydration) genutzt, damit Sortier-/Filterlogik nur an
|
||||
* einer Stelle gepflegt werden muss
|
||||
*/
|
||||
|
||||
function getLikeCount($item): int
|
||||
{
|
||||
if (isset($item['likes']) && is_array($item['likes'])) {
|
||||
return count($item['likes']);
|
||||
}
|
||||
return (int)($item['likes'] ?? 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sortiert die Ergebnisse
|
||||
*/
|
||||
function sortSearchResults(array $results, string $sortStyle): array
|
||||
{
|
||||
switch ($sortStyle) {
|
||||
case 'likes':
|
||||
usort($results, function ($a, $b) {
|
||||
return getLikeCount($b) <=> getLikeCount($a);
|
||||
});
|
||||
break;
|
||||
case 'newest':
|
||||
usort($results, function ($a, $b) {
|
||||
return strcmp($b['creationDate'] ?? '', $a['creationDate'] ?? '');
|
||||
});
|
||||
break;
|
||||
case 'oldest':
|
||||
usort($results, function ($a, $b) {
|
||||
return strcmp($a['creationDate'] ?? '', $b['creationDate'] ?? '');
|
||||
});
|
||||
break;
|
||||
case 'alphabet':
|
||||
default:
|
||||
usort($results, function ($a, $b) {
|
||||
return strcasecmp($a['title'] ?? '', $b['title'] ?? '');
|
||||
});
|
||||
break;
|
||||
}
|
||||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filtert die Ergebnisse ('all' = kein Filter).
|
||||
*/
|
||||
function filterSearchResultsByCategory(array $results, string $category): array
|
||||
{
|
||||
$category = strtolower(trim($category));
|
||||
if ($category === '' || $category === 'all') {
|
||||
return $results;
|
||||
}
|
||||
return array_values(array_filter($results, function ($item) use ($category) {
|
||||
return strtolower($item['category'] ?? '') === $category;
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* Baut eine Such-Ergebnis-URL für einen bestimmten Seitenwechsel (No-JS-Pagination).
|
||||
*/
|
||||
function buildSearchResultsUrl(int $page, string $query, string $sort, string $category, int $limit): string
|
||||
{
|
||||
return "index.php?pfad=search-results"
|
||||
. "&q=" . urlencode($query)
|
||||
. "&sort=" . urlencode($sort)
|
||||
. "&category=" . urlencode($category)
|
||||
. "&limit=" . $limit
|
||||
. "&page=" . $page;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rendert eine rein serverseitige Pagination für den No-JS-Fall:
|
||||
*/
|
||||
function renderNoJsPagination(int $currentPage, int $totalPages, string $query, string $sort, string $category, int $limit): string
|
||||
{
|
||||
$html = '';
|
||||
|
||||
if ($currentPage > 1) {
|
||||
$html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildSearchResultsUrl($currentPage - 1, $query, $sort, $category, $limit)) . '">«</a> ';
|
||||
} else {
|
||||
$html .= '<span class="s-res-page-btn" aria-disabled="true">«</span> ';
|
||||
}
|
||||
|
||||
for ($i = 1; $i <= $totalPages; $i++) {
|
||||
if ($i === $currentPage) {
|
||||
$html .= '<span class="s-res-page-btn s-res-page-btn-active">' . $i . '</span> ';
|
||||
} else {
|
||||
$html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildSearchResultsUrl($i, $query, $sort, $category, $limit)) . '">' . $i . '</a> ';
|
||||
}
|
||||
}
|
||||
|
||||
if ($currentPage < $totalPages) {
|
||||
$html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildSearchResultsUrl($currentPage + 1, $query, $sort, $category, $limit)) . '">»</a>';
|
||||
} else {
|
||||
$html .= '<span class="s-res-page-btn" aria-disabled="true">»</span>';
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Filtert Ergebnisse anhand eines Suchbegriffs
|
||||
*
|
||||
* Wird von content/showCategory.php genutzt, um innerhalb einer bereits
|
||||
* geladenen Kategorie zu suchen.
|
||||
*/
|
||||
function filterResultsByQuery(array $results, string $query): array
|
||||
{
|
||||
$query = trim($query);
|
||||
if ($query === '') {
|
||||
return $results;
|
||||
}
|
||||
$needle = mb_strtolower($query);
|
||||
return array_values(array_filter($results, function ($item) use ($needle) {
|
||||
$haystack = mb_strtolower(($item['title'] ?? '') . ' ' . ($item['content'] ?? ''));
|
||||
return mb_strpos($haystack, $needle) !== false;
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* Baut eine Kategorie-URL für einen bestimmten Seitenwechsel (No-JS-Pagination).
|
||||
* Analog zu buildSearchResultsUrl, aber für pfad=showCategory (feste Kategorie,
|
||||
* dafür mit Freitext-Suche innerhalb der Kategorie statt Kategorie-Filter).
|
||||
*/
|
||||
function buildCategoryUrl(int $page, string $category, string $sort, string $query, int $limit): string
|
||||
{
|
||||
return "index.php?pfad=showCategory"
|
||||
. "&category=" . urlencode($category)
|
||||
. "&sort=" . urlencode($sort)
|
||||
. "&q=" . urlencode($query)
|
||||
. "&limit=" . $limit
|
||||
. "&page=" . $page;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rendert eine rein serverseitige Pagination für showCategory (No-JS-Fall).
|
||||
* Analog zu renderNoJsPagination.
|
||||
*/
|
||||
function renderNoJsPaginationCategory(int $currentPage, int $totalPages, string $category, string $sort, string $query, int $limit): string
|
||||
{
|
||||
$html = '';
|
||||
|
||||
if ($currentPage > 1) {
|
||||
$html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildCategoryUrl($currentPage - 1, $category, $sort, $query, $limit)) . '">«</a> ';
|
||||
} else {
|
||||
$html .= '<span class="s-res-page-btn" aria-disabled="true">«</span> ';
|
||||
}
|
||||
|
||||
for ($i = 1; $i <= $totalPages; $i++) {
|
||||
if ($i === $currentPage) {
|
||||
$html .= '<span class="s-res-page-btn s-res-page-btn-active">' . $i . '</span> ';
|
||||
} else {
|
||||
$html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildCategoryUrl($i, $category, $sort, $query, $limit)) . '">' . $i . '</a> ';
|
||||
}
|
||||
}
|
||||
|
||||
if ($currentPage < $totalPages) {
|
||||
$html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildCategoryUrl($currentPage + 1, $category, $sort, $query, $limit)) . '">»</a>';
|
||||
} else {
|
||||
$html .= '<span class="s-res-page-btn" aria-disabled="true">»</span>';
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
Reference in New Issue
Block a user