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
+80 -15
View File
@@ -33,12 +33,34 @@ if (isset($_GET['country'])) {
$qTheme = preg_replace('/[^a-z0-9_-]/', '', strtolower($_GET['theme'] ?? ''));
$qModule = preg_replace('/[^a-z0-9_-]/', '', strtolower($_GET['module'] ?? ''));
// Alle Kompetenzen mit Zuordnungen + Ankern laden
$kompetenzen = $db->query('
SELECT id, key_slug, title, description, category, age_min, age_max, sort_order
FROM kompetenzen
ORDER BY sort_order, title
')->fetchAll();
// Wenn `?module=X` gesetzt: Metadaten des Moduls laden (fuer Banner + Titel)
$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
FROM kompetenzen
ORDER BY sort_order, title
')->fetchAll();
}
// Module je Kompetenz
$modStmt = $db->prepare('
@@ -107,8 +129,8 @@ $categoryMeta = [
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<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.">
<title><?= $moduleFocus ? 'Lehrplan-Bezug: ' . esc($moduleFocus['title']) : 'Lehrplan-Übersicht' ?> — Lehrplan geograsim.at</title>
<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/png" href="<?= $bp ?>/favicon-96x96.png" sizes="96x96">
<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-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 ===== */
.lp-hero {
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>
</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 -->
<section class="lp-hero">
<h1>Lehrplan-Übersicht</h1>
<h1><?= $moduleFocus ? 'Lehrplan-Bezug: ' . esc($moduleFocus['title']) : 'Lehrplan-Übersicht' ?></h1>
<p>
Alle GeoGraSim-Simulationen sind auf didaktische Kompetenzbereiche
abgebildet. Für jeden Bereich zeigen wir, wo er in den Lehrplänen
für Österreich, Deutschland, Schweiz und Liechtenstein verankert ist —
fachlich, fächerübergreifend und mit Anknüpfungspunkten in weiteren Fächern.
<?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
abgebildet. Für jeden Bereich zeigen wir, wo er in den Lehrplänen
für Österreich, Deutschland, Schweiz und Liechtenstein verankert ist —
fachlich, fächerübergreifend und mit Anknüpfungspunkten in weiteren Fächern.
<?php endif; ?>
</p>
<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"><?= $totalAnchors ?></span><span class="lp-hero-stat-lbl">Lehrplan-Anker</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 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>
</section>