<?php /************************************************* * BIBELLESE – EIN-DATEI-SCRIPT (CMS INCLUDE) *************************************************/ /* ======================= KONFIGURATION ======================= */ define('BL_DATA', __DIR__ . '/slots.json'); define('BL_BACKUP_DIR', __DIR__ . '/backups'); define('BL_ADMIN_PW', 'GEHEIM'); define('BL_MAIL_FROM', Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!'); /* ======================= SESSION (CMS-sicher) ======================= */ if (session_status() === PHP_SESSION_NONE) { session_start(); } /* ======================= DATEI-LOCKING ======================= */ function bl_load(&$fp) { if (!file_exists(BL_DATA)) { file_put_contents(BL_DATA, '[]'); } $fp = fopen(BL_DATA, 'c+'); flock($fp, LOCK_EX); $json = stream_get_contents($fp); return $json ? json_decode($json, true) : []; } function bl_save($fp, $data) { ftruncate($fp, 0); rewind($fp); fwrite($fp, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); fflush($fp); flock($fp, LOCK_UN); fclose($fp); } /* ======================= ADMIN CHECK ======================= */ function bl_admin() { if (!isset($_SESSION['bl_admin'])) { if (($_POST['bl_pw'] ?? '') === BL_ADMIN_PW) { $_SESSION['bl_admin'] = true; } else { echo '

'; return false; } } return true; } /* ======================= ROUTING ======================= */ $action = $_GET['bl_action'] ?? 'list'; echo '

'; /* ================================================== ÖFFENTLICHE LISTE ================================================== */ if ($action === 'list') { $slots = bl_load($fp); echo ''; foreach ($slots as $s) { $frei = $s['status'] === 'frei'; echo '<tr'.($frei ? ' style="background:#ffd6d6"' : '').'>'; echo ''.htmlspecialchars($s['start']).''; echo ''.$s['status'].''; echo ''; if (!empty($s['teilnehmer'])) { echo htmlspecialchars($s['teilnehmer']['vorname'].' '.$s['teilnehmer']['nachname']); if (!empty($s['teilnehmer']['email_sichtbar'])) { echo ' ('.htmlspecialchars($s['teilnehmer']['email']).')'; } } echo ''; echo 'Eintragen'; echo ''; } echo '
ZeitStatusTeilnehmer 
'; bl_save($fp, $slots); } /* ================================================== ANMELDEFORMULAR ================================================== */ if ($action === 'signup') { $id = (int)($_GET['id'] ?? 0); echo '





'; } /* ================================================== SPEICHERN / WARTELISTE ================================================== */ if ($action === 'save') { $slots = bl_load($fp); foreach ($slots as &$s) { if ($s['id'] == $_POST['id']) { $person = [ 'vorname' => trim($_POST['vorname']), 'nachname'=> trim($_POST['nachname']), 'email' => trim($_POST['email']), 'email_sichtbar' => isset($_POST['sichtbar']) ]; if ($s['status'] === 'frei') { $s['status'] = 'belegt'; $s['teilnehmer'] = $person; mail( $person['email'], 'Bestätigung Bibellese', "Dein Zeitfenster:\n{$s['start']}", "From: ".BL_MAIL_FROM ); } else { $s['warteliste'][] = $person; } } } bl_save($fp, $slots); echo '

Danke für deine Anmeldung.

Zurück zur Übersicht

'; } /* ================================================== ADMIN ÜBERSICHT ================================================== */ if ($action === 'admin') { if (!bl_admin()) { echo '

'; return; } $slots = bl_load($fp); echo '

Adminbereich

'; foreach ($slots as $s) { echo htmlspecialchars($s['start']).' – '.$s['status'].' [freigeben]
'; } echo '

CSV Export | Backup'; bl_save($fp, $slots); } /* ================================================== SLOT FREIGEBEN / NACHRÜCKEN ================================================== */ if ($action === 'delete') { if (!bl_admin()) { echo ''; return; } $slots = bl_load($fp); foreach ($slots as &$s) { if ($s['id'] == ($_GET['id'] ?? 0)) { if (!empty($s['warteliste'])) { $s['teilnehmer'] = array_shift($s['warteliste']); $s['status'] = 'belegt'; } else { $s['status'] = 'frei'; $s['teilnehmer'] = null; } } } bl_save($fp, $slots); echo '

Slot aktualisiert.

Zurück

'; } /* ================================================== CSV EXPORT (EXCEL) ================================================== */ if ($action === 'export') { if (!bl_admin()) { echo ''; return; } $slots = bl_load($fp); header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=bibellese.csv'); $out = fopen('php://output', 'w'); fputcsv($out, ['Zeit', 'Status', 'Name', 'E-Mail'], ';'); foreach ($slots as $s) { fputcsv($out, [ $s['start'], $s['status'], $s['teilnehmer']['vorname'] ?? '', $s['teilnehmer']['email'] ?? '' ], ';'); } fclose($out); bl_save($fp, $slots); exit; } /* ================================================== BACKUP ================================================== */ if ($action === 'backup') { if (!bl_admin()) { echo ''; return; } if (!is_dir(BL_BACKUP_DIR)) { mkdir(BL_BACKUP_DIR, 0777, true); } copy(BL_DATA, BL_BACKUP_DIR.'/slots_'.date('Ymd_His').'.json'); echo '

Backup erstellt.

Zurück

'; } echo '';