upload v1

This commit is contained in:
2026-01-11 15:40:15 +00:00
parent 136a098425
commit 5d80bf4c40
57 changed files with 2430 additions and 0 deletions
+344
View File
@@ -0,0 +1,344 @@
<?php
// admin.php
declare(strict_types=1);
session_start();
require_once __DIR__ . '/functions.php';
$loggedIn = isset($_SESSION['admin']) && $_SESSION['admin'] === true;
// Login
if (isset($_POST['action']) && $_POST['action'] === 'login') {
if (($_POST['password'] ?? '') === ADMIN_PASSWORD_PLAIN) {
$_SESSION['admin'] = true;
header('Location: admin.php');
exit;
} else {
$error = 'Falsches Passwort.';
}
}
// Logout
if (isset($_GET['logout'])) {
$_SESSION = [];
session_destroy();
header('Location: admin.php');
exit;
}
if ($loggedIn) {
// CREATE/UPDATE
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_event'])) {
$events = load_events();
$id = $_POST['id'] ?: 'evt_' . bin2hex(random_bytes(6));
$title = sanitize_text($_POST['title'] ?? '');
$speaker = sanitize_text($_POST['speaker'] ?? '');
$date = sanitize_text($_POST['date'] ?? '');
$time = sanitize_text($_POST['time'] ?? '19:30');
$venue_name = sanitize_text($_POST['venue_name'] ?? '');
$venue_address = sanitize_text($_POST['venue_address'] ?? '');
$price = sanitize_text($_POST['price'] ?? '');
$doors_open = sanitize_text($_POST['doors_open'] ?? '');
$tickets_info = sanitize_text($_POST['tickets_info'] ?? '');
$catering = sanitize_text($_POST['catering'] ?? '');
$tags = sanitize_text($_POST['tags'] ?? '');
$description = trim($_POST['description'] ?? '');
$existing_image = sanitize_text($_POST['existing_image'] ?? '');
if ($title === '' || $date === '') {
$error = 'Titel und Datum sind Pflichtfelder.';
} else {
try {
$imagePath = $existing_image;
if (!empty($_FILES['image']['name'])) {
$imagePath = handle_image_upload($_FILES['image']);
}
$slug = make_slug($title, $date);
// Update falls vorhanden
$events = load_events();
$idx = null;
foreach ($events as $k => $ev) {
if ($ev['id'] === $id) { $idx = $k; break; }
}
$record = [
'id' => $id,
'title' => $title,
'speaker' => $speaker,
'date' => $date,
'time' => $time,
'venue_name' => $venue_name,
'venue_address' => $venue_address,
'price' => $price,
'doors_open' => $doors_open,
'tickets_info' => $tickets_info,
'catering' => $catering,
'tags' => $tags,
'description' => $description,
'image' => $imagePath,
'slug' => $slug,
'updated_at' => now_iso()
];
if ($idx !== null) {
$events[$idx] = $record;
} else {
$record['created_at'] = now_iso();
$events[] = $record;
}
save_events($events);
header('Location: admin.php?ok=1');
exit;
} catch (Throwable $e) {
$error = 'Fehler: ' . $e->getMessage();
}
}
}
// DELETE
if (isset($_GET['delete'])) {
$events = load_events();
$id = $_GET['delete'];
$events = array_values(array_filter($events, fn($e) => $e['id'] !== $id));
save_events($events);
header('Location: admin.php?deleted=1');
exit;
}
// EDIT load
$editEvent = null;
if (isset($_GET['edit'])) {
$id = $_GET['edit'];
foreach (load_events() as $e) {
if ($e['id'] === $id) { $editEvent = $e; break; }
}
}
}
?>
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Admin | <?= h(SITE_NAME) ?></title>
<meta name="robots" content="noindex,nofollow">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/styles.css">
<link rel="icon" href="/assets/logo.png" sizes="32x32" type="image/png">
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom sticky-top">
<div class="container">
<a class="navbar-brand brand-logo" href="index.html">
<img src="/assets/logo.png" alt="Walschleber KulTour Logo" height="34" width="34">
<span><?= h(SITE_NAME) ?></span>
</a>
<div class="ms-auto">
<?php if ($loggedIn): ?>
<a class="btn btn-outline-secondary btn-sm" href="admin.php?logout=1">Logout</a>
<?php endif; ?>
</div>
</div>
</nav>
<?php if (!$loggedIn): ?>
<header class="py-5 bg-light border-bottom">
<div class="container">
<div class="akzent-line mb-3"></div>
<h1 class="display-6 mb-2">Admin-Login</h1>
</div>
</header>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-md-6 col-lg-5">
<div class="p-4 border rounded-3 bg-white">
<?php if (!empty($error)): ?><div class="alert alert-danger"><?= h($error) ?></div><?php endif; ?>
<form method="post" autocomplete="off">
<input type="hidden" name="action" value="login">
<div class="mb-3">
<label class="form-label">Passwort</label>
<input type="password" class="form-control form-control-lg" name="password" required>
</div>
<button class="btn btn-brand btn-lg w-100">Einloggen</button>
</form>
</div>
</div>
</div>
</main>
<?php else: ?>
<header class="py-5 bg-light border-bottom">
<div class="container">
<div class="akzent-line mb-3"></div>
<h1 class="display-6 mb-2">Vorträge verwalten</h1>
<p class="text-muted mb-0">Anlegen, bearbeiten, Bilder hochladen.</p>
</div>
</header>
<main class="container my-4">
<div class="d-flex align-items-center gap-2 mb-3">
<?php if (isset($_GET['ok'])): ?><span class="badge text-bg-success">Gespeichert</span><?php endif; ?>
<?php if (isset($_GET['deleted'])): ?><span class="badge text-bg-warning">Gelöscht</span><?php endif; ?>
</div>
<div class="row g-4">
<div class="col-lg-5">
<div class="card shadow-sm">
<div class="card-body">
<h2 class="h5 mb-3"><?= $editEvent ? 'Vortrag bearbeiten' : 'Neuen Vortrag anlegen' ?></h2>
<?php if (!empty($error)): ?><div class="alert alert-danger"><?= h($error) ?></div><?php endif; ?>
<form method="post" enctype="multipart/form-data">
<input type="hidden" name="id" value="<?= h($editEvent['id'] ?? '') ?>">
<div class="mb-3">
<label class="form-label">Titel*</label>
<input type="text" class="form-control" name="title" required value="<?= h($editEvent['title'] ?? '') ?>">
</div>
<div class="mb-3">
<label class="form-label">Referent/Autor</label>
<input type="text" class="form-control" name="speaker" value="<?= h($editEvent['speaker'] ?? '') ?>">
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">Datum*</label>
<input type="date" class="form-control" name="date" required value="<?= h($editEvent['date'] ?? '') ?>">
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Uhrzeit</label>
<input type="time" class="form-control" name="time" value="<?= h($editEvent['time'] ?? '19:30') ?>">
</div>
</div>
<div class="mb-3">
<label class="form-label">Veranstaltungsort (Name)</label>
<input type="text" class="form-control" name="venue_name" value="<?= h($editEvent['venue_name'] ?? '') ?>">
</div>
<div class="mb-3">
<label class="form-label">Adresse (Straße, PLZ Ort)</label>
<input type="text" class="form-control" name="venue_address" value="<?= h($editEvent['venue_address'] ?? '') ?>">
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">Eintritt (z.B. 12 €)</label>
<input type="text" class="form-control" name="price" value="<?= h($editEvent['price'] ?? '') ?>">
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Einlass (z.B. 18:30)</label>
<input type="text" class="form-control" name="doors_open" value="<?= h($editEvent['doors_open'] ?? '') ?>">
</div>
</div>
<div class="mb-3">
<label class="form-label">Ticket/VVK-Info</label>
<input type="text" class="form-control" name="tickets_info" value="<?= h($editEvent['tickets_info'] ?? '') ?>">
</div>
<div class="mb-3">
<label class="form-label">Verpflegung/Service</label>
<input type="text" class="form-control" name="catering" value="<?= h($editEvent['catering'] ?? '') ?>">
</div>
<div class="mb-3">
<label class="form-label">Tags (Kommagetrennt)</label>
<input type="text" class="form-control" name="tags" value="<?= h($editEvent['tags'] ?? '') ?>">
</div>
<div class="mb-3">
<label class="form-label">Beschreibung</label>
<textarea class="form-control" name="description" rows="6"><?= h($editEvent['description'] ?? '') ?></textarea>
</div>
<?php if (!empty($editEvent['image'])): ?>
<div class="mb-2">
<img src="<?= h($editEvent['image']) ?>" alt="aktuelles Bild" class="img-fluid rounded">
</div>
<input type="hidden" name="existing_image" value="<?= h($editEvent['image']) ?>">
<?php endif; ?>
<div class="mb-3">
<label class="form-label">Bild (JPG/PNG/WEBP)</label>
<input type="file" class="form-control" name="image" accept=".jpg,.jpeg,.png,.webp">
</div>
<button class="btn btn-brand" name="save_event" value="1">Speichern</button>
<?php if ($editEvent): ?>
<a href="admin.php" class="btn btn-outline-secondary ms-2">Abbrechen</a>
<?php endif; ?>
</form>
</div>
</div>
</div>
<div class="col-lg-7">
<div class="card shadow-sm">
<div class="card-body">
<h2 class="h5 mb-3">Alle Vorträge</h2>
<?php
$events = load_events();
usort($events, 'by_datetime_desc');
?>
<?php if (!$events): ?>
<p class="text-muted">Noch keine Einträge.</p>
<?php else: ?>
<div class="table-responsive">
<table class="table align-middle">
<thead>
<tr>
<th>Datum</th>
<th>Titel</th>
<th>Ort</th>
<th class="text-end"></th>
</tr>
</thead>
<tbody>
<?php foreach ($events as $e): ?>
<tr>
<td><?= h($e['date']) ?> <?= h($e['time']) ?></td>
<td>
<div class="fw-semibold"><?= h($e['title']) ?></div>
<div class="text-muted small"><?= h($e['speaker']) ?></div>
</td>
<td><?= h($e['venue_name']) ?></td>
<td class="text-end">
<a class="btn btn-sm btn-outline-primary" href="admin.php?edit=<?= h($e['id']) ?>">Bearbeiten</a>
<a class="btn btn-sm btn-outline-danger" href="admin.php?delete=<?= h($e['id']) ?>" onclick="return confirm('Wirklich löschen?')">Löschen</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
</div>
</div>
<section class="my-4">
<div class="cta-band p-4 d-md-flex justify-content-between align-items-center rounded-4">
<div class="mb-3 mb-md-0">
<p class="section-kicker mb-1">Tipp</p>
<div class="h6 mb-0">Wenn „Ticket/VVK-Info“ eine URL enthält, zeigt die Programmseite automatisch den Button <em>„Tickets sichern“</em>.</div>
</div>
<a class="btn btn-accent" href="programm.php" target="_blank" rel="noopener">Programm ansehen</a>
</div>
</section>
</div>
</div>
</main>
<?php endif; ?>
<footer class="py-4 border-top mt-5">
<div class="container small d-flex gap-3 flex-wrap">
<span>&copy; <?= date('Y') ?> <?= h(SITE_NAME) ?></span>
<a href="impressum.html">Impressum</a>
<a href="datenschutz.html">Datenschutz</a>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

+205
View File
@@ -0,0 +1,205 @@
/* assets/styles.css — KulTour Conversion Theme */
/* ===== Farbwelt (Logo-Blau + Akzent-Gelb) ===== */
:root{
--brand:#1789ca;
--brand-700:#116da3;
--accent:#f3c546;
--accent-700:#e0b233;
--ink:#0e2230;
--muted:#6b7b88;
--bg:#ffffff;
--soft:#f6f8fb;
--soft-2:#eef5fb;
}
/* ===== Basis ===== */
html{scroll-behavior:smooth}
body{color:var(--ink); background:var(--bg)}
a{color:var(--brand)}
a:hover{color:var(--brand-700)}
.navbar{backdrop-filter:saturate(120%) blur(6px)}
.navbar .nav-link{font-weight:500}
.navbar .nav-link.active{color:var(--brand)!important}
.brand-logo{display:flex;align-items:center;gap:.5rem;font-weight:800;}
.brand-logo img{height:34px;width:auto}
/* zarte farbige Top-Border unter Navbar */
.navbar.border-bottom{box-shadow:0 2px 0 0 rgba(23,137,202,.15)}
/* ===== Hero (Foto + Farbe) ===== */
.hero{
position:relative; min-height:68vh; display:flex; align-items:center;
color:#fff; background-size:cover; background-position:center; background-repeat:no-repeat;
}
.hero::before{
content:""; position:absolute; inset:0;
background:
linear-gradient( to bottom right, rgba(23,137,202,.65), rgba(243,197,70,.45) ),
linear-gradient( to bottom, rgba(0,0,0,.25), rgba(0,0,0,.55) );
}
.hero .container{position:relative; z-index:2}
.hero h1{font-weight:850; line-height:1.04; letter-spacing:.2px; text-shadow:0 2px 16px rgba(0,0,0,.25)}
.hero .lead{font-size:1.18rem}
/* ===== Buttons ===== */
.btn-brand{
--bs-btn-bg:var(--brand); --bs-btn-border-color:var(--brand);
--bs-btn-hover-bg:var(--brand-700); --bs-btn-hover-border-color:var(--brand-700);
--bs-btn-color:#fff;
}
.btn-accent{
--bs-btn-bg:var(--accent); --bs-btn-border-color:var(--accent);
--bs-btn-hover-bg:var(--accent-700); --bs-btn-hover-border-color:var(--accent-700);
--bs-btn-color:#1a1a1a; font-weight:700;
}
.btn-outline-brand{
--bs-btn-color:#fff; --bs-btn-border-color:rgba(255,255,255,.7);
--bs-btn-hover-color:#fff; --bs-btn-hover-bg:rgba(255,255,255,.12);
--bs-btn-hover-border-color:#fff;
}
/* ===== Sektionen & Akzente ===== */
.section-soft{background:var(--soft)}
.section-soft-2{background:var(--soft-2)}
.section-title{font-weight:800}
.section-kicker{color:var(--brand); font-weight:700; letter-spacing:.08em; text-transform:uppercase}
/* schmale Akzentlinie */
.akzent-line{height:4px; width:64px; background:linear-gradient(90deg,var(--accent),var(--brand)); border-radius:8px}
/* ===== Karten (Events) ===== */
.card{
border:1px solid #e9edf3; border-radius:1rem; transition:transform .2s ease, box-shadow .2s ease;
background:linear-gradient(180deg,#fff, #fff), radial-gradient(1200px 300px at 0% -10%, rgba(23,137,202,.06), transparent 60%);
background-clip:padding-box, border-box;
}
.card:hover{transform:translateY(-2px); box-shadow:0 12px 34px rgba(0,0,0,.08)}
.card .top-ribbon{
position:absolute; top:12px; left:12px; background:var(--brand); color:#fff; font-weight:700;
padding:.28rem .55rem; border-radius:.5rem; font-size:.8rem; box-shadow:0 6px 14px rgba(23,137,202,.25);
}
.card-img-top{object-fit:cover; max-height:230px; border-top-left-radius:1rem; border-top-right-radius:1rem}
/* Badges */
.badge.text-bg-primary{background-color:var(--brand)!important}
.badge-accent{background:var(--accent); color:#1a1a1a; font-weight:700}
/* ===== CTA-Band ===== */
.cta-band{
background:
radial-gradient(1000px 300px at 0% 0%, rgba(23,137,202,.12), transparent 60%),
linear-gradient(90deg, rgba(23,137,202,.08), rgba(243,197,70,.14));
border:1px solid rgba(23,137,202,.18); border-radius:1.25rem;
}
/* ===== Feature-Icons ===== */
.feature{
display:flex; gap:.9rem; align-items:flex-start;
padding:1rem 1.1rem; border-radius:.9rem; background:#fff; border:1px solid #e9edf3;
}
.feature .icon{
width:42px; height:42px; display:grid; place-items:center; border-radius:.7rem;
background:linear-gradient(135deg, var(--brand), var(--accent));
color:#fff; font-size:1.2rem; box-shadow:0 10px 20px rgba(23,137,202,.25);
}
/* ===== Partnerband ===== */
.partner-band{
display:flex; gap:1.5rem; align-items:center; flex-wrap:wrap; opacity:.9
}
.partner-band img{height:34px; filter:grayscale(40%); transition:filter .2s}
.partner-band img:hover{filter:none}
/* ===== Footer ===== */
footer{background:#fff}
footer a{text-decoration:none}
footer .separator{opacity:.25}
/* Container: keine fixe Höhe mehr, nur Polster */
.coop-logo{
display:inline-flex; align-items:center; justify-content:center;
padding:.35rem .55rem; border-radius:.75rem;
transition:transform .15s ease, filter .15s ease, box-shadow .15s ease;
filter:grayscale(40%) contrast(1.05) brightness(1.02) opacity(.9);
background:#fff; border:1px solid #e9edf3;
line-height:0; /* verhindert vertikale Zentrier-Zitterei */
}
/* Bild: nur max-height begrenzen, Breite automatisch -> keine Verzerrung */
.coop-logo img{
display:block;
max-height:40px; /* einheitliche optische Höhe */
height:auto; /* Ratio bleibt erhalten */
width:auto; /* Ratio bleibt erhalten */
}
.coop-logo:hover{
filter:none; transform:translateY(-1px);
box-shadow:0 10px 24px rgba(23,137,202,.15);
}
/* ===== Modals: Mobile korrekt einpassen ===== */
.modal-content{ max-height: 100vh; }
/* Standard: auf Desktop/Tablets */
.modal-img {
width: auto;
max-width: 100%;
height: auto;
max-height: 90vh; /* nie höher als Viewport */
object-fit: contain;
display: block;
margin: 0 auto;
}
.modal-body{
overflow: auto; /* falls Text länger ist */
}
/* Phones: Header (~56px) + Footer-Reserve (~56px) + Innenabstand (~16px*2) abziehen */
@media (max-width: 576px) {
.modal-body {
max-height: 75vh;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
}
/* Beschreibung auf Karten & im Modal */
.poster-desc{
text-align: center;
margin: .75rem auto 0;
color:#344654;
max-width: 46ch;
line-height: 1.45;
}
/* Abstände zwischen erlaubten HTML-Elementen harmonisieren */
.poster-desc p{ margin: .5rem 0; }
.poster-desc ul, .poster-desc ol{
display: inline-block; /* zentriert wirken lassen */
text-align: left; /* Lesbarkeit bei Listen */
margin: .5rem auto; padding-left: 1.2rem;
}
.poster-desc li{ margin: .15rem 0; }
/* Karten-Beschreibung visuell kürzen, ohne HTML zu zerstören */
.poster-desc{
display: -webkit-box;
-webkit-line-clamp: 6; /* Anzahl Zeilen auf Karten */
-webkit-box-orient: vertical;
overflow: hidden;
}
/* Im Modal die Klammerung aufheben volle Beschreibung */
.modal .poster-desc{
display: block;
-webkit-line-clamp: initial;
-webkit-box-orient: initial;
overflow: visible;
max-width: 60ch; /* im Modal etwas breiter, aber zentriert */
margin: 0 auto 0;
}
.poster-desc h3, .poster-desc h4, .poster-desc h5{
text-align:center; margin:.6rem 0 .35rem; line-height:1.25;
}
+20
View File
@@ -0,0 +1,20 @@
<?php
// config.php
declare(strict_types=1);
date_default_timezone_set('Europe/Berlin');
// === Grundkonfiguration ===
const SITE_NAME = 'Walschleber KulTour';
const BASE_URL = 'https://walschleber-kultour.com'; // <-- anpassen, falls abweichend
const CONTACT_EMAIL = 'walschleber.kultour@gmail.com';
// Statisches Admin-Passwort (bitte ändern!)
const ADMIN_PASSWORD_PLAIN = 'YH&Vk2TOn%%5R196bMgU*EWpdk2Bc08Z';
// Pfade
const DATA_FILE = __DIR__ . '/data/talks.json';
const UPLOAD_DIR = __DIR__ . '/uploads';
// SEO Defaults
const DEFAULT_OG_IMAGE = '/assets/og-default.jpg'; // optional, falls vorhanden
+542
View File
@@ -0,0 +1,542 @@
{
"events": [
{
"id": "evt_159f6f776108",
"title": "Wort trifft Note",
"speaker": "Enrico Fischer",
"date": "2025-08-08",
"time": "19:30",
"venue_name": "Blumenhof Kerst",
"venue_address": "Erfurter Straße 29b, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Bratwurst & Steak, Getränke mit und ohne Alkohol",
"tags": "Buchlesung mit musikalischer Begleitung, Openair",
"description": "Die Walschleber KulTour zu Gast im Blumenhof Kerst in Walschleben. Es erwartet Sie, im gemütlichen Ambiente, eine spannende Buchlesung mit dem Walschleber Buchautor Enrico Fischer, musikalisch begleitet von den Gitarristen Just und Jens.\r\n\r\nDer Geschäftsmann Maximilian Drechsler kommt in Mombasa mit der mysteriösen Gesellschafft SALUS in Kontakt, die eine ungewöhnliche Form von Entwicklungshilfe praktiziert. Das mit großem Aufwand betriebe Engagement mitten im afrikanischen Busch, aber auch die offenbar grenzenlos bereitstehenden Mittel faszinieren Ihn zunächst. Wieder zurück in Deutschland bemüht er sich mehr über SALUS zu erfahren. Doch es bleiben Fragen offen. Erst nachdem er selbst Mitarbeiter in diesem Projekt geworden ist, erfährt er die ganze Wahrheit über das Vorgehen der Gesellschaft. Damit beginnt eine persönliche Zerreißprobe. Argwöhnisch von der Manager-Etage beobachtet, ringt Maximilian mit Hilfe alter und neuer Freunde um die richtige Entscheidung.\r\n\r\nEine mitreißende Geschichte, begleitet von Livemusik. Sind Sie neugierig geworden? Dann sichern Sie sich gleich Ihre Karte. Diese bekommen Sie ab sofort im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse.\r\n\r\nUm das leibliche Wohl am Veranstaltungsabend kümmert sich Jens von der Gaststätte Sportzentrum Walschleben. Einlass ist ab 19:00 Uhr. Wir freuen uns auf einen schönen, musikalischen und vor allem spannenden Sommerabend und freuen uns auf Ihren Besuch.\r\n\r\nIhr Team der Walschleber KulTour.",
"image": "/uploads/event_20250823_163636_d219cdf4.png",
"slug": "wort-trifft-note-2025-08-08",
"updated_at": "2025-08-23T17:30:11+02:00"
},
{
"id": "evt_5d455373248a",
"title": "Jetzt mal was anderes, Schatz!",
"speaker": "Katrin Kremzow",
"date": "2025-09-24",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "9,50€",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Buchlesung",
"description": "„Jetzt mal was anderes, Schatz!“\r\nEine Buchlesung mit Katrin Kremzow\r\nMittwoch, 24.09.2025 / 19.30 Uhr \r\nLindenhof Walschleben\r\n\r\nAllen erscheinen Rosa und Stefan als glückliches Paar: Haus mit Garten-Paradies, gute Jobs, zwei erwachsene Kinder, die ihren Weg gehen … Doch manchmal ertappt sich Rosa bei dem Gedanken: Lebe ich etwa schon mit meinem zukünftigen Ex-Mann zusammen? Denn es fehlt ihr an Nähe, auch im Schlafzimmer. Freundin Bibi schlaumeiert: »Wenn es im Bett stimmt, kommt der Rest hinterher.« Wie bitte? Sehen das andere Frauen auch so? Wird Sex mit Liebe verwechselt oder umgekehrt? Und warum ist das Ganze so ein Tabu-Thema? Rosa startet eine heilsame Entdeckungsreise. Der Gedanke, mit dem eigenen Mann das Liebesleben aufzufrischen, bringt sie auf überraschende Ideen, die ihre Ehe retten könnten.\r\n\r\nZur Autorin:\r\n\r\nKatrin Kremzow, geboren 1963 in Erfurt, hat ein großes Herzensthema. Sie möchte hinter die Geheimnisse von glücklichen Beziehungen zwischen Mann und Frau kommen und sie spart dabei nichts aus, auch nicht den Sex. Geheiratet hat sie mit dreiundzwanzig Jahren und mit ihrem Mann die Zeiten von „himmelhochjauchzend“ genauso erlebt, wie die von „zu Tode betrübt“.\r\n\r\nAls sich ihr nach dreißig Jahren Ehe die Frage stellte „Soll das jetzt alles gewesen sein?“ war ihre Antwort: „Nein, da geht noch was, da muss noch was Schönes auf mich warten“. In ihrem autofiktionalen Roman „Jetzt mal was anderes, Schatz!“\r\nbeschreibt sie herzerfrischend ehrlich, humorvoll und konfrontierend, aber auch mit viel Gefühl ihre Entdeckungsreise vom Verlieren und Wiederfinden der Liebe.\r\n\r\nDer Roman erschien im März 2024 im Rellin Verlag, feierte gleich darauf auf der Leipziger Buchmesse seine erfolgreiche Premiere und bei ihren zahlreichen Lesungen in und um Erfurt, in Ilmenau, Friedrichroda und Flachau in Österreich begeisterte Katrin Kremzow das Publikum.\r\n\r\nNa, sind Sie neugierig geworden, dann lauschen Sie Katrin Kremzows Erzählungen auf dem Saal im Lindenhof Walschleben. Einlass ist ab 19.00 Uhr. Für das leibliche Wohl ist am Veranstaltungsabend gesorgt und ein Gläschen Sekt ist im Eintrittspreis enthalten.\r\n\r\nKarten bekommen Sie im Vorverkauf für 9,50 Euro im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse.\r\n\r\nWir freuen uns auf Ihren Besuch,\r\nIhr Team der Walschleber KulTour.",
"image": "/uploads/event_20250823_165136_e33e0cd1.jpg",
"slug": "jetzt-mal-was-anderes-schatz-2025-09-24",
"updated_at": "2025-08-23T17:04:40+02:00"
},
{
"id": "evt_cf6ac35a53ef",
"title": "Von Marokko bis Norwegen",
"speaker": "Marlies & Andi Lattner-Czerny",
"date": "2025-11-26",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "Marlies & Andi Lattner-Czerny\r\nVON MAROKKO BIS NORWEGEN\r\nVANLIFE UND TRAUMBERGE\r\n26.11.2025 / 19.30Uhr / Lindenhof Walschleben \r\n\r\nMit Mut fangen die schönsten Geschichten an. …\r\n\r\noder mit Verzweiflung. Sie überkam Marlies und Andi aus heiterem Himmel, als sie erfuhren, dass sie aus ihrer Wohnung ausziehen müssen. Zwei Minuten später trifft die beiden ein Geistesblitz: Sie suchen sich jetzt keine neuen vier Wände, sondern vier Räder! Wohnraum verloren? Freiraum gewonnen!\r\n\r\nFünf Jahre lang leben sie Vollzeit on the road und dieses simple und reduzierte Leben spielt sich vor allem draußen im Einklang mit der Natur ab: Am Berg mit dem Gleitschirm oder dem Mountainbike, beim Klettern, auf Tourenski und sie halten sich mit einem Packraft (und ihrem nicht alltäglichen Job) über Wasser.\r\n\r\nIhr Abenteuergeist hat sie von einem kleinen Dorf in Oberösterreich bis Marokko und Norwegen geführt, ins Land der Mitternachtssonne und zu Märchen aus 1001 Nacht.\r\n\r\nDie beiden nehmen die Besucher mit auf einen ebenso bildgewaltigen wie witzigen Roadtrip, der beweist: Man kann nicht immer alles planen, doch wer seinem Herzen folgt, wird belohnt!\r\n\r\nSo konnten Marlies und Andi in Norwegen nicht nur auf den vielleicht schönsten Berg der Welt klettern, sondern mit dem Gleitschirm direkt vom Gipfel in das goldene Licht der Mitternachtssonne schweben.\r\n\r\nIhr Kilometerstand? Den dürft ihr selbst erraten! Kleiner Tipp: Anstatt nur der Sonne hinterher zu fahren, tauchen die freie Alpin-Journalistin und der Fotograf lieber tiefer ein in Orte und Landschaften und entdecken dabei, wie wenig es für ein erfüllendes Leben wirklich braucht. Und wie man es schafft, auf sechs mal zwei Meter zu arbeiten und zu wohnen.\r\n\r\nDas Ende der Geschichte kommt übrigens ebenso überraschend wie sie begonnen hat - kaum zu glauben!\r\n\r\nErleben Marlies und Andi live auf dem Saal im Lindenhof Walschleben. Einlass ist ab 19.00 Uhr. Für das leibliche Wohl ist am Veranstaltungsabend gesorgt.\r\n\r\nKarten bekommen Sie ab dem 1.10 im Vorverkauf im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse.\r\n\r\nDie Veranstaltung findet mit freundlicher Unterstützung der Sparkasse Mittelthüringen im Rahmen der Kreiskulturwochen des Landkreises Sömmerda statt.\r\n\r\nWir freuen uns auf Ihren Besuch,\r\n\r\nIhr Team der Walschleber KulTour.",
"image": "/uploads/event_20250915_184036_684c6c66.jpg",
"slug": "von-marokko-bis-norwegen-2025-11-26",
"updated_at": "2025-09-17T16:46:34+02:00"
},
{
"id": "evt_2b9101ebd345",
"title": "Nordwärts",
"speaker": "Sandra Butscheike & Steffen Mender",
"date": "2025-12-04",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "Sandra Butscheike & Steffen Mender\r\nNordwärts Vom Standesamt zum Nordkap\r\n 04.12.2025 / 19.30 Uhr/ Lindenhof Walschleben \r\n\r\nIn ihrer Live-Reportage „Nordwärts“ berichten Sandra Butscheike und Steffen Mender über ihre spannende und unvergessliche Radreise von Thüringen zum Nordkap und zurück.\r\n\r\nNach 22 Jahren wilder Ehe haben die Beiden im Mai 2022 geheiratet auf Fahrrädern! Nur 4 Tage nach ihrer Hochzeit haben sie sich auf genau diese Fahrräder geschwungen, um von ihrer Heimatstadt Waltershausen zum Nordkap und zurückzuradeln.\r\n\r\nWährend dieser 4monatigen Tour radelte das Ehepaar mit reiner Muskelkraft und über 60kg Gepäck 6.700 Kilometer durch Deutschland, Dänemark, Schweden, Finnland und Norwegen. \r\nIhre Tour führte die Beiden entlang von Gebirgen, spektakulären Küsten, Wiesen und Feldern, über weiße Sandstrände, durch Dünen, Wälder und wunderschöne Städte.\r\nDabei konnten die Fotografen und Filmemacher grandiose Landschaften, Sonnenauf- und -untergänge und den Sternenhimmel bestaunen. Intensive Gerüche von Wäldern, Heu, Erdbeerfeldern, Regen, Meerwasser und frischer Erde sind abwechselnd durch ihre Nasen geströmt. \r\nDie Beiden konnten Wildtiere aus nächster Nähe beobachten und hatten unterwegs viele interessante und herzliche Begegnungen. \r\nHäufig mussten die Globetrotter aber auch gegen extremen Gegenwind, Kälte, Nässe, Trilliarden von Mücken und steile Anstiege kämpfen.\r\nEs war unterwegs also nicht immer alles rosarot, aber genau das macht solch eine Reise aus.\r\n\r\nVon Thüringen ging es zunächst Richtung Hamburg und über den Nordseeküstenradweg bis zum nördlichsten Punkt Dänemarks. Die nächste große Etappe führte die Beiden einmal quer durch Schweden und über die Ålandinseln Richtung finnische Ostseeküste. Von hier strampelte das Duo über den Polarkreis und durch die einsamen Landschaften Lapplands bis hinauf zum Nordkap. \r\nVom Ziel ihre Träume ging es mit dem Postschiff auf die Lofoten und über Bodø und Trondheim weiter bis nach Oslo. Entlang der dänischen Ostseeküste und durch Seen- und Flusslandschaften entlang von Müritz, Elbe und Saale radelte das Paar letztendlich zurück in ihre Heimatstadt in Thüringen. \r\n\r\nNach ihrer Rückkehr war die Reisekasse der Beiden leer, aber Köpfe und Herzen voll mit unendlich vielen Erlebnissen, Begegnungen und unvergesslichen Momenten.\r\n\r\n \r\nMit unterhaltsamen Anekdoten, beeindruckenden Bildern, Videos und Drohnenaufnahmen \r\nnehmen die Fotojournalisten ihre Zuschauer mit auf eine spektakuläre Reise durch den hohen Norden. Zudem gibt es wie immer wertvolle Reisetipps und Inspirationen für eigene Touren durch Deutschland und Skandinavien.\r\n\r\nErleben Sie Sandra Butscheike und Steffen Mender live auf dem Saal im Lindenhof Walschleben. Einlass ist ab 19.00 Uhr. Für das leibliche Wohl ist am Veranstaltungsabend gesorgt.\r\n\r\nKarten bekommen Sie ab dem 15. September im Vorverkauf im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse.\r\n\r\nDie Veranstaltung findet mit freundlicher Unterstützung der Sparkasse Mittelthüringen im Rahmen der Kreiskulturwochen des Landkreises Sömmerda statt.\r\n\r\nWir freuen uns auf Ihren Besuch,\r\n\r\nIhr Team der Walschleber KulTour.",
"image": "/uploads/event_20250915_184120_fdb0b6c5.jpg",
"slug": "nordwrts-2025-12-04",
"updated_at": "2025-09-15T18:41:20+02:00"
},
{
"id": "evt_fe405f325f29",
"title": "Sri Lanka",
"speaker": "Barbara Vetter",
"date": "2025-03-07",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "Die Familie ist begeistert: Was für eine reichhaltige Kultur Sri Lanka doch zu bieten hat!\r\n\r\nImmerhin leben auf der tropischen Insel im Indischen Ozean verschiedenste Kulturen\r\n\r\nund Religionen zusammen. Buddhas Backenzahn wird hier aufbewahrt und tagelange\r\n\r\nFeste ziehen Inselbewohner und Touristen an. Dazu kommt eine wilde Bergwelt, üppig\r\n\r\ngrüne Regenwälder, endlose weiße Strände! Und: Nirgends sonst leben so viele wilde\r\n\r\nElefanten in direkter Nachbarschaft zum Menschen wie hier. Eigentlich ein Traum!\r\n\r\nWas liegt da für Barbara Vetter und Vincent Heiland, die schon mit Kindern und Kamelen\r\n\r\ndurch die Mongolei wanderten, näher, als mit einem Elefanten das Inselreich zu erkun-\r\n\r\nden. Doch Wunsch und Wirklichkeit gehen weit auseinander. Nicht nur das Reisen mit\r\n\r\nElefant ist schwieriger als gedacht, auch privat ist plötzlich alles anders. Eine echte Her-\r\n\r\nausforderung für das Projekt! Dabei hat Barbara Vetter längst die Insel ins Herz geschlos-\r\n\r\nsen und so wird ein knallrotes TukTuk zum Gefährten, welches sie zu mehr als einem\r\n\r\nAbenteuer bringt.\r\n\r\n\r\n\r\nMit Engagement und Liebe zum Unterwegssein begleitet sie beispielsweise den Elefan-\r\n\r\ntenflüsterer Sumanabanda, als er einen gefährlichen Elefantenbullen auf ein buddhisti-\r\n\r\nsches Fest vorbereitet.\r\n\r\n\r\n\r\nSie lernt den Künstler Preshad kennen, der sie zu den Ureinwoh-\r\n\r\nnern des Landes führt oder den jungen Francis, der voller Enthusiasmus ein Schulprojekt\r\n\r\naufbaut, um die im jahrelangen Bürgerkrieg zerstörten Brücken zwischen den Kulturen\r\n\r\nwiederaufzubauen. Sie trifft auf Menschen mit tiefen seelischen Wunden, auf engagierte\r\n\r\nHelfer und Glücksritter und erlebt dabei immer einen unglaublichen Optimus sowie eine\r\n\r\ngewaltige Lust auf das Leben.\r\n\r\n\r\n\r\nDie neue Multivision der Reisejournalistin Barbara Vetter zeichnet ein ganz persönliches\r\n\r\nBild vom Land, seinen Menschen und Elefanten und nicht zuletzt von ihr selbst.\r\n\r\n\r\n\r\n\r\nErleben Sie Barbara Vetter live auf dem Saal im Lindenhof Walschleben.\r\n\r\n \r\n\r\nEinlass ist ab 19.00 Uhr und für das leibliche Wohl ist natürlich gesorgt.\r\n\r\n \r\n\r\nKarten bekommen Sie im Vorverkauf ab Anfang Dezember im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse.\r\n\r\nWir freuen uns auf Ihren Besuch,\r\nIhr Team der Walschleber Kultour.",
"image": "/uploads/event_20250823_170918_09cf85f1.webp",
"slug": "sri-lanka-2025-03-07",
"updated_at": "2025-08-23T17:09:18+02:00",
"created_at": "2025-08-23T17:09:18+02:00"
},
{
"id": "evt_8db383dd6826",
"title": "DIE WEISHEIT DER MAYA",
"speaker": "Martin Engelmann",
"date": "2025-02-14",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "Seit 10 Jahren bereist National Geographic Fotograf Martin Engelmann Mexiko, Guatemala und Belize. Dort begibt er sich auf die Spuren der letzten Maya.\r\n\r\nTief im Regenwald, an einem Ort, an dem der Begriff „Zeit“ nicht existiert, leben die letzten Nachkommen der Maya die Lakandonen. Viele Jahrhunderte konnten sie unberührt ihre traditionelle Lebensweise bewahren. Martin Engelmann betritt einen Kosmos voller uralter Mythen und rätselhafter Rituale und geht dem alten Wissen der Maya auf die Spur. \r\n\r\nEr trifft auf ihren letzten Schamanen und darf am Leben und Alltag der letzten Nachkommen der Maya teilhaben. \r\n\r\nJahr für Jahr kehrt er wieder, um das Leben der Maya fotografisch festzuhalten. \r\n\r\nDenn ihre Welt ist im Wandel, in beängstigender Geschwindigkeit hält die Moderne Einzug in das einstige Paradies. \r\n\r\nAuf abenteuerlichen Routen begibt sich der Fotograf auf die Spurensuche quer durch Mittelamerika. \r\n\r\nIm Jahr 2012 vollendete der Mayakalender nach 5.200 Jahren seinen Zyklus. \r\n\r\nMartin Engelmann reist wenige Wochen vor dem Enddatum nach Mittelamerika, um auch der Bedeutung des Kalenderendes für die Maya auf den Grund zu gehen und schließlich bei den Feierlichkeiten und Zeremonien der Schamanen in den jahrtausendealten Tempeln von Tikal mit dabei zu sein. \r\n\r\nIn den Folgejahren besucht er die mystischen Höhlen von Actun Tunichil Muknal, einen der heiligsten Orte der alten Mayawelt und erkundet sagenumwobene Kultstätten längst vergessener Tage. \r\n\r\nAuf dem Weg in das Hochland von Guatemala begegnet der den Nachkommen der Maya am Atitlan See und dokumentiert die Spuren der Christianisierung. \r\n\r\nSchließlich besteigt Martin Engelmann die fast 4.000 Meter hohen Vulkane und fotografiert den Ausbruch des aktiven Vulkans Fuego aus nächster Nähe. \r\n\r\nDieser Vortrag ist eine Liebeserklärung die Menschen und ihre faszinierende Kultur, von den immergrünen Regenwäldern und Traumstränden Mexikos bis in das Vulkanland von Guatemala. In beeindruckenden Bildern erzählt Martin Engelmann die Geschichte eines Volkes, das es schon sehr bald nicht mehr geben wird. \r\n\r\nErleben Sie Martin Engelmann live auf dem Saal im Lindenhof Walschleben.\r\n\r\nEinlass ist ab 19.00 Uhr und für das leibliche Wohl ist natürlich gesorgt.\r\n\r\nKarten bekommen Sie im Vorverkauf ab Anfang Dezember im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse.\r\n\r\nWir freuen uns auf Ihren Besuch,\r\nIhr Team der Walschleber Kultour.",
"image": "/uploads/event_20250823_171051_f24a525e.webp",
"slug": "die-weisheit-der-maya-2025-02-14",
"updated_at": "2025-08-23T17:10:51+02:00",
"created_at": "2025-08-23T17:10:51+02:00"
},
{
"id": "evt_05ec848c2e11",
"title": "Die große Tour durch die Pyrenäen",
"speaker": "Ralf Schwan",
"date": "2025-01-24",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_171146_4ed983a2.webp",
"slug": "die-groe-tour-durch-die-pyrenen-2025-01-24",
"updated_at": "2025-08-23T17:11:46+02:00",
"created_at": "2025-08-23T17:11:46+02:00"
},
{
"id": "evt_2397894d96f3",
"title": "Luigi muss nach Hause!",
"speaker": "Gereon Roemer & Martin Buschmann",
"date": "2024-11-01",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_171232_bcaa6aec.jpg",
"slug": "luigi-muss-nach-hause-2024-11-01",
"updated_at": "2025-08-23T17:14:15+02:00"
},
{
"id": "evt_52936e3affa0",
"title": "Länder Menschen Abenteuer",
"speaker": "Stefan Spangenberg",
"date": "2024-10-16",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_171452_1ae353ef.jpg",
"slug": "lnder-menschen-abenteuer-2024-10-16",
"updated_at": "2025-08-23T17:14:52+02:00",
"created_at": "2025-08-23T17:14:52+02:00"
},
{
"id": "evt_ea3465ea2b55",
"title": "Südtirol Dolomiten",
"speaker": "Hartmut Krinitz",
"date": "2024-02-28",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_171543_a8ce7002.jpg",
"slug": "sdtirol-dolomiten-2024-02-28",
"updated_at": "2025-08-23T17:15:43+02:00",
"created_at": "2025-08-23T17:15:43+02:00"
},
{
"id": "evt_21cc4b2573a5",
"title": "Nepal 8163m",
"speaker": "Marlies Czerny & Andreas Lattener",
"date": "2023-11-22",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_171628_84e4f3b2.jpg",
"slug": "nepal-8163m-2023-11-22",
"updated_at": "2025-08-23T17:16:28+02:00",
"created_at": "2025-08-23T17:16:28+02:00"
},
{
"id": "evt_08b4be1df425",
"title": "Europas hoher Norden",
"speaker": "Petra und Gerhard Zwerger-Schoner",
"date": "2023-03-24",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_171708_ce153af4.jpg",
"slug": "europas-hoher-norden-2023-03-24",
"updated_at": "2025-08-23T17:17:08+02:00",
"created_at": "2025-08-23T17:17:08+02:00"
},
{
"id": "evt_232cf2ffc4e3",
"title": "Sizilien Insel im Licht",
"speaker": "Martin Engelmann",
"date": "2023-11-03",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_171742_5f78ac32.jpg",
"slug": "sizilien-insel-im-licht-2023-11-03",
"updated_at": "2025-08-23T17:17:42+02:00",
"created_at": "2025-08-23T17:17:42+02:00"
},
{
"id": "evt_e963a0dc38e5",
"title": "Irland bis ans Ende der Welt",
"speaker": "Hartmut Krinitz",
"date": "2023-03-10",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_171818_6026328d.jpg",
"slug": "irland-bis-ans-ende-der-welt-2023-03-10",
"updated_at": "2025-08-23T17:18:18+02:00",
"created_at": "2025-08-23T17:18:18+02:00"
},
{
"id": "evt_002b2ae8ff92",
"title": "Bergsommer",
"speaker": "Katharina Afflerbach",
"date": "2023-01-27",
"time": "20:00",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "15€",
"doors_open": "19:30",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Buchlesung",
"description": "",
"image": "/uploads/event_20250823_171927_0be17110.jpg",
"slug": "bergsommer-2023-01-27",
"updated_at": "2025-08-23T17:19:27+02:00",
"created_at": "2025-08-23T17:19:27+02:00"
},
{
"id": "evt_570f1d352cc8",
"title": "Dieter Baumann läuft halt",
"speaker": "Dieter Baumann",
"date": "2022-09-09",
"time": "20:00",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "15",
"doors_open": "19:30",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Vortrag",
"description": "",
"image": "/uploads/event_20250823_172055_c4ccc353.jpg",
"slug": "dieter-baumann-luft-halt-2022-09-09",
"updated_at": "2025-08-23T17:20:55+02:00",
"created_at": "2025-08-23T17:20:55+02:00"
},
{
"id": "evt_d50b082c11bf",
"title": "Tief im Osten",
"speaker": "Ute und Jürgen Münzel",
"date": "2022-08-08",
"time": "19:00",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "18:30",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_172139_c634afea.jpg",
"slug": "tief-im-osten-2022-08-08",
"updated_at": "2025-08-23T17:21:39+02:00",
"created_at": "2025-08-23T17:21:39+02:00"
},
{
"id": "evt_4f072adfc7e4",
"title": "4000ERLEBEN",
"speaker": "Marlies Czerny",
"date": "2022-03-11",
"time": "20:00",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:30",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_172213_b2add0d8.jpg",
"slug": "4000erleben-2022-03-11",
"updated_at": "2025-08-23T17:22:13+02:00",
"created_at": "2025-08-23T17:22:13+02:00"
},
{
"id": "evt_3e0a75661b8b",
"title": "Als Frau alleine mit dem Fahrrad rund um Afrika",
"speaker": "Dorothee Fleck",
"date": "2021-10-15",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_172255_836b5781.jpg",
"slug": "als-frau-alleine-mit-dem-fahrrad-rund-um-afrika-2021-10-15",
"updated_at": "2025-08-23T17:22:55+02:00",
"created_at": "2025-08-23T17:22:55+02:00"
},
{
"id": "evt_f1e9f86394a1",
"title": "Kanada vom Pazifik zum Atlantik",
"speaker": "Barbara Vetter und Vincent Heiland",
"date": "2020-09-25",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "19:00",
"tickets_info": "",
"catering": "Für das leibliche Wohl ist gesorgt",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_172346_82de8f39.jpg",
"slug": "kanada-vom-pazifik-zum-atlantik-2020-09-25",
"updated_at": "2025-08-23T17:23:46+02:00",
"created_at": "2025-08-23T17:23:46+02:00"
},
{
"id": "evt_5e61b4daedef",
"title": "Alaska nach Feuerland",
"speaker": "Thomas Meixner",
"date": "2019-11-15",
"time": "19:30",
"venue_name": "Schäler's Schenke",
"venue_address": "Am Plan 1, 99189 Walschleben",
"price": "",
"doors_open": "19:30",
"tickets_info": "",
"catering": "Abendessen in Schäler's Schänke",
"tags": "Live Reportage",
"description": "",
"image": "/uploads/event_20250823_172513_bb38c7d8.jpg",
"slug": "alaska-nach-feuerland-2019-11-15",
"updated_at": "2025-08-23T17:25:13+02:00"
},
{
"id": "evt_73bf36dbca3b",
"title": "Zu Fuß vom Nordpol Richtung Südpol",
"speaker": "Robby Clemens",
"date": "2019-01-01",
"time": "19:30",
"venue_name": "",
"venue_address": "",
"price": "",
"doors_open": "",
"tickets_info": "",
"catering": "",
"tags": "",
"description": "",
"image": "/uploads/event_20250823_172556_f68f8cda.jpg",
"slug": "zu-fu-vom-nordpol-richtung-sdpol-2019-01-01",
"updated_at": "2025-08-23T17:25:56+02:00",
"created_at": "2025-08-23T17:25:56+02:00"
},
{
"id": "evt_cee9094612cc",
"title": "Die innere Dimension des Bergsteigens",
"speaker": "Gerlinde Kaltenbrunner",
"date": "2026-01-16",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "",
"tickets_info": "",
"catering": "",
"tags": "Live Reportage",
"description": "Gerlinde Kaltenbrunner\r\nDie innere Dimension des Bergsteigens\r\n16.01.2026 / 19.30Uhr / Lindenhof Walschleben \r\n\r\nGerlinde Kaltenbrunner hat als erste Frau der Welt, alle Gipfel der 14 8000er, ohne Zuhilfenahme von zusätzlichem Sauerstoff und ohne Hochträgerunterstützung erreicht. Im aktuellen Vortag wird sie Ihnen anhand von verschiedenen Ausschnitten ihrer Expeditionen, ihre Herangehensweise zur inneren Dimension des Bergsteigens weitergeben. Sie berichtet über ihre körperliche und mentale Vorbereitung, über die ausdauernde Begeisterung, aber auch den Umgang mit Rückschlägen und das Überwinden von äußerst schwierigen Situationen. \r\nWichtige Elemente sind für Gerlinde Kaltenbrunner dazu die Meditation, das innere Bauchgefühl, genauso wie die Ernährung und die tiefe Verbindung zum Berg und zur Natur. In Teil zwei des Vortrages nimmt Sie Gerlinde mit zur Besteigung des K2, des Schwierigsten aller 8000er. Auf der chinesischen Seite des Berges gelang ihr 2011 in einem internationalen Team im siebten Anlauf der Gipfel über den sehr anspruchsvollen und wenig begangenen Nordpfeiler. Es erwartet Sie ein inspirierender Vortrag mit sehr persönlichen Eindrücken, untermalt mit spannenden Bildern und Videosequenzen aus der Bergwelt.\r\nBiografie Gerlind Kaltenbrunner:\r\nGerlinde Kaltenbrunner, Profibergsteigerin aus Passion, ist wann immer es die Zeit zulässt beim Sportklettern, unterwegs in den Alpen oder beim Expeditionsbergsteigen. Zunächst diplomierte Krankenschwester, entschied sie sich, nach einer Zwischenstation im Sportbekleidungsvertrieb, zur unsicheren Karriere als Berufsbergsteigerin. Heute vermerkt sie alle vierzehn bestiegene Achttausender Hauptgipfel. Mit der Besteigung des K2, des mit 8611 Metern zweithöchsten Berges der Erde, ist sie die erste Frau, die sämtliche Achttausendergipfel ohne Zuhilfenahme von Flaschensauerstoff und ohne Unterstützung von Hochträgern erreicht hat. Ihre Passion gilt jedoch nicht allein den hohen Bergen. Auch die Zusammenarbeit mit Menschen bewegt, berührt und beflügelt sie sehr. Innere Begeisterung, Hingabe, Dankbarkeit, ein achtsamer, respekt- und liebevoller Umgang mit der Natur und allen Wesen, sind die Grundpfeiler ihres Lebens. In Vorträgen und Seminaren gibt sie ihre Erfahrungen, Erlebnisse und Erkenntnisse weiter. So inspiriert sie seit vielen Jahren unzählige Menschen, aus verschiedensten Kulturen, Religionen und allen sozialen Schichten.\r\n\r\nErleben Gerlinde Kaltenbrunner live auf dem Saal im Lindenhof Walschleben. Einlass ist ab 19.00 Uhr. Für das leibliche Wohl ist am Veranstaltungsabend gesorgt.\r\n\r\nKarten bekommen Sie im Vorverkauf im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse. Achtung, der Blumenhof ist vom 05.01.26 bis 12.01.26 geschlossen. In dieser Zeit können Sie Karten unter walschleber.kultour@gmail.com reservieren.\r\n\r\n Wir freuen uns auf Ihren Besuch,\r\nIhr Team der Walschleber KulTour.",
"image": "/uploads/event_20250915_172534_0e78d94a.jpg",
"slug": "die-innere-dimension-des-bergsteigens-2026-01-16",
"updated_at": "2025-12-30T09:21:56+01:00"
},
{
"id": "evt_623cf63be157",
"title": "Australien - Ein Jahr Freiheit",
"speaker": "Aneta & Dirk Bleyer",
"date": "2026-01-17",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "",
"tickets_info": "",
"catering": "",
"tags": "Live Reportage",
"description": "Aneta & Dirk Bleyer \r\nAUSTRALIEN ein Jahr Freiheit\r\n17.01.2026 / 19.30Uhr / Lindenhof Walschleben \r\n\r\nAm Anfang stand ein Traum. Ein Jahr wahre Freiheit zu verspüren, fahren und bleiben, wohin der Wind einen weht und den roten Kontinent in seiner ganzen Vielfältigkeit kennenzulernen. \r\nLange haben Aneta und Dirk Bleyer geplant und gespart, denn es war klar, wahre Freiheit finden sie nur mit einem geländetauglichen Jeep. Im nördlichsten Zipfel Australiens waren die Fotografen, die auch mit National Geographic und dem Stern arbeiten, auf abenteuerlichen Pisten unterwegs, die selbst nur von wenigen Australiern befahren werden. Sie fuhren über Inseln, die komplett aus Sand bestehen und drangen tief in das rote Zentrum des Outbacks ein. Auch, wenn die Distanzen, die sie zu bewältigen hatten, oftmals gigantisch waren, hat sie am Ende die Vielfältigkeit der australischen Landschaft regelrecht sprachlos gemacht. Die Mischung zwischen Trockenheit, Salz und Bodenschätzen lassen Landschaften von surrealer Schönheit entstehen. Pinkfarbene Seen neben azurblauem Meer betören die Sinne genauso, wie enge Schluchten, deren stark eisenhaltiges Gestein die Landschaft im frühen und späten Sonnenlicht regelrecht zum Glühen bringen. Die Reisejournalisten sind aber auch auf etliches Kurioses gestoßen. Im Regenwald Tasmaniens glimmern fluoreszierende Pilze, an der Küste bricht das Wasser in stockfinsterer Nacht mit intensiv blau leuchtenden Wellen. Kängurus am Strand im Süden werden im Norden von Krokodilen abgelöst. Herzerwärmend sind die Begegnungen mit den Australiern selber. Mr. Campbell, der im weit fortgeschrittenen Alter den Spirit des australischen Wanderarbeiters weiterträgt, Jeff, der einen tiefen Einblick in das entbehrungsreiche Leben auf den isolierten Stations gibt sowie die vielen Kommunen der Aboriginal, die für eine Gleichstellung in der Gesellschaft kämpfen.\r\nMit viel Humor berichten sie über ihre teilweise sehr abenteuerlichen Unternehmungen und erzählen spannend und kenntnisreich über Land und Leute. Gekrönt wird alles mit einer brillanten Fotografie, die jedes Bild zum Genuss und die gesamte Show extrem kurzweilig werden lässt.\r\nFreuen Sie sich auf außergewöhnliche Bilder, vielen Insider-Tipps und spannende Geschichten mit Geländewagen, Flugzeug, Tauchausrüstung und Wanderschuhen aus dem Roten Kontinent und dem Gefühl, von:\r\neinem Jahr wahrer Freiheit!\r\n\r\nErleben Dirk und Aneta Bleyer live auf dem Saal im Lindenhof Walschleben. Einlass ist ab 19.00 Uhr. Für das leibliche Wohl ist am Veranstaltungsabend gesorgt.\r\n\r\nKarten bekommen Sie im Vorverkauf im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse. Achtung, der Blumenhof ist vom 05.01.26 bis 12.01.26 geschlossen. In dieser Zeit können Sie Karten unter walschleber.kultour@gmail.com reservieren.\r\n\r\n Wir freuen uns auf Ihren Besuch,\r\nIhr Team der Walschleber KulTour.",
"image": "/uploads/event_20250915_172841_09eb4636.jpg",
"slug": "australien-ein-jahr-freiheit-2026-01-17",
"updated_at": "2025-12-30T09:21:42+01:00"
},
{
"id": "evt_b0c48d3b811b",
"title": "Auf der Suche nach Italien",
"speaker": "Martin Engelmann",
"date": "2026-01-29",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "",
"tickets_info": "",
"catering": "",
"tags": "Live Reportage",
"description": "Martin Engelmann\r\nAUF DER SUCHE NACH ITALIEN\r\nGeschichten von Sehnsucht, Glück und Hoffnung\r\n\r\n29.01.2026 / 19.30Uhr / Lindenhof Walschleben \r\n\r\nIm Jahr 2010 wird Martin Engelmann vom renommierten Wochenmagazin „DIE ZEIT“ beauftragt, eine Reportage über Südtirol zu fotografieren. Auf seiner Reise durch die majestätischen Dolomiten erwachen in ihm Erinnerungen an eine zauberhafte Kindheit und die unvergesslichen Familienurlaube an der italienischen Adria. Martin Engelmann begibt sich in den folgenden Jahren auf Spurensuche nach Italien, um die Sehnsuchtsorte seiner Kindheit zu finden und neue Regionen zu entdecken. Es ist die Geburtsstunde eines jahrelangen Foto- und Filmprojekts über Martin Engelmanns persönliches Sehnsuchtsland Italien.\r\nIn der märchenhaften Wasserstadt Venedig erlebt er den farbenfrohen Karneval mit all\r\nseinen farbenfrohen Nuancen. Wenig später begibt er sich auf die historischen Pfade des Franziskuswegs, um zu Fuß die sanften Hügel der Toskana, Umbriens und Latiums zu durchwandern, bis er schließlich vor den antiken Mauern Roms steht. Jahr für Jahr kehrt Martin Engelmann nach Italien zurück, tief berührt von den Begegnungen mit den\r\nMenschen, die ihre Geschichten von Sehnsucht, Glück und Hoffnung mit ihm teilen.\r\n\r\nDen Spuren der Antike folgend, führen seine Reisen in die pulsierende Metropole Neapel\r\nund das versunkene Pompeji. Hier atmet Italien Geschichte. Nur einen Steinwurf vom\r\nSchatten des Vesuv entfernt eröffnet sich die prachtvollste Küstenlandschaft der Welt: die Amalfiküste und das malerische Capri, die als Inbegriff des Dolce Vita gelten. Martin\r\nEngelmanns Reise findet ihren Höhepunkt im Süden, wo Kalabrien, Apulien, Sizilien und\r\nSardinien mit ihrer unvergleichlichen Vielfalt begeistern. Hier hat die harmonische\r\nVerbindung zwischen Mensch und Natur die Regionen geprägt, und erzählt die Geschichten derjenigen, die sich nach einem einfachen, erfüllten Leben sehnen.\r\n\r\n„Auf der Suche nach Italien“ zeichnet ein opulentes Bild eines der schönsten Länder unserer Erde. Entstanden ist eine Ode an die Menschlichkeit, die Vielfalt und die Schönheit, die unsalle miteinander verbindet, wenn die Frage gestellt wird, was es wirklich bedeutet, Italien zusuchen und zu finden. \r\nDie neue Live-Multivision „Auf der Suche nach Italien“ zeichnet ein opulentes Bild eines der schönsten Länder unserer Erde. Entstanden ist eine Ode an die Menschlichkeit, die Vielfalt und die Schönheit, die uns alle miteinander verbindet, wenn die Frage gestellt wird, was es wirklich bedeutet, Italien zu suchen und zu finden.\r\nErleben Martin Engelmann live auf dem Saal im Lindenhof Walschleben. Einlass ist ab 19.00 Uhr. Für das leibliche Wohl ist am Veranstaltungsabend gesorgt.\r\nKarten bekommen Sie im Vorverkauf im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse.\r\n\r\n Wir freuen uns auf Ihren Besuch,\r\nIhr Team der Walschleber KulTour.",
"image": "/uploads/event_20250915_172956_d35b9177.jpg",
"slug": "auf-der-suche-nach-italien-2026-01-29",
"updated_at": "2025-11-11T19:21:32+01:00"
},
{
"id": "evt_4e56fe21253e",
"title": "Schottland - Weite Horizonte",
"speaker": "Hartmut Krinitz",
"date": "2026-02-27",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "15€",
"doors_open": "",
"tickets_info": "",
"catering": "",
"tags": "Live Reportage",
"description": "SCHOTTLAND Weite Horizonte\r\n\r\nEine live präsentierte Multivision von Hartmut Krinitz\r\n\r\n27.02.2026 / 19.30Uhr / Lindenhof Walschleben \r\n\r\nEuropas Vorposten im Nordwesten zeigt sich als Land der Kontraste.\r\nGrandiose Naturlandschaften treffen auf die ungleichen Metropolen Glasgow und Edinburgh, keltische Wurzeln mischen sich mit der Moderne, Avantgardearchitektur verblasst neben prähistorischen Steinkreisen, wo schon Feuer brannten als die Pyramiden von Gizeh noch nicht standen.\r\n\r\nTheodor Fontane, Robert Louis Stevenson, Sir Walter Scott und Robert Burns haben es bedichtet, das Land der Dudelsäcke und fliegenden Baumstämme und bis heute schneidert Gary Smyth in den Highlands den Kilt, webt Kathy Campbell auf den weltabgelegenen Hebriden Tweed und brennt Ian Mackintosh in der Speyside Single Malt Whisky, während Adrian Shine seit 30 Jahren nach den Geheimnissen des Loch Ness und seiner langhalsigen Bewohner forscht.\r\n\r\nZu Castles und mystischen Stätten, schroffen Bergen und Leuchttürmen in weiten Küstenlandschaften führt diese live präsentierte Multivision. Geprägt wird sie durch zahlreiche Literaturzitate und die Porträts von historischen und heute lebenden Schotten.\r\n\r\nHartmut Krinitz hat mehr als drei Jahre in Schottland verbracht und porträtiert dieses „Land der weiten Horizonte“ zu verschiedenen Jahreszeiten und aus den unterschiedlichsten Perspektiven.\r\n\r\nDer Buchautor und Europa-Spezialist Hartmut Krinitz wurde für die Multivision „Schottland Weite Horizonte“ mit dem Prädikat LEICAVISION ausgezeichnet, das für herausragende Fotografie und Rhetorik vergeben wird. \r\n\r\nSeine Bildbände zu Schottland sind im Stürtz Verlag erschienen.\r\n\r\nWeitere Informationen und Fotos unter www.hartmut-krinitz.de\r\n\r\nZur Person\r\n\r\nDer Europa-Spezialist Hartmut Krinitz zählt mit mehr als 1500 erfolgreich durchgeführten Veranstaltungen zu den gefragtesten Vortragsreferenten im deutschsprachigen Raum. \r\n\r\nAls professioneller Reisejournalist hat er bei renommierten Verlagen über 35 Bildbände und mehr als 80 Kalender zu europäischen Themen veröffentlicht. Seine Bilder erscheinen weltweit in führenden Magazinen.\r\n\r\nEr ist Mitglied der etablierten Bildagenturen hémis in Paris und laif in Köln, 2. Vorsitzender der GBV (Gesellschaft für Bild und Vortrag), berufenes Mitglied der DGPh (Deutsche Gesellschaft für Photographie) und Autor eines Lehrbuches zu Multivisionen.\r\n\r\nDurch regelmäßige, oft monatelange Aufenthalte gewinnt Hartmut Krinitz einen sehr persönlichen Bezug zu den bereisten Zielen. \r\n\r\nBei seinen Vorträgen verbindet er hochklassige Fotografie, Literaturauszüge, Originaltöne und fundierten Live-Kommentar zu einem eigenständigen Stil.\r\n\r\nErleben Martin Engelmann live auf dem Saal im Lindenhof Walschleben. Einlass ist ab 19.00 Uhr. Für das leibliche Wohl ist am Veranstaltungsabend gesorgt.\r\n\r\nKarten bekommen Sie im Vorverkauf im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse.\r\n\r\nWir freuen uns auf Ihren Besuch,\r\n\r\nIhr Team der Walschleber KulTour.",
"image": "/uploads/event_20250917_212102_3c046a84.jpg",
"slug": "schottland-weite-horizonte-2026-02-27",
"updated_at": "2025-11-11T19:22:29+01:00"
},
{
"id": "evt_cf621116b992",
"title": "Ligurien neu erfahren",
"speaker": "Harald Philipp",
"date": "2026-03-07",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "",
"doors_open": "",
"tickets_info": "",
"catering": "",
"tags": "Live Reportage",
"description": "LIGURIEN NEU ERFAHREN \r\nLive-Vortrag von Harald Philipp\r\nEin Mountainbike-Abenteuer zwischen Wurzeln und Wandel\r\n07.03.2026 / 19.30Uhr / Lindenhof Walschleben \r\n\r\nHarald Philipp zeigt Ligurien jenseits der Postkartenmotive: ein Mountainbike-Abenteuer vom Mittelmeer in die Alpenkämme. Uralte Maultierwege, offene Grate und neue Biketrails live erzählt und von sechs Filmsequenzen begleitet. Es geht nicht um Rekorde, sondern um Substanz: um Wege, die verbinden, um Dörfer, die atmen, und um Trailbau, der Zukunft schafft.\r\nHarald Philipp steht für Bike-Mountaineering zwischen Grat, Gipfel und fahrbaren Klettersteigen. Ligurien Neu Erfahren ist sein fünfter Live-Vortrag. Seit mehreren Jahren lebt er im ligurischen Hinterland, ist in der Szene verankert und reaktiviert alte Pfade nah an Landschaft, Menschen und den Fragen einer Region im Wandel.\r\nDas E-MTB ist hier kein Dogma, sondern ein Werkzeug. Es öffnet bergauf Singletrails, die sonst geschoben würden, und macht Runden jenseits der üblichen Shuttle-Runs möglich. Wir fahren auf bestehenden, oft vergessenen Pfaden legal, respektvoll und mit lokaler Kenntnis. Ergebnis: weniger Shuttle, mehr echtes Fahren; technische Kletterpassagen bergauf, konzentrierte Abfahrten bergab.\r\nErleben Harald Philipp live auf dem Saal im Lindenhof Walschleben. Einlass ist ab 19.00 Uhr. Für das leibliche Wohl ist am Veranstaltungsabend gesorgt.\r\nKarten bekommen Sie im Vorverkauf im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse.\r\n\r\n Wir freuen uns auf Ihren Besuch,\r\nIhr Team der Walschleber KulTour.",
"image": "/uploads/event_20250915_173205_6a9a8f04.jpg",
"slug": "ligurien-neu-erfahren-2026-03-07",
"updated_at": "2025-11-11T19:23:31+01:00"
},
{
"id": "evt_c8d99a462629",
"title": "Thüringen, Deine Sprache",
"speaker": "Gerald Backhaus",
"date": "2025-10-29",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "9,00€",
"doors_open": "",
"tickets_info": "",
"catering": "",
"tags": "",
"description": "THÜRINGEN, DEINE SPRACHE \r\nThüringer Dialekte und Mundarten\r\nEin Film von Gerald Backhaus\r\n29.10.2025 / 19.30 Uhr / Lindenhof Walschleben \r\n\r\nMit „No wie 'en?“ begrüßen sich echte Gothsche in Gotha. Echt? Wird in Thüringen noch Dialekt und Mundart gesprochen und wie klingt das? Das Westthüringische im Wartburgkreis, also um Eisenach und Bad Salzungen, kann ganz besonders klingen wie das Beispiel Ruhla zeigt. In der Nähe von Mühlhausen gibt es das Vogteier Platt, in der Gegend von Rudolstadt und Saalfeld geht das Ilmthüringische ins Südostthüringische über. Um Meiningen und in der Sonneberger Gegend klingt es Fränkisch. Und der Altenburger Dialekt zählt zum Ostthüringischen…\r\n„Wir tragen die Heimat im Maul herum“, sagt eine Protagonistin voller Überzeugung in THÜRINGEN, DEINE SPRACHE Thüringer Dialekte und Mundarten, dem ersten Film des Regisseurs Gerald Backhaus. Natürlich nicht auf Hochdeutsch, sondern in ihrer Meininger Mundart. Ein weiterer Interviewpartner sagt „Mundart ist meine Muttersprache“, und ein anderer Mann berichtet: „Wenn wir im Urlaub waren, war das wie eine Geheimsprache.“\r\n\r\nDen Schatz dieser bedrohten Mundarten macht THÜRINGEN, DEINE SPRACHE Thüringer Dialekte und Mundarten seit 2019 einer größeren Öffentlichkeit zugänglich. Dazu besuchte der in Gotha aufgewachsene Regisseur Gerald Backhaus zusammen mit seinem Kameramann Martin König mit Kamera und Mikrofon Menschen, die noch Mundart sprechen können. Die inzwischen drei entstandenen Filme stellen die einzelnen Arten der in Thüringen gesprochenen Dialekte und Mundarten vor und geben ihnen mit Protagonisten in ihren Heimatorten Gesicht und Stimme.\r\n\r\nNach der Kinopremiere im Sommer 2019 ging Regisseur Gerald Backhaus mit THÜRINGEN, DEINE SPRACHE Thüringer Dialekte und Mundarten auf eine Tournee durch den Freistaat. In den Kinos von Städten wie Weimar, Eisenach und Ilmenau wurde er im Sommer und Herbst 2019 gezeigt, in Meiningen, Sonneberg und Gotha lief er bereits zum zweiten Mal. Die Dialekt-Dokumentation wurde bei Heimatvereinen, in einem Kirmeszelt und in einer Kirche sowie auf dem „Tag der Tracht“ 2019 in Wechmar aufgeführt. Im Januar und Februar 2020 lief der Mundart-Film in Rudolstadt, Saalfeld und Altenburg.\r\nAm 29.10. stellen wir den Film von Gerald Backhaus gemeinsam mit Pfarrer Dirk Sterzik auf dem Saal im Lindenhof Walschleben vor. Die Vorfreude ist hier besonders groß, den zum einen, das mal wieder ein sehr regionales Thema und zum anderen ist es der erst Film den wir im Rahmen der Walschleber KulTour zeigen. Wir sind auf Ihre Reaktionen gespannt und freuen uns auf Ihren Besuch.\r\nEinlass ist ab 19.00 Uhr. Für das leibliche Wohl ist am Veranstaltungsabend gesorgt.\r\n\r\nKarten bekommen Sie für 9,00 Euro ab sofort im Vorverkauf im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse.",
"image": "/uploads/event_20250915_180536_19dffeff.jpg",
"slug": "thringen-deine-sprache-2025-10-29",
"updated_at": "2025-10-07T06:54:45+02:00"
},
{
"id": "evt_a4da77b1efcc",
"title": "Neuseeland",
"speaker": "Petra & Gerhard Zwerger-Schoner",
"date": "2026-03-19",
"time": "19:30",
"venue_name": "Lindenhof Walschleben",
"venue_address": "Lindenstraße 7, 99189 Walschleben",
"price": "15,00€",
"doors_open": "",
"tickets_info": "",
"catering": "",
"tags": "Live Reportage",
"description": "NEUSEELAND\r\n\"200 Tage am schönsten Ende der Welt\"\r\nEine Film- & Fotoreportage von Petra und Gerhard Zwerger-Schoner\r\n\r\n19.03.2026 / 19.30Uhr / Lindenhof Walschleben \r\n\r\nTraumstraßen entlang unberührter Küsten und schneebedeckte Gipfel über immergrünem Regenwald, rauchende Vulkane und brodelnd thermale Wunderwelten, idyllisches Farmland und geschichtsträchtige Orte mit stolzer Maorikultur auf heiligem Land. Das alles ist Neuseeland und noch viel mehr. Neuseelands Schönheit hat unzählige Gesichter und kaum ein Land offenbart seine Reize in derart beeindruckender Vielfalt.\r\n\r\nEin gutes halbes Jahr haben die österreichischen Reisejournalisten Petra & Gerhard Zwerger-Schoner „Aotearoa - das Land der langen weißen Wolke“ bereist, kennen und lieben gelernt. \r\nNur knapp vier Millionen Menschen besiedeln die beiden südpazifischen Inseln, deren Lage über den tektonischen Platten des „Feuerrings“ im Pazifik eine Landschaft hervorbrachte, die einzigartig auf der Welt ist, einem oft schlicht den Atem verschlägt und sprachlos macht. Nicht ohne Grund bildet die sagenhafte Schönheit Neuseelands die Kulisse für Tolkiens \"Mittelerde\", die Millionen von Zuschauern in der \"Herr-der-Ringe Trilogie\" und in \"Der Hobbit\" verzaubert. \r\nNeuseeland gilt für viele als Traumreiseziel, ein Land, in dem die Freiheit gelebt wird und sich Bürokratie und Reglements noch in Grenzen halten. Die lockere, legere Lebensart der \"Kiwis\", wie sich die Neuseeländer selbst gerne nennen, ist legendär. Die Landschaften sind von bizarrer Schönheit, sanft und hügelig oder rau und schroff. Die Intensität der Farben erscheint oft surreal, die Weite schier endlos und sie vermittelt hautnah die Kleinheit und Nichtigkeit des Einzelnen, die Stille bewahrt Raum für Träume. Neuseeland ist einfach anders: Es befreit, erdet den Geist, vermittelt tiefe Ruhe und berührt die Seele. Neuseeland ist ein optischer Leckerbissen, ein Land mit freundlichen, entspannten Menschen, Heimat für seltene Tiere, wie Pelzrobben, Pinguine oder den besonders rar gewordenen Kiwi, sowie Schutzgebiet für Urwälder, Gletscher und sensible marine Lebensräume. \r\n\r\nUnterwegs mit Reisecamper oder Geländewagen, mit Helikopter oder Flugzeug, mit dem Kanu oder zu Fuß, machte sich das Abenteurer-Paar auf, dieses Land in seiner enormen Vielfältigkeit zu entdecken. Tauchen Sie ein, in ein spannendes Reiseabenteuer und seien Sie auf ein einzigartiges Erlebnis gefasst - aufregend, witzig, informativ und äußerst kurzweilig! Lauschen Sie neugierig den lebensnahen Erzählungen der beiden Reisenden und lassen Sie sich von oftmals ungewöhnlich intensiven Eindrücken begeistern. Eindrücke, die sich all jenen eröffnen, die Zeit haben, eine Reise mit sämtlichen Sinnen zu erfahren. \r\n\"The Earth has Music for those who listen\", schrieb einst William Shakespeare. Petra und Gerhard Zwerger-Schoner haben zugehört und präsentieren Ihnen Neuseeland wie sie es noch nicht gesehen haben. \r\nEine faszinierende und bildgewaltige Reisereportage, voller brillanter Filmszenen, gemischt mit meisterhafter Fotografie. Ein audiovisuelles Erlebnis modernster Machart, in High Definition Digital Cinema Qualität.\r\nErleben Petra und Gerhard Zwerger-Schoner live auf dem Saal im Lindenhof Walschleben. Einlass ist ab 19.00 Uhr. Für das leibliche Wohl ist am Veranstaltungsabend gesorgt.\r\nKarten bekommen Sie im Vorverkauf im Blumenhof Kerst, Erfurter Straße 29b, 99189 Walschleben, Tel.: 036201/62358 und an der Abendkasse.\r\n\r\n Wir freuen uns auf Ihren Besuch,\r\nIhr Team der Walschleber KulTour.",
"image": "/uploads/event_20250916_065906_64e18fcb.jpg",
"slug": "neuseeland-2026-03-19",
"updated_at": "2025-11-11T19:40:43+01:00"
}
]
}
+126
View File
@@ -0,0 +1,126 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>Datenschutz Walschleber KulTour</title>
<meta name="description" content="Informationen zur Verarbeitung personenbezogener Daten (DSGVO).">
<link rel="canonical" href="https://walschleber-kultour.com/datenschutz.html">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta property="og:title" content="Datenschutz Walschleber KulTour">
<meta property="og:description" content="Hinweise zu personenbezogenen Daten, Cookies und Rechten.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://walschleber-kultour.com/datenschutz.html">
<meta property="og:image" content="https://walschleber-kultour.com/assets/og-default.jpg">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="/assets/logo.png" sizes="32x32" type="image/png">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom sticky-top">
<div class="container">
<a class="navbar-brand brand-logo" href="index.html">
<img src="/assets/logo.png" alt="Walschleber KulTour Logo" height="34" width="34">
<span>Walschleber KulTour</span>
</a>
</div>
</nav>
<header class="py-5 bg-light border-bottom">
<div class="container">
<div class="akzent-line mb-3"></div>
<h1 class="display-6 mb-2">Datenschutz</h1>
<p class="text-muted mb-0">Informationen zur Verarbeitung personenbezogener Daten nach DSGVO.</p>
</div>
</header>
<main class="container my-5">
<div class="p-4 border rounded-3 bg-white">
<h2>1. Verantwortlicher</h2>
<p>
Verantwortlich im Sinne der Datenschutzgesetze, insbesondere der EU-Datenschutzgrundverordnung (DSGVO), ist:<br><br>
Alexander Kerst<br>
Erfurter Straße 29b<br>
99189 Walschleben<br>
Deutschland<br>
E-Mail: <a href="mailto:walschleber.kultour@gmail.com">walschleber.kultour@gmail.com</a>
</p>
<h2>2. Allgemeine Hinweise zur Datenverarbeitung</h2>
<p>
Wir verarbeiten personenbezogene Daten der Nutzer grundsätzlich nur, soweit dies zur Bereitstellung einer funktionsfähigen Website sowie unserer Inhalte und Leistungen erforderlich ist.
Die Verarbeitung personenbezogener Daten erfolgt regelmäßig nur nach Einwilligung der Nutzer oder wenn die Verarbeitung durch gesetzliche Vorschriften gestattet ist.
</p>
<h2>3. Erhebung und Speicherung personenbezogener Daten</h2>
<ul>
<li><strong>Beim Besuch der Website:</strong> Unser System erfasst automatisch Informationen wie IP-Adresse, Datum und Uhrzeit des Zugriffs, Browsertyp, Betriebssystem. Diese Daten sind technisch erforderlich und dienen der Systemsicherheit.</li>
<li><strong>Bei Kontaktaufnahme:</strong> Wenn Sie uns per E-Mail kontaktieren, werden Ihre Angaben zur Bearbeitung der Anfrage sowie für mögliche Anschlussfragen gespeichert.</li>
</ul>
<h2>4. Rechtsgrundlagen der Verarbeitung</h2>
<p>
Die Verarbeitung erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO (Vertrag/Anbahnung),
Art. 6 Abs. 1 lit. c DSGVO (rechtliche Verpflichtung) oder Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse, z. B. für den sicheren Betrieb der Website).
Bei Einwilligungen stützen wir uns auf Art. 6 Abs. 1 lit. a DSGVO.
</p>
<h2>5. Speicherdauer</h2>
<p>
Personenbezogene Daten werden gelöscht, sobald der Zweck der Speicherung entfällt oder gesetzliche Aufbewahrungsfristen ablaufen.
</p>
<h2>6. Weitergabe von Daten</h2>
<p>
Eine Übermittlung Ihrer persönlichen Daten an Dritte erfolgt nur, wenn dies gesetzlich erlaubt ist,
zur Erfüllung eines Vertrags erforderlich ist oder Sie ausdrücklich eingewilligt haben.
</p>
<h2>7. Cookies</h2>
<p>
Unsere Website verwendet Cookies. Cookies sind kleine Textdateien, die auf Ihrem Endgerät gespeichert werden.
Sie dienen dazu, unsere Website nutzerfreundlicher und sicherer zu machen.
Sie können die Speicherung von Cookies durch Ihre Browsereinstellungen verhindern.
Bereits gespeicherte Cookies können jederzeit gelöscht werden.
</p>
<h2>8. Rechte der betroffenen Personen</h2>
<p>Sie haben folgende Rechte gemäß DSGVO:</p>
<ul>
<li>Recht auf Auskunft (Art. 15 DSGVO)</li>
<li>Recht auf Berichtigung (Art. 16 DSGVO)</li>
<li>Recht auf Löschung (Art. 17 DSGVO)</li>
<li>Recht auf Einschränkung der Verarbeitung (Art. 18 DSGVO)</li>
<li>Recht auf Datenübertragbarkeit (Art. 20 DSGVO)</li>
<li>Recht auf Widerspruch (Art. 21 DSGVO)</li>
<li>Recht auf Beschwerde bei einer Aufsichtsbehörde (Art. 77 DSGVO)</li>
</ul>
<h2>9. Datensicherheit</h2>
<p>
Wir setzen technische und organisatorische Sicherheitsmaßnahmen ein, um Ihre Daten gegen Manipulation, Verlust oder unbefugten Zugriff zu schützen.
Unsere Sicherheitsmaßnahmen werden entsprechend der technologischen Entwicklung fortlaufend verbessert.
</p>
<h2>10. Änderungen dieser Datenschutzerklärung</h2>
<p>
Wir behalten uns vor, diese Datenschutzerklärung bei Bedarf anzupassen,
um sie stets den aktuellen rechtlichen Anforderungen sowie Änderungen unserer Leistungen anzupassen.
</p>
</div>
</main>
<footer class="py-4 border-top">
<div class="container small d-flex gap-3 flex-wrap align-items-center">
<a href="impressum.html">Impressum</a>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
+217
View File
@@ -0,0 +1,217 @@
<?php
// functions.php
declare(strict_types=1);
require_once __DIR__ . '/config.php';
function ensure_storage(): void {
if (!is_dir(dirname(DATA_FILE))) {
@mkdir(dirname(DATA_FILE), 0775, true);
}
if (!is_file(DATA_FILE)) {
file_put_contents(DATA_FILE, json_encode(['events' => []], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}
if (!is_dir(UPLOAD_DIR)) {
@mkdir(UPLOAD_DIR, 0775, true);
}
}
function load_events(): array {
ensure_storage();
$raw = file_get_contents(DATA_FILE);
$data = json_decode($raw ?: '{"events":[]}', true);
return is_array($data) && isset($data['events']) ? $data['events'] : [];
}
function save_events(array $events): void {
ensure_storage();
$fp = fopen(DATA_FILE, 'c+');
if ($fp === false) {
throw new RuntimeException('Kann Datei nicht öffnen: ' . DATA_FILE);
}
flock($fp, LOCK_EX);
ftruncate($fp, 0);
fwrite($fp, json_encode(['events' => array_values($events)], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
fflush($fp);
flock($fp, LOCK_UN);
fclose($fp);
}
function by_datetime_asc(array $a, array $b): int {
return strtotime($a['date'].' '.$a['time']) <=> strtotime($b['date'].' '.$b['time']);
}
function by_datetime_desc(array $a, array $b): int {
return strtotime($b['date'].' '.$b['time']) <=> strtotime($a['date'].' '.$a['time']);
}
function now_iso(): string {
return date('Y-m-d\TH:i:sP');
}
function make_slug(string $title, string $date): string {
$t = mb_strtolower($title, 'UTF-8');
$t = preg_replace('~[^\pL\d]+~u', '-', $t);
$t = trim($t, '-');
$t = preg_replace('~[^-\w]+~', '', $t);
$t = preg_replace('~-+~', '-', $t);
return $t . '-' . $date;
}
function sanitize_text(string $s): string {
return trim($s);
}
function is_upcoming(array $event): bool {
$ts = strtotime($event['date'].' '.$event['time']);
return $ts >= time();
}
function handle_image_upload(?array $file): ?string {
if (!$file || ($file['error'] ?? UPLOAD_ERR_NO_FILE) === UPLOAD_ERR_NO_FILE) {
return null;
}
if ($file['error'] !== UPLOAD_ERR_OK) {
throw new RuntimeException('Upload-Fehler (Code '.$file['error'].')');
}
$allowed = ['image/jpeg' => 'jpg', 'image/png' => 'png', 'image/webp' => 'webp'];
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file['tmp_name']);
finfo_close($finfo);
if (!isset($allowed[$mime])) {
throw new RuntimeException('Nur JPG/PNG/WEBP erlaubt.');
}
$ext = $allowed[$mime];
$basename = 'event_'.date('Ymd_His').'_' . bin2hex(random_bytes(4)) . '.' . $ext;
$dest = rtrim(UPLOAD_DIR, '/').'/'.$basename;
if (!move_uploaded_file($file['tmp_name'], $dest)) {
throw new RuntimeException('Konnte Datei nicht speichern.');
}
return '/uploads/'.$basename; // Pfad relativ zur Webroot
}
function render_event_jsonld_graph(array $events): string {
$graph = [];
foreach ($events as $e) {
$start = $e['date'] . 'T' . ($e['time'] ?? '19:30') . ':00+02:00'; // Berlin Zeit im Sommer; vereinfacht
$price = $e['price'] ?? '';
$offers = $price !== '' ? [
"@type" => "Offer",
"price" => preg_replace('/[^\d,\.]/', '', $price),
"priceCurrency" => "EUR",
"availability" => "https://schema.org/InStock"
] : null;
$graph[] = array_filter([
"@type" => "Event",
"name" => $e['title'],
"startDate" => $start,
"eventStatus" => "https://schema.org/EventScheduled",
"eventAttendanceMode" => "https://schema.org/OfflineEventAttendanceMode",
"location" => [
"@type" => "Place",
"name" => $e['venue_name'] ?? "Veranstaltungsort",
"address" => [
"@type" => "PostalAddress",
"streetAddress" => $e['venue_address'] ?? "",
"addressLocality" => "Walschleben",
"postalCode" => "99189",
"addressCountry" => "DE"
],
],
"image" => isset($e['image']) && $e['image'] !== '' ? [ BASE_URL . $e['image'] ] : [ BASE_URL . DEFAULT_OG_IMAGE ],
"description" => $e['description'] ?? "",
"organizer" => [
"@type" => "Organization",
"name" => SITE_NAME,
"url" => BASE_URL
],
"offers" => $offers
]);
}
return json_encode([
"@context" => "https://schema.org",
"@graph" => $graph
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
}
function h(?string $s): string {
return htmlspecialchars($s ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
/**
* Erkennt, ob HTML-Tags enthalten sind.
*/
function has_html_tags(string $s): bool {
return (bool) preg_match('/<\s*\w+[^>]*>/', $s);
}
/**
* Erlaubte, sichere HTML-Ausgabe (Whitelist + Attribut-Filter).
* Erlaubt: p, br, ul/ol/li, b/strong, i/em, u, a, blockquote, h3-h5
* Entfernt: on* Handler, javascript: URLs, style/iframe/script usw.
* Fügt bei Links rel="noopener nofollow ugc" hinzu und erlaubt nur http(s).
*/
function render_rich_text(string $input): string {
$input = trim($input);
// Fall A: Kein HTML -> wir schützen & konvertieren Zeilenumbrüche
if (!has_html_tags($input)) {
return nl2br(h($input));
}
// Fall B: HTML vorhanden -> nur erlaubte Tags behalten
$allowed = '<p><br><ul><ol><li><b><strong><i><em><u><a><blockquote><h3><h4><h5>';
$html = strip_tags($input, $allowed);
// Gefährliche Event-Handler entfernen (on*)
$html = preg_replace('/\s+on\w+\s*=\s*(".*?"|\'.*?\'|[^\s>]+)/i', '', $html);
// style-Attribute entfernen (vermeidet versteckte JS/CSS-Tricks)
$html = preg_replace('/\s+style\s*=\s*(".*?"|\'.*?\'|[^\s>]+)/i', '', $html);
// href bereinigen: nur http/https erlauben, sonst entfernen
// Außerdem rel/target ergänzen
$html = preg_replace_callback(
'/<a\s+([^>]*href\s*=\s*(["\'])(.*?)\2[^>]*)>/i',
function ($m) {
$attr = $m[1];
$url = $m[3];
// javascript:, data:, mailto: usw. blocken (nur http/https)
if (!preg_match('~^https?://~i', $url)) {
// href wegnehmen
$attr = preg_replace('/\s*href\s*=\s*(".*?"|\'.*?\'|[^\s>]+)/i', '', $attr);
$url = null;
}
// target & rel setzen
if ($url) {
// target="_blank"
if (!preg_match('/\btarget\s*=/i', $attr)) {
$attr .= ' target="_blank"';
}
// rel ergänzen
if (preg_match('/\brel\s*=\s*("|\')(.*?)\1/i', $attr, $r)) {
$rels = array_map('trim', explode(' ', $r[2] ?: ''));
foreach (['noopener','nofollow','ugc'] as $need) {
if (!in_array($need, $rels, true)) $rels[] = $need;
}
$attr = preg_replace('/\brel\s*=\s*("|\')(.*?)\1/i', ' rel="'.implode(' ', $rels).'"', $attr);
} else {
$attr .= ' rel="noopener nofollow ugc"';
}
}
return '<a ' . trim($attr) . '>';
},
$html
);
// Restliche "href='javascript:…'"-Muster sicherheitshalber neutralisieren
$html = preg_replace('/href\s*=\s*(["\'])\s*javascript:[^"\']*\1/i', '', $html);
// Doppelte/überflüssige Leerzeichen in Tags aufräumen
$html = preg_replace('/\s{2,}/', ' ', $html);
return $html;
}
+2
View File
@@ -0,0 +1,2 @@
data
data/talks.json
+87
View File
@@ -0,0 +1,87 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>Impressum Walschleber KulTour</title>
<meta name="description" content="Gesetzliche Anbieterkennzeichnung für Walschleber KulTour.">
<link rel="canonical" href="https://walschleber-kultour.com/impressum.html">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta property="og:title" content="Impressum Walschleber KulTour">
<meta property="og:description" content="Anbieterkennzeichnung und Kontakt.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://walschleber-kultour.com/impressum.html">
<meta property="og:image" content="https://walschleber-kultour.com/assets/og-default.jpg">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="/assets/logo.png" sizes="32x32" type="image/png">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom sticky-top">
<div class="container">
<a class="navbar-brand brand-logo" href="index.html">
<img src="/assets/logo.png" alt="Walschleber KulTour Logo" height="34" width="34">
<span>Walschleber KulTour</span>
</a>
</div>
</nav>
<header class="py-5 bg-light border-bottom">
<div class="container">
<div class="akzent-line mb-3"></div>
<h1 class="display-6 mb-2">Impressum</h1>
<p class="text-muted mb-0">Gesetzliche Anbieterkennzeichnung.</p>
</div>
</header>
<main class="container my-5">
<div class="p-4 border rounded-3 bg-white">
<p><strong>Dienstanbieter gemäß § 5 TMG:</strong><br>
Alexander Kerst<br>
Erfurter Straße 29b<br>
99189 Walschleben<br>
Deutschland</p>
<p><strong>Kontakt:</strong><br>
Telefon: <em>+49 (0)172 8729594</em><br>
E-Mail: <a href="mailto:walschleber.kultour@gmail.com">walschleber.kultour@gmail.com</a></p>
<p><strong>Vertreten durch:</strong><br>
Alexander Kerst</p>
<p><strong>Bereitstellung & Administration:</strong><br>
Louis-Alexander Kerst</p>
<p><strong>Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV:</strong><br>
Alexander Kerst<br>
Erfurter Straße 29b<br>
99189 Walschleben<br>
Deutschland</p>
<hr>
<p><strong>EU-Streitschlichtung</strong><br>
Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit:
<a href="https://ec.europa.eu/consumers/odr" target="_blank" rel="noopener">https://ec.europa.eu/consumers/odr</a>.<br>
Unsere E-Mail-Adresse finden Sie oben im Impressum.</p>
<p><strong>Verbraucherstreitbeilegung/Universalschlichtungsstelle</strong><br>
Wir sind nicht verpflichtet und nicht bereit, an Streitbeilegungsverfahren vor einer
Verbraucherschlichtungsstelle teilzunehmen.</p>
</div>
</main>
<footer class="py-4 border-top">
<div class="container small d-flex gap-3 flex-wrap align-items-center">
<a href="datenschutz.html">Datenschutz</a>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
+156
View File
@@ -0,0 +1,156 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>Walschleber KulTour Kultur erleben!</title>
<meta name="description" content="Vorträge, Lesungen und Multivisionsshows in Walschleben. Entdecke das aktuelle Programm der Walschleber KulTour.">
<link rel="canonical" href="https://walschleber-kultour.com/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Open Graph / Twitter -->
<meta property="og:title" content="Walschleber KulTour Kultur erleben!">
<meta property="og:description" content="Vorträge, Lesungen & Multivisionsshows in Walschleben.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://walschleber-kultour.com/">
<meta property="og:image" content="https://walschleber-kultour.com/assets/og-default.jpg">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="/assets/logo.png" sizes="32x32" type="image/png">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<!-- Navbar mit Logo -->
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom sticky-top">
<div class="container">
<a class="navbar-brand brand-logo" href="index.html">
<img src="/assets/logo.png" alt="Walschleber KulTour Logo" height="34" width="34">
<span>Walschleber KulTour</span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#nav"><span class="navbar-toggler-icon"></span></button>
<div id="nav" class="collapse navbar-collapse">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="programm.php">Programm</a></li>
<li class="nav-item"><a class="nav-link" href="vergangene-vortraege.php">Vergangene Vorträge</a></li>
<li class="nav-item"><a class="nav-link" href="ueber-uns.html">Über uns</a></li>
<li class="nav-item"><a class="nav-link" href="kontakt.html">Kontakt</a></li>
</ul>
</div>
</div>
</nav>
<!-- HERO mit großem Background-Bild (wie alte Seite) -->
<header class="hero" style="background-image:url('/assets/hero.jpg');">
<div class="container py-5">
<div class="row">
<div class="col-lg-8">
<div class="akzent-line mb-3"></div>
<h1 class="display-4 mb-3">Kultur erleben in Walschleben</h1>
<p class="lead mb-4">Vorträge, Lesungen und Multivisionsshows Geschichten, die bewegen. Gemütlich, nahbar, inspirierend.</p>
<div class="d-flex flex-wrap gap-2">
<a class="btn btn-accent btn-lg" href="programm.php">Jetzt Tickets sichern</a>
<a class="btn btn-outline-brand btn-lg" href="newsletter.html">Newsletter abonnieren</a>
</div>
</div>
</div>
</div>
</header>
<!-- Warum kommen? -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
<section class="container my-5">
<p class="section-kicker mb-1">Warum KulTour?</p>
<h2 class="section-title h3">Abende, die im Kopf bleiben</h2>
<div class="row g-3 mt-1">
<div class="col-md-4"><div class="feature"><div class="icon"><i class="bi bi-camera-reels"></i></div><div><strong>Beeindruckende Bilder</strong><br><span class="text-muted">LiveReportagen & Multivision.</span></div></div></div>
<div class="col-md-4"><div class="feature"><div class="icon"><i class="bi bi-people"></i></div><div><strong>Nah dran</strong><br><span class="text-muted">Frag die Referenten direkt.</span></div></div></div>
<div class="col-md-4"><div class="feature"><div class="icon"><i class="bi bi-cup-hot"></i></div><div><strong>Gemütliches Ambiente</strong><br><span class="text-muted">Einlass & Bewirtung vor Ort.</span></div></div></div>
</div>
</section>
<main>
<!-- Teaser-Sektion -->
<section class="container my-5">
<div class="row g-4">
<div class="col-md-6">
<div class="p-4 border rounded-3 h-100">
<h2 class="section-title h4 mb-2">Was ist die KulTour?</h2>
<p>Eine ehrenamtliche Vortragsreihe in Walschleben mit wechselnden Themen aus Reise, Abenteuer und Kultur live erzählt, mit Herz und Nähe zum Publikum.</p>
<a href="ueber-uns.html" class="btn btn-outline-primary btn-sm">Mehr erfahren</a>
</div>
</div>
<div class="col-md-6">
<div class="p-4 border rounded-3 h-100">
<h2 class="section-title h4 mb-2">Newsletter</h2>
<p>Verpasse keinen Termin: Trage dich in unseren Newsletter ein und erhalte neue Veranstaltungen direkt per EMail.</p>
<a href="newsletter.html" class="btn btn-outline-primary btn-sm">Newsletter abonnieren</a>
</div>
</div>
</div>
</section>
<!-- Optischer Trenner -->
<section class="section-soft py-5 border-top">
<div class="container">
<div class="d-flex flex-wrap align-items-center justify-content-between">
<h2 class="h4 mb-3 mb-lg-0">Aktuelle Highlights</h2>
<a class="btn btn-brand" href="programm.php">Alle Termine ansehen</a>
</div>
<p class="text-muted mb-0 mt-3">Die Übersicht der kommenden Veranstaltungen findest du im Programm.</p>
</div>
</section>
</main>
<!-- Partner -->
<section class="coop-wrap py-4 border-top">
<div class="container">
<div class="coop-card d-flex flex-column flex-lg-row align-items-lg-center justify-content-between gap-3">
<div class="coop-head">
<div class="akzent-line" style="width:48px;height:4px"></div>
<div>
<div class="coop-kicker">In Kooperation mit</div>
<div class="coop-sub">Starke lokale Partner, die Kultur möglich machen</div>
</div>
</div>
<div class="coop-logos">
<a class="coop-logo" href="https://www.gemeinde-walschleben.info/" target="_blank" rel="noopener" aria-label="Gemeinde Walschleben (öffnet neue Seite)">
<img src="/assets/partner_gemeinde.png"
width="160" height="40" loading="lazy" decoding="async"
alt="Gemeinde Walschleben">
</a>
<a class="coop-logo" href="http://www.svemporwalschleben.de/" target="_blank" rel="noopener" aria-label="SV Empor Walschleben (öffnet neue Seite)">
<img src="/assets/partner_empor.png"
width="150" height="40" loading="lazy" decoding="async"
alt="SV Empor Walschleben">
</a>
<a class="coop-logo" href="https://www.facebook.com/walschbergRunners/" target="_blank" rel="noopener" aria-label="WalschbergRunners (öffnet neue Seite)">
<img src="/assets/partner_wbr.png"
width="150" height="40" loading="lazy" decoding="async"
alt="WalschbergRunners">
<a class="coop-logo" href="https://blumenhof-kerst.com/" target="_blank" rel="noopener" aria-label="...">
<img src="/assets/partner_blumenhof.png" loading="lazy" decoding="async" alt="Blumenhof Kerst">
</a>
</div>
</div>
</div>
</section>
<footer class="py-4">
<div class="container small d-flex gap-3 flex-wrap align-items-center">
<span>&copy; <span id="y"></span> Walschleber KulTour</span>
<span class="separator"></span>
<a href="impressum.html">Impressum</a>
<span class="separator"></span>
<a href="datenschutz.html">Datenschutz</a>
<span class="separator"></span>
<a>Programmiert und betrieben mit 💙 in Thüringen</a>
</div>
</footer>
<script>document.getElementById('y').textContent=new Date().getFullYear();</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
+88
View File
@@ -0,0 +1,88 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>Kontakt Walschleber KulTour</title>
<meta name="description" content="So erreichst du die Walschleber KulTour. Fragen, Presse, Vortrag anbieten? Schreib uns!">
<link rel="canonical" href="https://walschleber-kultour.com/kontakt.html">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta property="og:title" content="Kontakt Walschleber KulTour">
<meta property="og:description" content="E-Mail, Adresse und Kontaktmöglichkeiten.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://walschleber-kultour.com/kontakt.html">
<meta property="og:image" content="https://walschleber-kultour.com/assets/og-default.jpg">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="/assets/logo.png" sizes="32x32" type="image/png">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/styles.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom sticky-top">
<div class="container">
<a class="navbar-brand brand-logo" href="index.html">
<img src="/assets/logo.png" alt="Walschleber KulTour Logo" height="34" width="34">
<span>Walschleber KulTour</span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#nav">
<span class="navbar-toggler-icon"></span>
</button>
<div id="nav" class="collapse navbar-collapse">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="programm.php">Programm</a></li>
<li class="nav-item"><a class="nav-link" href="vergangene-vortraege.php">Vergangene Vorträge</a></li>
<li class="nav-item"><a class="nav-link" href="ueber-uns.html">Über uns</a></li>
<li class="nav-item"><a class="nav-link active" href="kontakt.html">Kontakt</a></li>
</ul>
</div>
</div>
</nav>
<header class="py-5 bg-light border-bottom">
<div class="container">
<div class="akzent-line mb-3"></div>
<h1 class="display-6 mb-2">Kontakt</h1>
<p class="text-muted mb-0">Fragen? Presse? Du möchtest einen Vortrag anbieten? Wir freuen uns auf deine Nachricht.</p>
</div>
</header>
<main class="container my-5">
<div class="row g-4">
<div class="col-lg-7">
<div class="p-4 border rounded-3 bg-white h-100">
<p class="section-kicker mb-1">Schreib uns</p>
<h2 class="h4">Walschleber KulTour</h2>
<p class="mb-1"><i class="bi bi-envelope me-2"></i><a href="mailto:walschleber.kultour@gmail.com">walschleber.kultour@gmail.com</a></p>
<p class="mb-0"><i class="bi bi-geo-alt me-2"></i>Erfurter Straße 29b, 99189 Walschleben</p>
<hr class="my-4">
<p class="text-muted mb-1">Du planst einen Vortrag oder eine Lesung?</p>
<p class="mb-0">Schick uns kurz Thema, Datumsidee und ein paar Stichworte wir melden uns!</p>
</div>
</div>
<div class="col-lg-5">
<div class="cta-band p-4 h-100 d-flex flex-column justify-content-center rounded-4">
<p class="section-kicker mb-1">Direkt loslegen</p>
<h3 class="h5 mb-3">Schau dir unsere kommenden Termine an.</h3>
<a class="btn btn-accent btn-lg" href="programm.php">Zum Programm</a>
</div>
</div>
</div>
</main>
<footer class="py-4 border-top">
<div class="container small d-flex gap-3 flex-wrap align-items-center">
<span>&copy; <span id="y"></span> Walschleber KulTour</span>
<span class="separator"></span><a href="impressum.html">Impressum</a>
<span class="separator"></span><a href="datenschutz.html">Datenschutz</a>
</div>
</footer>
<script>document.getElementById('y').textContent=new Date().getFullYear();</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
+117
View File
@@ -0,0 +1,117 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>Newsletter Walschleber KulTour</title>
<meta name="description" content="Abonniere den Newsletter und erhalte neue Termine der Walschleber KulTour direkt per E-Mail.">
<link rel="canonical" href="https://walschleber-kultour.com/newsletter.html">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Open Graph -->
<meta property="og:title" content="Newsletter Walschleber KulTour">
<meta property="og:description" content="Verpasse keinen Termin: Jetzt anmelden.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://walschleber-kultour.com/newsletter.html">
<meta property="og:image" content="https://walschleber-kultour.com/assets/og-default.jpg">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="/assets/logo.png" sizes="32x32" type="image/png">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/styles.css">
<!-- Performance hint für MailerLite -->
<link rel="preconnect" href="https://assets.mailerlite.com" crossorigin>
<link rel="preconnect" href="https://static.mailerlite.com" crossorigin>
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom sticky-top">
<div class="container">
<a class="navbar-brand brand-logo" href="index.html">
<img src="/assets/logo.png" alt="Walschleber KulTour Logo" height="34" width="34">
<span>Walschleber KulTour</span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#nav">
<span class="navbar-toggler-icon"></span>
</button>
<div id="nav" class="collapse navbar-collapse">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="programm.php">Programm</a></li>
<li class="nav-item"><a class="nav-link" href="vergangene-vortraege.php">Vergangene Vorträge</a></li>
<li class="nav-item"><a class="nav-link" href="ueber-uns.html">Über uns</a></li>
<li class="nav-item"><a class="nav-link active" href="newsletter.html">Newsletter</a></li>
</ul>
</div>
</div>
</nav>
<header class="py-5 bg-light border-bottom">
<div class="container">
<div class="akzent-line mb-3"></div>
<h1 class="display-6 mb-2">Newsletter</h1>
<p class="text-muted mb-0">Verpasse keinen Termin wir mailen dir neue Veranstaltungen beizeiten.</p>
</div>
</header>
<main class="container my-5">
<div class="row g-4">
<!-- Links: Embed -->
<div class="col-lg-7">
<div class="p-4 border rounded-3 bg-white h-100">
<p class="section-kicker mb-1">Anmeldung</p>
<h2 class="h4">Schnell & DSGVOkonform</h2>
<p>Trage deine EMail ein und bestätige die Anmeldung per DoubleOptIn.</p>
<!-- MailerLite EMBED (ersetze FORM_ID durch deine ID) -->
<div class="p-3 p-md-4 cta-band rounded-4">
<!-- BEGIN MailerLite Embed -->
<div class="ml-embedded" data-form="IYRbz8"></div>
<!-- END MailerLite Embed -->
<noscript>
<p class="text-danger mt-2 mb-0">Bitte JavaScript aktivieren, um das NewsletterFormular zu laden.</p>
</noscript>
</div>
<p class="small text-muted mt-3 mb-0">
Hinweis: Wir verwenden MailerLite als NewsletterDienst. Mit deiner Anmeldung erklärst du dich mit der Verarbeitung deiner Daten
zum Versand des Newsletters einverstanden. Details findest du in unserer <a href="/datenschutz.html">Datenschutzerklärung</a>.
</p>
</div>
</div>
<!-- Rechts: Vorteile -->
<div class="col-lg-5">
<div class="p-4 border rounded-3 bg-white h-100">
<p class="section-kicker mb-1">Vorteile</p>
<h2 class="h5">Warum abonnieren?</h2>
<ul class="mb-0">
<li>Frühzeitig über neue Termine informiert</li>
<li>Besondere Hinweise & Hintergründe</li>
<li>Nur relevante Infos kein Spam</li>
<li>Jederzeit mit einem Klick abmelden</li>
</ul>
</div>
</div>
</div>
</main>
<footer class="py-4 border-top">
<div class="container small d-flex gap-3 flex-wrap align-items-center">
<span>&copy; <span id="y"></span> Walschleber KulTour</span>
<span class="separator"></span><a href="impressum.html">Impressum</a>
<span class="separator"></span><a href="datenschutz.html">Datenschutz</a>
</div>
</footer>
<script>document.getElementById('y').textContent=new Date().getFullYear();</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<!-- MailerLite Universal (geladen am Ende für bessere Performance) -->
<script>
(function(w,d,e,u,f,l,n){w[f]=w[f]||function(){(w[f].q=w[f].q||[]).push(arguments);},
l=d.createElement(e),l.async=1,l.src=u,n=d.getElementsByTagName(e)[0],n.parentNode.insertBefore(l,n);})
(window,document,'script','https://assets.mailerlite.com/js/universal.js','ml');
ml('account', '1275954'); // <-- deine Account-ID aus deinem Snippet
</script>
</body>
</html>
+232
View File
@@ -0,0 +1,232 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/functions.php';
$all = load_events();
$upcoming = array_values(array_filter($all, 'is_upcoming'));
usort($upcoming, 'by_datetime_asc');
$jsonld = render_event_jsonld_graph($upcoming);
?>
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>Programm | <?= h(SITE_NAME) ?></title>
<meta name="description" content="Aktuelle Vorträge, Lesungen und Multivisionsshows in Walschleben <?= h(SITE_NAME) ?>. Termine, Inhalte, Tickets.">
<link rel="canonical" href="<?= h(BASE_URL) ?>/programm.php">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta property="og:title" content="Programm | <?= h(SITE_NAME) ?>">
<meta property="og:description" content="Aktuelle Vorträge, Lesungen und Multivisionsshows Termine & Infos.">
<meta property="og:type" content="website">
<meta property="og:url" content="<?= h(BASE_URL) ?>/programm.php">
<meta property="og:image" content="<?= h(BASE_URL . DEFAULT_OG_IMAGE) ?>">
<meta name="twitter:card" content="summary_large_image">
<script type="application/ld+json"><?= $jsonld ?></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/styles.css">
<link rel="icon" href="/assets/logo.png" sizes="32x32" type="image/png">
<style>
/* ===== Poster Cards (perfektionistischer Look) ===== */
.poster-card{
border:1px solid #e9edf3;
border-radius:1.1rem;
box-shadow:0 8px 28px rgba(0,0,0,.06);
transition:transform .18s ease, box-shadow .18s ease, border-color .18s ease;
background:#fff;
}
.poster-card:hover{ transform:translateY(-2px); box-shadow:0 12px 38px rgba(0,0,0,.10); cursor:pointer; }
.poster-media{
padding:1rem 1rem 0; display:flex; justify-content:center; align-items:center;
}
.poster-img{
display:block; margin:0 auto;
width:auto; height:auto; max-width:100%;
/* Bild bestimmt die Kachelhöhe harmonisch skaliert, aber nie beschnitten */
max-height: clamp(220px, 32vh, 420px);
object-fit:contain;
border-radius:.75rem;
box-shadow:0 6px 18px rgba(0,0,0,.08);
}
.poster-body{
text-align:center; padding:1rem 1.25rem 1.25rem;
}
.poster-date{ text-transform:uppercase; letter-spacing:.06em; }
.poster-title{ font-weight:800; line-height:1.15; margin:.25rem 0 .35rem; }
.poster-sub{ color:var(--muted); }
.poster-desc{ margin:.75rem auto 0; color:#344654; max-width:46ch; }
.poster-meta{ margin-top:.9rem; gap:.5rem; justify-content:center }
.poster-meta .badge{ font-weight:600 }
.top-ribbon{
position:absolute; top:12px; left:12px; background:var(--brand); color:#fff;
font-weight:700; padding:.28rem .55rem; border-radius:.5rem; font-size:.8rem;
box-shadow:0 6px 14px rgba(23,137,202,.25);
}
/* Modal Bild schön groß & mittig */
.modal-img{ max-height:90vh; width:auto; height:auto; object-fit:contain; display:block; margin:0 auto; }
.modal-body p{ white-space:pre-line; }
/* Tastatur-Focus sichtbar */
.poster-card:focus{ outline:3px solid rgba(23,137,202,.35); outline-offset:2px; }
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom sticky-top">
<div class="container">
<a class="navbar-brand brand-logo" href="index.html">
<img src="/assets/logo.png" alt="Walschleber KulTour Logo" height="34" width="34">
<span><?= h(SITE_NAME) ?></span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#nav"><span class="navbar-toggler-icon"></span></button>
<div id="nav" class="collapse navbar-collapse">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link active" href="programm.php">Programm</a></li>
<li class="nav-item"><a class="nav-link" href="vergangene-vortraege.php">Vergangene Vorträge</a></li>
<li class="nav-item"><a class="nav-link" href="ueber-uns.html">Über uns</a></li>
<li class="nav-item"><a class="nav-link" href="kontakt.html">Kontakt</a></li>
</ul>
</div>
</div>
</nav>
<header class="py-5 bg-light border-bottom">
<div class="container">
<h1 class="display-6 mb-2">Programm</h1>
<p class="text-muted mb-0">Alle kommenden Termine auf einen Blick.</p>
</div>
</header>
<main class="container my-4">
<?php if (!$upcoming): ?>
<div class="alert alert-info">Derzeit sind keine zukünftigen Termine eingetragen.</div>
<?php else: ?>
<div class="d-flex justify-content-between align-items-center mb-3">
<div class="small text-muted">Sortierung: demnächst zuerst</div>
<a class="btn btn-brand btn-sm" href="vergangene-vortraege.php">Zum Archiv</a>
</div>
<div class="row g-4">
<?php foreach ($upcoming as $e): $mid = 'event-'.h($e['id']); ?>
<div class="col-md-6 col-lg-4">
<article class="poster-card position-relative h-100"
data-bs-toggle="modal" data-bs-target="#<?= $mid ?>"
tabindex="0" role="button" aria-label="Details zu <?= h($e['title']) ?> öffnen">
<?php if (!empty($e['image'])): ?>
<div class="poster-media">
<img class="poster-img" src="<?= h($e['image']) ?>" alt="<?= h($e['title']) ?>">
</div>
<?php endif; ?>
<div class="poster-body">
<span class="top-ribbon">Kommender Termin</span>
<div class="small text-muted poster-date mb-2">
<?= date('d.m.Y', strtotime($e['date'])) ?> · <?= h($e['time'] ?: '19:30') ?>
</div>
<h2 class="h5 poster-title"><?= h($e['title']) ?></h2>
<?php if (!empty($e['speaker'])): ?>
<div class="poster-sub small mb-2">mit <?= h($e['speaker']) ?></div>
<?php endif; ?>
<?php if (!empty($e['description'])): ?>
<p class="poster-desc"><?= nl2br(h(mb_strimwidth($e['description'], 0, 220, '…'))) ?></p>
<?php endif; ?>
<div class="d-flex flex-wrap poster-meta">
<?php if (!empty($e['venue_name'])): ?>
<span class="badge text-bg-light border"><?= h($e['venue_name']) ?></span>
<?php endif; ?>
<?php if (!empty($e['price'])): ?>
<span class="badge badge-accent">Eintritt: <?= h($e['price']) ?></span>
<?php endif; ?>
<?php if (!empty($e['doors_open'])): ?>
<span class="badge text-bg-light border">Einlass: <?= h($e['doors_open']) ?></span>
<?php endif; ?>
<?php if (!empty($e['tags'])): ?>
<span class="badge text-bg-light border"><?= h($e['tags']) ?></span>
<?php endif; ?>
</div>
<?php
$ticketUrl = null;
if (!empty($e['tickets_info']) && preg_match('~https?://[^\s]+~', $e['tickets_info'], $m)) {
$ticketUrl = $m[0];
}
?>
<?php if ($ticketUrl): ?>
<div class="mt-3">
<a class="btn btn-brand btn-sm" href="<?= h($ticketUrl) ?>" target="_blank" rel="noopener" onclick="event.stopPropagation()">Tickets sichern</a>
</div>
<?php elseif (!empty($e['tickets_info'])): ?>
<div class="mt-3 small text-muted"><strong>Tickets:</strong> <?= h($e['tickets_info']) ?></div>
<?php endif; ?>
<a href="#<?= $mid ?>" class="stretched-link" data-bs-toggle="modal" data-bs-target="#<?= $mid ?>" aria-hidden="true" tabindex="-1"></a>
</div>
</article>
</div>
<?php endforeach; ?>
</div>
<!-- Modals -->
<?php foreach ($upcoming as $e): $mid = 'event-'.h($e['id']); ?>
<div class="modal fade" id="<?= $mid ?>" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-centered modal-fullscreen-sm-down">
<div class="modal-content">
<div class="modal-header">
<h2 class="modal-title h4 mb-0"><?= h($e['title']) ?></h2>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Schließen"></button>
</div>
<div class="modal-body">
<?php if (!empty($e['image'])): ?>
<img src="<?= h($e['image']) ?>" alt="<?= h($e['title']) ?>" class="modal-img mb-3">
<?php endif; ?>
<p class="text-muted small mb-2">
<?= date('d.m.Y', strtotime($e['date'])) ?> · <?= h($e['time'] ?: '19:30') ?>
<?php if (!empty($e['speaker'])): ?> · mit <?= h($e['speaker']) ?><?php endif; ?>
</p>
<?php if (!empty($e['venue_name']) || !empty($e['venue_address'])): ?>
<p class="mb-2 text-center"><strong><?= h($e['venue_name']) ?></strong><?= !empty($e['venue_address']) ? ' · '.h($e['venue_address']) : '' ?></p>
<?php endif; ?>
<?php if (!empty($e['price']) || !empty($e['doors_open'])): ?>
<p class="mb-2 text-center">
<?php if (!empty($e['price'])): ?><span class="badge badge-accent">Eintritt: <?= h($e['price']) ?></span> <?php endif; ?>
<?php if (!empty($e['doors_open'])): ?><span class="badge text-bg-light border">Einlass: <?= h($e['doors_open']) ?></span><?php endif; ?>
</p>
<?php endif; ?>
<?php if (!empty($e['tags'])): ?>
<p class="mb-2 text-center"><span class="badge text-bg-light border"><?= h($e['tags']) ?></span></p>
<?php endif; ?>
<div class="poster-desc">
<?= render_rich_text($e['description'] ?? '') ?>
</div>
<?php if (!empty($ticketUrl)): ?>
<div class="text-center"><a class="btn btn-brand" href="<?= h($ticketUrl) ?>" target="_blank" rel="noopener">Tickets sichern</a></div>
<?php elseif (!empty($e['tickets_info'])): ?>
<div class="small text-center"><strong>Tickets:</strong> <?= h($e['tickets_info']) ?></div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
<?php endif; ?>
</main>
<footer class="py-4 border-top mt-5">
<div class="container small d-flex gap-3 flex-wrap align-items-center">
<span>&copy; <?= date('Y') ?> <?= h(SITE_NAME) ?></span>
<span class="separator">•</span><a href="impressum.html">Impressum</a>
<span class="separator">•</span><a href="datenschutz.html">Datenschutz</a>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
+1
View File
@@ -0,0 +1 @@
robots.txt
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="https://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>https://walschleber-kultour.com/</loc><lastmod>2025-08-23</lastmod></url>
<url><loc>https://walschleber-kultour.com/programm.php</loc><lastmod>2025-08-23</lastmod></url>
<url><loc>https://walschleber-kultour.com/vergangene-vortraege.php</loc><lastmod>2025-08-23</lastmod></url>
<url><loc>https://walschleber-kultour.com/ueber-uns.html</loc><lastmod>2025-08-23</lastmod></url>
<url><loc>https://walschleber-kultour.com/kontakt.html</loc><lastmod>2025-08-23</lastmod></url>
<url><loc>https://walschleber-kultour.com/newsletter.html</loc><lastmod>2025-08-23</lastmod></url>
<url><loc>https://walschleber-kultour.com/impressum.html</loc><lastmod>2025-08-23</lastmod></url>
<url><loc>https://walschleber-kultour.com/datenschutz.html</loc><lastmod>2025-08-23</lastmod></url>
</urlset>
+105
View File
@@ -0,0 +1,105 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>Über uns Walschleber KulTour</title>
<meta name="description" content="Die Menschen, die Walschleber KulTour möglich machen Idee, Team und Partner.">
<link rel="canonical" href="https://walschleber-kultour.com/ueber-uns.html">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Open Graph -->
<meta property="og:title" content="Über uns Walschleber KulTour">
<meta property="og:description" content="Wer wir sind, warum wir das machen und mit wem wir zusammenarbeiten.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://walschleber-kultour.com/ueber-uns.html">
<meta property="og:image" content="https://walschleber-kultour.com/assets/og-default.jpg">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="/assets/logo.png" sizes="32x32" type="image/png">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/styles.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom sticky-top">
<div class="container">
<a class="navbar-brand brand-logo" href="index.html">
<img src="/assets/logo.png" alt="Walschleber KulTour Logo" height="34" width="34">
<span>Walschleber KulTour</span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#nav">
<span class="navbar-toggler-icon"></span>
</button>
<div id="nav" class="collapse navbar-collapse">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="programm.php">Programm</a></li>
<li class="nav-item"><a class="nav-link" href="vergangene-vortraege.php">Vergangene Vorträge</a></li>
<li class="nav-item"><a class="nav-link active" href="ueber-uns.html">Über uns</a></li>
<li class="nav-item"><a class="nav-link" href="kontakt.html">Kontakt</a></li>
</ul>
</div>
</div>
</nav>
<header class="py-5 bg-light border-bottom">
<div class="container">
<div class="akzent-line mb-3"></div>
<h1 class="display-6 mb-2">Über uns</h1>
<p class="text-muted mb-0">Ehrenamtlich organisiert mit Herz für Kultur in Walschleben.</p>
</div>
</header>
<main class="container my-5">
<div class="row g-4">
<div class="col-lg-6">
<div class="p-4 border rounded-3 h-100 bg-white">
<p class="section-kicker mb-1">Unsere Idee</p>
<h2 class="section-title h4">Abende voller Geschichten</h2>
<p>Wir bringen besondere Vorträge nach Walschleben: Reise, Abenteuer, Kultur live, nahbar und inspirierend. Unser Ziel: Menschen zusammenbringen, die Lust auf gute Geschichten haben.</p>
<ul class="list-unstyled mt-3">
<li class="feature mb-2"><div class="icon"><i class="bi bi-stars"></i></div><div><strong>Qualität</strong><br><span class="text-muted">Ausgewählte Referentinnen und Referenten.</span></div></li>
<li class="feature mb-2"><div class="icon"><i class="bi bi-emoji-smile"></i></div><div><strong>Atmosphäre</strong><br><span class="text-muted">Gemütlich, freundlich, persönlich.</span></div></li>
<li class="feature"><div class="icon"><i class="bi bi-shop-window"></i></div><div><strong>Vor Ort</strong><br><span class="text-muted">Einlass & Bewirtung ein runder Abend.</span></div></li>
</ul>
</div>
</div>
<div class="col-lg-6">
<div class="p-4 border rounded-3 h-100 bg-white">
<p class="section-kicker mb-1">Partner</p>
<h2 class="section-title h4">Gemeinsam stark</h2>
<p>Die KulTour wird durch lokale Vereine und Unterstützer getragen.</p>
<ul class="mb-0">
<li>Gemeinde Walschleben</li>
<li>SV Empor Walschleben</li>
<li>WalschbergRunners</li>
<li>Blumenhof Kerst</li>
</ul>
</div>
</div>
</div>
<section class="my-5">
<div class="cta-band p-4 p-md-5 d-md-flex justify-content-between align-items-center">
<div class="mb-3 mb-md-0">
<p class="section-kicker mb-1">Lust auf einen Abend bei uns?</p>
<h3 class="h5 mb-0">Hier gehts zum aktuellen Programm.</h3>
</div>
<a class="btn btn-accent btn-lg" href="programm.php">Zum Programm</a>
</div>
</section>
</main>
<footer class="py-4 border-top">
<div class="container small d-flex gap-3 flex-wrap align-items-center">
<span>&copy; <span id="y"></span> Walschleber KulTour</span>
<span class="separator"></span><a href="impressum.html">Impressum</a>
<span class="separator"></span><a href="datenschutz.html">Datenschutz</a>
</div>
</footer>
<script>document.getElementById('y').textContent=new Date().getFullYear();</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
+4
View File
@@ -0,0 +1,4 @@
# Verhindert das Ausführen von PHP/Skripten im Upload-Ordner
RemoveHandler .php .phtml .php3 .php4 .php5 .php7 .phps
php_flag engine off
Options -ExecCGI
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 675 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 546 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 703 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 734 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

+173
View File
@@ -0,0 +1,173 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/functions.php';
$all = load_events();
$past = array_values(array_filter($all, fn($e) => !is_upcoming($e)));
usort($past, 'by_datetime_desc');
$jsonld = render_event_jsonld_graph($past);
?>
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>Vergangene Vorträge | <?= h(SITE_NAME) ?></title>
<meta name="description" content="Archiv: Bereits stattgefundene Vorträge & Lesungen der <?= h(SITE_NAME) ?> in Walschleben.">
<link rel="canonical" href="<?= h(BASE_URL) ?>/vergangene-vortraege.php">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta property="og:title" content="Vergangene Vorträge | <?= h(SITE_NAME) ?>">
<meta property="og:description" content="Archiv abgeschlossener Veranstaltungen Themen & Referenten.">
<meta property="og:type" content="website">
<meta property="og:url" content="<?= h(BASE_URL) ?>/vergangene-vortraege.php">
<meta property="og:image" content="<?= h(BASE_URL . DEFAULT_OG_IMAGE) ?>">
<meta name="twitter:card" content="summary_large_image">
<script type="application/ld+json"><?= $jsonld ?></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/styles.css">
<link rel="icon" href="/assets/logo.png" sizes="32x32" type="image/png">
<style>
.poster-card{ border:1px solid #e9edf3; border-radius:1.1rem; box-shadow:0 8px 28px rgba(0,0,0,.06); transition:transform .18s ease, box-shadow .18s ease, border-color .18s ease; background:#fff; }
.poster-card:hover{ transform:translateY(-2px); box-shadow:0 12px 38px rgba(0,0,0,.10); cursor:pointer; }
.poster-media{ padding:1rem 1rem 0; display:flex; justify-content:center; align-items:center; }
.poster-img{ display:block; margin:0 auto; width:auto; height:auto; max-width:100%; max-height: clamp(220px, 32vh, 420px); object-fit:contain; border-radius:.75rem; box-shadow:0 6px 18px rgba(0,0,0,.08); }
.poster-body{ text-align:center; padding:1rem 1.25rem 1.25rem; }
.poster-date{ text-transform:uppercase; letter-spacing:.06em; }
.poster-title{ font-weight:800; line-height:1.15; margin:.25rem 0 .35rem; }
.poster-sub{ color:var(--muted); }
.poster-desc{ margin:.75rem auto 0; color:#344654; max-width:46ch; }
.poster-meta{ margin-top:.9rem; gap:.5rem; justify-content:center }
.top-ribbon{ position:absolute; top:12px; left:12px; background:#9aa6b2; color:#fff; font-weight:700; padding:.28rem .55rem; border-radius:.5rem; font-size:.8rem; box-shadow:0 6px 14px rgba(0,0,0,.18); }
.modal-img{ max-height:90vh; width:auto; height:auto; object-fit:contain; display:block; margin:0 auto; }
.modal-body p{ white-space:pre-line; }
.poster-card:focus{ outline:3px solid rgba(23,137,202,.35); outline-offset:2px; }
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom sticky-top">
<div class="container">
<a class="navbar-brand brand-logo" href="index.html">
<img src="/assets/logo.png" alt="Walschleber KulTour Logo" height="34" width="34">
<span><?= h(SITE_NAME) ?></span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#nav"><span class="navbar-toggler-icon"></span></button>
<div id="nav" class="collapse navbar-collapse">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="programm.php">Programm</a></li>
<li class="nav-item"><a class="nav-link active" href="vergangene-vortraege.php">Vergangene Vorträge</a></li>
<li class="nav-item"><a class="nav-link" href="ueber-uns.html">Über uns</a></li>
<li class="nav-item"><a class="nav-link" href="kontakt.html">Kontakt</a></li>
</ul>
</div>
</div>
</nav>
<header class="py-5 bg-light border-bottom">
<div class="container">
<h1 class="display-6 mb-2">Vergangene Vorträge</h1>
<p class="text-muted mb-0">Archiv der bisherigen Veranstaltungen.</p>
</div>
</header>
<main class="container my-4">
<?php if (!$past): ?>
<div class="alert alert-info">Noch keine vergangenen Einträge.</div>
<?php else: ?>
<div class="d-flex justify-content-between align-items-center mb-3">
<div class="small text-muted">Sortierung: neueste zuerst</div>
<a class="btn btn-brand btn-sm" href="programm.php">Zu den kommenden Terminen</a>
</div>
<div class="row g-4">
<?php foreach ($past as $e): $mid = 'past-'.h($e['id']); ?>
<div class="col-md-6 col-lg-4">
<article class="poster-card position-relative h-100"
data-bs-toggle="modal" data-bs-target="#<?= $mid ?>"
tabindex="0" role="button" aria-label="Details zu <?= h($e['title']) ?> öffnen">
<?php if (!empty($e['image'])): ?>
<div class="poster-media">
<img class="poster-img" src="<?= h($e['image']) ?>" alt="<?= h($e['title']) ?>">
</div>
<?php endif; ?>
<div class="poster-body">
<span class="top-ribbon">Archiv</span>
<div class="small text-muted poster-date mb-2">
<?= date('d.m.Y', strtotime($e['date'])) ?> · <?= h($e['time'] ?: '19:30') ?>
</div>
<h2 class="h5 poster-title"><?= h($e['title']) ?></h2>
<?php if (!empty($e['speaker'])): ?>
<div class="poster-sub small mb-2">mit <?= h($e['speaker']) ?></div>
<?php endif; ?>
<?php if (!empty($e['description'])): ?>
<p class="poster-desc"><?= nl2br(h(mb_strimwidth($e['description'], 0, 240, '…'))) ?></p>
<?php endif; ?>
<div class="d-flex flex-wrap poster-meta">
<?php if (!empty($e['venue_name'])): ?>
<span class="badge text-bg-light border"><?= h($e['venue_name']) ?></span>
<?php endif; ?>
<?php if (!empty($e['tags'])): ?>
<span class="badge text-bg-light border"><?= h($e['tags']) ?></span>
<?php endif; ?>
</div>
<a href="#<?= $mid ?>" class="stretched-link" data-bs-toggle="modal" data-bs-target="#<?= $mid ?>" aria-hidden="true" tabindex="-1"></a>
</div>
</article>
</div>
<?php endforeach; ?>
</div>
<!-- Modals -->
<?php foreach ($past as $e): $mid = 'past-'.h($e['id']); ?>
<div class="modal fade" id="<?= $mid ?>" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-centered modal-fullscreen-sm-down">
<div class="modal-content">
<div class="modal-header">
<h2 class="modal-title h4 mb-0"><?= h($e['title']) ?></h2>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Schließen"></button>
</div>
<div class="modal-body">
<?php if (!empty($e['image'])): ?>
<img src="<?= h($e['image']) ?>" alt="<?= h($e['title']) ?>" class="modal-img mb-3">
<?php endif; ?>
<p class="text-muted small mb-2">
<?= date('d.m.Y', strtotime($e['date'])) ?> · <?= h($e['time'] ?: '19:30') ?>
<?php if (!empty($e['speaker'])): ?> · mit <?= h($e['speaker']) ?><?php endif; ?>
</p>
<?php if (!empty($e['venue_name']) || !empty($e['venue_address'])): ?>
<p class="mb-2 text-center"><strong><?= h($e['venue_name']) ?></strong><?= !empty($e['venue_address']) ? ' · '.h($e['venue_address']) : '' ?></p>
<?php endif; ?>
<?php if (!empty($e['tags'])): ?>
<p class="mb-2 text-center"><span class="badge text-bg-light border"><?= h($e['tags']) ?></span></p>
<?php endif; ?>
<?php if (!empty($e['description'])): ?>
<p class="mb-0 text-center"><?= nl2br(h($e['description'])) ?></p>
<?php endif; ?>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
<?php endif; ?>
</main>
<footer class="py-4 border-top mt-5">
<div class="container small d-flex gap-3 flex-wrap align-items-center">
<span>&copy; <?= date('Y') ?> <?= h(SITE_NAME) ?></span>
<span class="separator">•</span><a href="impressum.html">Impressum</a>
<span class="separator">•</span><a href="datenschutz.html">Datenschutz</a>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>