Lehrplan: ?module=X-Filter in lehrplan.php (Modul-Fokus-Banner)

- lehrplan.php liest jetzt den Query-Parameter ?module=<id> und
  filtert die Kompetenz-Cards auf die dem Modul zugeordneten
  Eintraege (via kompetenz_modules)
- Modul-Fokus-Banner ueber dem Hero: Icon, Titel, "Zurueck zur
  Simulation"-Link, "Alle Module anzeigen"-Link
- Hero-Titel + Meta-Description + <title>-Tag spiegeln den Fokus
- Ungueltige Modul-Slugs fallen stillschweigend auf Full-View zurueck
- Alle bestehenden Filter (country, theme) wirken weiterhin
  gleichzeitig

Use-Case: Atlas' Template-Button 📚 Lehrplan in den Sim-Wrappern
zeigt aktuell auf /modul-<id>#lehrplan-bezug. Diese Seite dient als
Alternative/Fallback, falls jemand direkt auf lehrplan.php?module=X
landet.

Verifiziert:
- lehrplan?module=logistik      6 Kompetenzen (von 10)
- lehrplan?module=klima         1 Kompetenz
- lehrplan?module=fluss         2 Kompetenzen (Naturgefahren + Stadt)
- lehrplan?module=unknown       10 Kompetenzen (Full-View Fallback)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-24 09:26:03 +02:00
parent e300b12c38
commit d37857f12a
+73 -8
View File
@@ -33,12 +33,34 @@ if (isset($_GET['country'])) {
$qTheme = preg_replace('/[^a-z0-9_-]/', '', strtolower($_GET['theme'] ?? '')); $qTheme = preg_replace('/[^a-z0-9_-]/', '', strtolower($_GET['theme'] ?? ''));
$qModule = preg_replace('/[^a-z0-9_-]/', '', strtolower($_GET['module'] ?? '')); $qModule = preg_replace('/[^a-z0-9_-]/', '', strtolower($_GET['module'] ?? ''));
// Alle Kompetenzen mit Zuordnungen + Ankern laden // Wenn `?module=X` gesetzt: Metadaten des Moduls laden (fuer Banner + Titel)
$kompetenzen = $db->query(' $moduleFocus = null;
if ($qModule !== '') {
$stmt = $db->prepare('SELECT module_id, title, icon, card_image, status, page_url FROM module_info WHERE module_id = ?');
$stmt->execute([$qModule]);
$moduleFocus = $stmt->fetch() ?: null;
if (!$moduleFocus) $qModule = ''; // ungueltiger Slug
}
// Kompetenzen laden — optional gefiltert auf Modul-Zuordnungen
if ($qModule !== '') {
$stmt = $db->prepare('
SELECT k.id, k.key_slug, k.title, k.description, k.category, k.age_min, k.age_max, k.sort_order
FROM kompetenzen k
INNER JOIN kompetenz_modules km ON km.kompetenz_id = k.id
WHERE km.module_id = ?
GROUP BY k.id
ORDER BY k.sort_order, k.title
');
$stmt->execute([$qModule]);
$kompetenzen = $stmt->fetchAll();
} else {
$kompetenzen = $db->query('
SELECT id, key_slug, title, description, category, age_min, age_max, sort_order SELECT id, key_slug, title, description, category, age_min, age_max, sort_order
FROM kompetenzen FROM kompetenzen
ORDER BY sort_order, title ORDER BY sort_order, title
')->fetchAll(); ')->fetchAll();
}
// Module je Kompetenz // Module je Kompetenz
$modStmt = $db->prepare(' $modStmt = $db->prepare('
@@ -107,8 +129,8 @@ $categoryMeta = [
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Lehrplan-Übersicht — Lehrplan geograsim.at</title> <title><?= $moduleFocus ? 'Lehrplan-Bezug: ' . esc($moduleFocus['title']) : 'Lehrplan-Übersicht' ?> — Lehrplan geograsim.at</title>
<meta name="description" content="Alle Lehrplan-Verankerungen der GeoGraSim-Simulationen für Österreich, Deutschland, Schweiz und Liechtenstein — gruppiert nach didaktischem Kompetenzbereich."> <meta name="description" content="<?= $moduleFocus ? 'Lehrplan-Verankerung der Simulation ' . esc($moduleFocus['title']) . ' in Österreich, Deutschland, Schweiz und Liechtenstein.' : 'Alle Lehrplan-Verankerungen der GeoGraSim-Simulationen für Österreich, Deutschland, Schweiz und Liechtenstein — gruppiert nach didaktischem Kompetenzbereich.' ?>">
<link rel="icon" type="image/svg+xml" href="<?= $bp ?>/favicon.svg"> <link rel="icon" type="image/svg+xml" href="<?= $bp ?>/favicon.svg">
<link rel="icon" type="image/png" href="<?= $bp ?>/favicon-96x96.png" sizes="96x96"> <link rel="icon" type="image/png" href="<?= $bp ?>/favicon-96x96.png" sizes="96x96">
<link rel="stylesheet" href="<?= $bp ?>/assets/fonts/inter.css"> <link rel="stylesheet" href="<?= $bp ?>/assets/fonts/inter.css">
@@ -138,6 +160,28 @@ $categoryMeta = [
.lp-btn-sm.lp-btn-primary { background: var(--ggs-fjord); color: var(--ggs-white); border-color: var(--ggs-fjord); } .lp-btn-sm.lp-btn-primary { background: var(--ggs-fjord); color: var(--ggs-white); border-color: var(--ggs-fjord); }
.lp-easy-pill { background: var(--ggs-moss-light); color: var(--ggs-moss-dark); border-color: var(--ggs-moss); font-weight: 700; } .lp-easy-pill { background: var(--ggs-moss-light); color: var(--ggs-moss-dark); border-color: var(--ggs-moss); font-weight: 700; }
/* ===== Modul-Fokus-Banner (bei ?module=X) ===== */
.lp-focus-banner {
background: var(--ggs-fjord-light); color: var(--ggs-fjord-dark);
border-bottom: 1px solid var(--ggs-border);
padding: .9rem 1.5rem;
display: flex; align-items: center; gap: 1rem;
flex-wrap: wrap;
}
.lp-focus-icon { font-size: 1.8rem; line-height: 1; }
.lp-focus-text { flex: 1; min-width: 200px; display: flex; flex-direction: column; gap: 2px; }
.lp-focus-text strong { font-size: 1rem; font-weight: 800; }
.lp-focus-sub { font-size: .82rem; color: var(--ggs-text-muted); }
.lp-focus-action {
display: inline-flex; align-items: center; min-height: 36px;
padding: .4rem .9rem; border-radius: var(--ggs-radius-pill);
background: var(--ggs-white); color: var(--ggs-fjord-dark);
border: 1px solid var(--ggs-fjord);
font-size: .82rem; font-weight: 600; text-decoration: none;
transition: all .2s var(--ggs-ease);
}
.lp-focus-action:hover { background: var(--ggs-fjord); color: var(--ggs-white); }
/* ===== Hero ===== */ /* ===== Hero ===== */
.lp-hero { .lp-hero {
background: linear-gradient(135deg, var(--ggs-fjord-dark) 0%, var(--ggs-fjord) 100%); background: linear-gradient(135deg, var(--ggs-fjord-dark) 0%, var(--ggs-fjord) 100%);
@@ -370,18 +414,39 @@ $categoryMeta = [
<a href="<?= $bp ?>/login.html" class="lp-btn-sm lp-btn-primary">Anmelden</a> <a href="<?= $bp ?>/login.html" class="lp-btn-sm lp-btn-primary">Anmelden</a>
</header> </header>
<?php if ($moduleFocus): ?>
<!-- Modul-Fokus-Banner: der Link kommt aus einer Simulation oder Modul-Detailseite -->
<div class="lp-focus-banner">
<span class="lp-focus-icon"><?= esc($moduleFocus['icon']) ?></span>
<div class="lp-focus-text">
<strong>Lehrplan-Bezug für <?= esc($moduleFocus['title']) ?></strong>
<span class="lp-focus-sub">Gefiltert auf die Kompetenzbereiche dieser Simulation.</span>
</div>
<?php if (!empty($moduleFocus['page_url'])): ?>
<a href="<?= $bp ?>/<?= esc($moduleFocus['page_url']) ?>" class="lp-focus-action">← Zurück zur Simulation</a>
<?php endif; ?>
<a href="<?= $bp ?>/pages/lehrplan.php" class="lp-focus-action">Alle Module anzeigen</a>
</div>
<?php endif; ?>
<!-- HERO --> <!-- HERO -->
<section class="lp-hero"> <section class="lp-hero">
<h1>Lehrplan-Übersicht</h1> <h1><?= $moduleFocus ? 'Lehrplan-Bezug: ' . esc($moduleFocus['title']) : 'Lehrplan-Übersicht' ?></h1>
<p> <p>
<?php if ($moduleFocus): ?>
Diese Ansicht zeigt alle Kompetenzbereiche, die die Simulation
<strong><?= esc($moduleFocus['title']) ?></strong> abdeckt — fachlich,
fächerübergreifend und mit Anknüpfungspunkten in weiteren Fächern.
<?php else: ?>
Alle GeoGraSim-Simulationen sind auf didaktische Kompetenzbereiche Alle GeoGraSim-Simulationen sind auf didaktische Kompetenzbereiche
abgebildet. Für jeden Bereich zeigen wir, wo er in den Lehrplänen abgebildet. Für jeden Bereich zeigen wir, wo er in den Lehrplänen
für Österreich, Deutschland, Schweiz und Liechtenstein verankert ist — für Österreich, Deutschland, Schweiz und Liechtenstein verankert ist —
fachlich, fächerübergreifend und mit Anknüpfungspunkten in weiteren Fächern. fachlich, fächerübergreifend und mit Anknüpfungspunkten in weiteren Fächern.
<?php endif; ?>
</p> </p>
<div class="lp-hero-stats"> <div class="lp-hero-stats">
<div class="lp-hero-stat"><span class="lp-hero-stat-num"><?= count($kompetenzen) ?></span><span class="lp-hero-stat-lbl">Kompetenzbereiche</span></div> <div class="lp-hero-stat"><span class="lp-hero-stat-num"><?= count($kompetenzen) ?></span><span class="lp-hero-stat-lbl"><?= $moduleFocus ? 'Kompetenzen für dieses Modul' : 'Kompetenzbereiche' ?></span></div>
<div class="lp-hero-stat"><span class="lp-hero-stat-num"><?= $totalAnchors ?></span><span class="lp-hero-stat-lbl">Lehrplan-Anker</span></div> <div class="lp-hero-stat"><span class="lp-hero-stat-num"><?= $totalAnchors ?></span><span class="lp-hero-stat-lbl">Lehrplan-Anker gesamt</span></div>
<div class="lp-hero-stat"><span class="lp-hero-stat-num">4</span><span class="lp-hero-stat-lbl">Länder</span></div> <div class="lp-hero-stat"><span class="lp-hero-stat-num">4</span><span class="lp-hero-stat-lbl">Länder</span></div>
</div> </div>
</section> </section>