175 lines
8.1 KiB
PHP
175 lines
8.1 KiB
PHP
<?php
|
|
if (session_status() === PHP_SESSION_NONE) {
|
|
session_start();
|
|
}
|
|
require_once __DIR__ . '/../includes/resultsHelper.php';
|
|
|
|
$rawResults = $_SESSION["search_results"] ?? [];
|
|
|
|
// 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
|
|
$filteredResults = sortSearchResults($rawResults, $currentSort);
|
|
|
|
$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);
|
|
?>
|
|
<!--
|
|
Seite: Kategorie-Seite
|
|
Inhalt: Zeigt die Ergebnisse einer Kategorie an.
|
|
Funktioniert ohne JavaScript (serverseitige Sortierung/Filter/Pagination
|
|
über echte Links + Formulare) und wird bei aktiviertem JS von
|
|
js/search-results.js vollständig client-seitig übernommen.
|
|
-->
|
|
<div class="s-res-layout-grid">
|
|
<?php include_once "includes/alertMessages.php" ?>
|
|
|
|
<!-- Links: Seitenleiste für Filter und Suche -->
|
|
<aside class="s-res-sidebar">
|
|
<!-- Formular: sortiert die BEREITS gefundenen Ergebnisse.
|
|
Ohne JS: echter Reload dieser Seite, aber ohne erneute Datenbank-Suche.
|
|
Mit JS: search-results.js übernimmt das live im Browser, der Submit-Button
|
|
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">
|
|
<input type="hidden" name="pfad" value="search-results">
|
|
<input type="hidden" name="q" value="<?php echo htmlspecialchars($query); ?>">
|
|
|
|
<div class="s-res-sidebar-box">
|
|
<h3 class="s-res-sidebar-title">Sortierung</h3>
|
|
<div class="s-res-filter-group">
|
|
<label class="s-res-filter-option">
|
|
<input type="radio" name="sort" value="alphabet" class="sort-radio" <?php echo $currentSort === 'alphabet' ? 'checked' : ''; ?>>
|
|
<span>Alphabetisch</span>
|
|
</label>
|
|
<label class="s-res-filter-option">
|
|
<input type="radio" name="sort" value="likes" class="sort-radio" <?php echo $currentSort === 'likes' ? 'checked' : ''; ?>>
|
|
<span>Beliebtheit (Likes)</span>
|
|
</label>
|
|
<label class="s-res-filter-option">
|
|
<input type="radio" name="sort" value="newest" class="sort-radio" <?php echo $currentSort === 'newest' ? 'checked' : ''; ?>>
|
|
<span>Neueste Beiträge</span>
|
|
</label>
|
|
<label class="s-res-filter-option">
|
|
<input type="radio" name="sort" value="oldest" class="sort-radio" <?php echo $currentSort === 'oldest' ? 'checked' : ''; ?>>
|
|
<span>Älteste Beiträge</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<noscript>
|
|
<button type="submit" class="nav__search-button">Filter anwenden</button>
|
|
</noscript>
|
|
</form>
|
|
|
|
</aside>
|
|
|
|
<main class="s-res-main-content">
|
|
|
|
<div class="s-res-header">
|
|
<h1 class="s-res-main-title">Ergebnisse</h1>
|
|
<p class="s-res-meta"><span id="s-res-result-count"><?php echo $totalResultsCount; ?></span> Treffer in der Kategorie "<?php echo htmlspecialchars($currentCategory); ?>"</p>
|
|
</div>
|
|
|
|
<!-- Ergebnisliste -->
|
|
<div class="s-res-list">
|
|
<?php if (!empty($results)): ?>
|
|
|
|
<?php foreach ($results as $item):
|
|
$likesCount = getLikeCount($item);
|
|
?>
|
|
<div class="s-res-item" data-likes="<?php echo $likesCount; ?>" data-category="<?php echo strtolower($item['category'] ?? ''); ?>">
|
|
<div class="s-res-content">
|
|
<h2 class="s-res-item-title">
|
|
<a href="index.php?pfad=showArticle&id=<?php echo $item['id']; ?>" class="s-res-link">
|
|
<?php echo htmlspecialchars($item['title']); ?>
|
|
</a>
|
|
</h2>
|
|
<div class="s-res-meta-row">
|
|
<p class="s-res-author">Von: <span class="s-res-author-name"><?php echo htmlspecialchars($item['author']); ?></span></p>
|
|
|
|
<span class="s-res-likes">
|
|
❤️ <?php echo $likesCount; ?>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<div class="s-res-arrow">→</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
|
|
<?php elseif (isset($_SESSION["message"]) && $_SESSION["message"] === "invalid_search_query"): ?>
|
|
<p>Unzulässige Suchanfrage</p>
|
|
|
|
<?php elseif ($query !== "" && $totalResultsCount === 0 && count($rawResults) > 0): ?>
|
|
<p>Keine Beiträge in dieser Kategorie gefunden.</p>
|
|
<?php endif; ?>
|
|
<?php unset($_SESSION["message"]); ?>
|
|
|
|
</div>
|
|
|
|
<div class="s-res-pagination-footer">
|
|
|
|
<!-- Auswahl der Ergebnisse pro Seite. Gehört per form="..." logisch
|
|
zum Filterformular oben -->
|
|
<div class="s-res-limit-selector">
|
|
<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">
|
|
<option value="10" <?php echo $limit === 10 ? 'selected' : ''; ?>>10</option>
|
|
<option value="20" <?php echo $limit === 20 ? 'selected' : ''; ?>>20</option>
|
|
<option value="50" <?php echo $limit === 50 ? 'selected' : ''; ?>>50</option>
|
|
<option value="100" <?php echo $limit === 100 ? 'selected' : ''; ?>>100</option>
|
|
</select>
|
|
<noscript><button type="submit" form="s-res-filter-form" class="nav__search-button">Übernehmen</button></noscript>
|
|
</div>
|
|
|
|
<nav class="s-res-page-navigation" aria-label="Seitennavigation">
|
|
<!-- No-JS-Fallback: -->
|
|
<noscript>
|
|
<?php echo renderNoJsPagination($currentPage, $totalPages, $query, $currentSort, $currentCategory, $limit); ?>
|
|
</noscript>
|
|
|
|
<!-- JS-Version: wird per search-results.js befüllt/eingeblendet: -->
|
|
<div id="js-page-navigation" style="display:none;">
|
|
<button type="button" class="s-res-page-btn" id="prev-page-btn">«</button>
|
|
<span id="dynamic-page-numbers"></span>
|
|
<button type="button" class="s-res-page-btn" id="next-page-btn">»</button>
|
|
</div>
|
|
</nav>
|
|
|
|
</div>
|
|
</main>
|
|
|
|
</div>
|