dev auf main #68
@@ -85,7 +85,7 @@ $categories = [
|
|||||||
|
|
||||||
<!-- Formular 2: sortiert/filtert die BEREITS gefundenen Ergebnisse.
|
<!-- Formular 2: sortiert/filtert die BEREITS gefundenen Ergebnisse.
|
||||||
Ohne JS: echter Reload dieser Seite, aber ohne erneute Datenbank-Suche.
|
Ohne JS: echter Reload dieser Seite, aber ohne erneute Datenbank-Suche.
|
||||||
Mit JS: results-app.js übernimmt das live im Browser, der Submit-Button
|
Mit JS: search-results.js übernimmt das live im Browser, der Submit-Button
|
||||||
wird dafür nicht benötigt und über <noscript> versteckt. -->
|
wird dafür nicht benötigt und über <noscript> versteckt. -->
|
||||||
<form action="index.php" method="GET" id="s-res-filter-form" class="s-res-sidebar-form">
|
<form action="index.php" method="GET" id="s-res-filter-form" class="s-res-sidebar-form">
|
||||||
<input type="hidden" name="pfad" value="search-results">
|
<input type="hidden" name="pfad" value="search-results">
|
||||||
@@ -180,7 +180,7 @@ $categories = [
|
|||||||
<div class="s-res-pagination-footer">
|
<div class="s-res-pagination-footer">
|
||||||
|
|
||||||
<!-- Auswahl der Ergebnisse pro Seite. Gehört per form="..." logisch
|
<!-- Auswahl der Ergebnisse pro Seite. Gehört per form="..." logisch
|
||||||
zum Filterformular oben, bleibt aber optisch am Fuß der Liste. -->
|
zum Filterformular oben -->
|
||||||
<div class="s-res-limit-selector">
|
<div class="s-res-limit-selector">
|
||||||
<label for="s-res-per-page" class="s-res-limit-label">Ergebnisse pro Seite:</label>
|
<label for="s-res-per-page" class="s-res-limit-label">Ergebnisse pro Seite:</label>
|
||||||
<select id="s-res-per-page" name="limit" form="s-res-filter-form" class="s-res-limit-select">
|
<select id="s-res-per-page" name="limit" form="s-res-filter-form" class="s-res-limit-select">
|
||||||
@@ -193,12 +193,12 @@ $categories = [
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav class="s-res-page-navigation" aria-label="Seitennavigation">
|
<nav class="s-res-page-navigation" aria-label="Seitennavigation">
|
||||||
<!-- No-JS-Fallback: echte, funktionierende Links -->
|
<!-- No-JS-Fallback: -->
|
||||||
<noscript>
|
<noscript>
|
||||||
<?php echo renderNoJsPagination($currentPage, $totalPages, $query, $currentSort, $currentCategory, $limit); ?>
|
<?php echo renderNoJsPagination($currentPage, $totalPages, $query, $currentSort, $currentCategory, $limit); ?>
|
||||||
</noscript>
|
</noscript>
|
||||||
|
|
||||||
<!-- JS-Version: wird per results-app.js befüllt/eingeblendet -->
|
<!-- JS-Version: wird per search-results.js befüllt/eingeblendet: -->
|
||||||
<div id="js-page-navigation" style="display:none;">
|
<div id="js-page-navigation" style="display:none;">
|
||||||
<button type="button" class="s-res-page-btn" id="prev-page-btn">«</button>
|
<button type="button" class="s-res-page-btn" id="prev-page-btn">«</button>
|
||||||
<span id="dynamic-page-numbers"></span>
|
<span id="dynamic-page-numbers"></span>
|
||||||
|
|||||||
@@ -1,8 +1,53 @@
|
|||||||
<?php
|
<?php
|
||||||
include_once "php/controller/showCategory-controller.php";
|
if (session_status() === PHP_SESSION_NONE) {
|
||||||
|
session_start();
|
||||||
|
}
|
||||||
|
require_once __DIR__ . '/../includes/resultsHelper.php';
|
||||||
|
|
||||||
$currentSort = isset($sortStyle) ? $sortStyle : 'alphabet';
|
$rawResults = $_SESSION["search_results"] ?? [];
|
||||||
$currentPage = isset($page) ? $page : 1;
|
$query = $_SESSION["search_query"] ?? "";
|
||||||
|
|
||||||
|
// Sortierung / Kategorie / Limit: GET-Parameter haben Vorrang, sonst
|
||||||
|
// Rückfall auf die zuletzt in der Session gemerkten Werte. So bleibt
|
||||||
|
// z.B. ein reiner Pagination-Link (?page=2) bei der aktuellen
|
||||||
|
// Sortierung/Filterung.
|
||||||
|
$currentSort = $_GET['sort'] ?? ($_SESSION['search_sort'] ?? 'alphabet');
|
||||||
|
if (!in_array($currentSort, ['alphabet', 'likes', 'newest', 'oldest'])) {
|
||||||
|
$currentSort = 'alphabet';
|
||||||
|
}
|
||||||
|
$_SESSION['search_sort'] = $currentSort;
|
||||||
|
|
||||||
|
$currentCategory = strtolower($_GET['category'] ?? ($_SESSION['search_category'] ?? 'all'));
|
||||||
|
$_SESSION['search_category'] = $currentCategory;
|
||||||
|
|
||||||
|
$limit = isset($_GET['limit']) ? (int)$_GET['limit'] : ($_SESSION['search_limit'] ?? 10);
|
||||||
|
if (!in_array($limit, [10, 20, 50, 100])) {
|
||||||
|
$limit = 10;
|
||||||
|
}
|
||||||
|
$_SESSION['search_limit'] = $limit;
|
||||||
|
|
||||||
|
// Serverseitig sortieren + filtern
|
||||||
|
$filteredResults = sortSearchResults($rawResults, $currentSort);
|
||||||
|
$filteredResults = filterSearchResultsByCategory($filteredResults, $currentCategory);
|
||||||
|
|
||||||
|
$totalResultsCount = count($filteredResults);
|
||||||
|
$totalPages = max(1, (int)ceil($totalResultsCount / $limit));
|
||||||
|
|
||||||
|
$currentPage = isset($_GET['page']) ? (int)$_GET['page'] : 1;
|
||||||
|
if ($currentPage < 1) {
|
||||||
|
$currentPage = 1;
|
||||||
|
} elseif ($currentPage > $totalPages) {
|
||||||
|
$currentPage = $totalPages;
|
||||||
|
}
|
||||||
|
|
||||||
|
$offset = ($currentPage - 1) * $limit;
|
||||||
|
|
||||||
|
// Dies ist die No-JS-Basisversion: nur die aktuelle Seite wird gerendert.
|
||||||
|
// Bei aktiviertem JS lädt js/results-app.js zusätzlich den kompletten
|
||||||
|
// Datensatz nach (ein einziger Request) und übernimmt Sortierung, Filter
|
||||||
|
// und Pagination danach komplett im Browser, ohne weitere Serveranfragen.
|
||||||
|
$results = array_slice($filteredResults, $offset, $limit);
|
||||||
|
$resultCount = count($results);
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<noscript>
|
<noscript>
|
||||||
|
|||||||
@@ -5,12 +5,9 @@
|
|||||||
* Werden sowohl von content/search-results.php (No-JS-Rendering)
|
* Werden sowohl von content/search-results.php (No-JS-Rendering)
|
||||||
* als auch von php/controller/search-results-data.php (JSON für
|
* als auch von php/controller/search-results-data.php (JSON für
|
||||||
* die JS-Hydration) genutzt, damit Sortier-/Filterlogik nur an
|
* die JS-Hydration) genutzt, damit Sortier-/Filterlogik nur an
|
||||||
* einer Stelle gepflegt werden muss.
|
* einer Stelle gepflegt werden muss
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* Anzahl der Likes robust ermitteln (Array von Likes ODER bereits eine Zahl).
|
|
||||||
*/
|
|
||||||
function getLikeCount($item): int
|
function getLikeCount($item): int
|
||||||
{
|
{
|
||||||
if (isset($item['likes']) && is_array($item['likes'])) {
|
if (isset($item['likes']) && is_array($item['likes'])) {
|
||||||
@@ -20,7 +17,7 @@ function getLikeCount($item): int
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sortiert ein Array von Ergebnis-Assoziativarrays (wie in $_SESSION["search_results"] abgelegt).
|
* Sortiert die Ergebnisse
|
||||||
*/
|
*/
|
||||||
function sortSearchResults(array $results, string $sortStyle): array
|
function sortSearchResults(array $results, string $sortStyle): array
|
||||||
{
|
{
|
||||||
@@ -51,7 +48,7 @@ function sortSearchResults(array $results, string $sortStyle): array
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filtert ein Array von Ergebnissen nach Kategorie ('all' = kein Filter).
|
* Filtert die Ergebnisse ('all' = kein Filter).
|
||||||
*/
|
*/
|
||||||
function filterSearchResultsByCategory(array $results, string $category): array
|
function filterSearchResultsByCategory(array $results, string $category): array
|
||||||
{
|
{
|
||||||
@@ -78,7 +75,7 @@ function buildSearchResultsUrl(int $page, string $query, string $sort, string $c
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rendert eine rein serverseitige Pagination (echte <a>-Links) für den No-JS-Fall.
|
* Rendert eine rein serverseitige Pagination (echte <a>-Links) für den No-JS-Fall:
|
||||||
*/
|
*/
|
||||||
function renderNoJsPagination(int $currentPage, int $totalPages, string $query, string $sort, string $category, int $limit): string
|
function renderNoJsPagination(int $currentPage, int $totalPages, string $query, string $sort, string $category, int $limit): string
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user