dev auf main #68

Open
niklas.ortmann wants to merge 1044 commits from devNachCSRF into main
3 changed files with 56 additions and 14 deletions
Showing only changes of commit ba11c216bd - Show all commits
+4 -4
View File
@@ -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>
+48 -3
View File
@@ -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>
+4 -7
View File
@@ -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
{ {