139 lines
7.2 KiB
PHP
139 lines
7.2 KiB
PHP
<?php
|
|
session_set_cookie_params([
|
|
'httponly' => true,
|
|
'samesite' => 'Strict',
|
|
'secure' => !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off',
|
|
'use_strict_mode' => true,
|
|
]);
|
|
session_start();
|
|
$_SESSION['registration_csrf'] ??= bin2hex(random_bytes(32));
|
|
header('Cache-Control: no-store');
|
|
header('X-Content-Type-Options: nosniff');
|
|
header('X-Frame-Options: DENY');
|
|
header('Referrer-Policy: no-referrer');
|
|
header('Permissions-Policy: camera=(), microphone=(), geolocation=()');
|
|
header("Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; base-uri 'self'; form-action 'self'; frame-ancestors 'none'");
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>Gastregistrierung</title>
|
|
<link rel="stylesheet" href="./css/booking.css">
|
|
</head>
|
|
<body>
|
|
|
|
<h1>Gastregistrierung</h1>
|
|
|
|
<form action="process_registration.php" method="POST">
|
|
<input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['registration_csrf'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?>">
|
|
|
|
<!-- 1. Name und E-Mail des Gastes -->
|
|
<div class="form-group">
|
|
<label for="name">Name des Gastes:</label>
|
|
<input type="text" id="name" name="name" maxlength="255" required>
|
|
|
|
<label for="email">E-Mail-Adresse:</label>
|
|
<input type="email" id="email" name="email" maxlength="255" required>
|
|
|
|
<label class="checkbox-label" for="under_27">
|
|
<input type="checkbox" id="under_27" name="under_27" value="1">
|
|
Unter 27
|
|
</label>
|
|
</div>
|
|
|
|
<!-- 2. Gasttyp (Dropdown) -->
|
|
<div class="form-group">
|
|
<label for="guest_type">Gasttyp:</label>
|
|
<select id="guest_type" name="guest_type" required>
|
|
<option value="">Bitte auswählen</option>
|
|
<option value="day_guest">Tagesgast</option>
|
|
<option value="regular_guest">Dauergast</option>
|
|
</select>
|
|
</div>
|
|
|
|
<!-- 3. Bedingte Auswahl basierend auf Gasttyp -->
|
|
<div class="form-group" id="room_details">
|
|
<!-- Dauergast-Optionen (wird angezeigt, wenn regelmäßiger Gast gewählt wird) -->
|
|
<div id="regular_guest_options">
|
|
<label for="room_type">Zimmerart:</label>
|
|
<select id="room_type" name="room_type">
|
|
<option value="single">Einzelzimmer</option>
|
|
<option value="double">Doppelzimmer</option>
|
|
<option value="multi">Mehrbettzimmer</option>
|
|
</select>
|
|
|
|
<!-- Bedingte Felder für Doppel/Mehrbettzimmer -->
|
|
<div id="roommate_info" style="display: none;">
|
|
<label for="roommates">Mit wem möchten Sie das Zimmer teilen?</label>
|
|
<input type="text" id="roommates" name="roommates" placeholder="Name des Mitbewohners" autocomplete="off" list="roommate_suggestions">
|
|
<datalist id="roommate_suggestions"></datalist>
|
|
</div>
|
|
<label class="checkbox-label" for="early_departure_enabled">
|
|
<input type="checkbox" id="early_departure_enabled" name="early_departure_enabled" value="1">
|
|
Ich reise vorzeitig ab.
|
|
</label>
|
|
<div id="early_departure_options" style="display: none;">
|
|
<label>Abreisezeitpunkt:</label>
|
|
<div class="checkbox-group">
|
|
<label><input type="radio" name="early_departure" value="sat_breakfast"> Samstag nach dem Frühstück</label>
|
|
<label><input type="radio" name="early_departure" value="sat_lunch"> Samstag nach dem Mittagessen</label>
|
|
<label><input type="radio" name="early_departure" value="sat_coffee"> Samstag nach dem Kaffee</label>
|
|
<label><input type="radio" name="early_departure" value="sat_dinner"> Samstag nach dem Abendessen</label>
|
|
<label><input type="radio" name="early_departure" value="sun_breakfast"> Sonntag nach dem Frühstück</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Tagesgast-Optionen (wird angezeigt, wenn Tagesgast gewählt wird) -->
|
|
<div id="day_guest_options" style="display: none;">
|
|
<label>Anwesenheitstage (Checkboxen):</label>
|
|
<div class="checkbox-group">
|
|
<input type="checkbox" name="days[]" value="1"> Fr.
|
|
<input type="checkbox" name="days[]" value="2"> Sa.
|
|
<input type="checkbox" name="days[]" value="3"> So.
|
|
<!-- Fügen Sie hier weitere Tage hinzu -->
|
|
</div>
|
|
|
|
<label>Gewünschte Mahlzeiten je Anwesenheitstag:</label>
|
|
<?php $mealOptionsByDay = [
|
|
'1' => ['dinner' => 'Abendessen'],
|
|
'2' => ['breakfast' => 'Frühstück', 'lunch' => 'Mittagessen', 'coffee' => 'Kaffee', 'dinner' => 'Abendessen'],
|
|
'3' => ['breakfast' => 'Frühstück', 'lunch' => 'Mittagessen'],
|
|
]; ?>
|
|
<?php foreach (['1' => 'Fr.', '2' => 'Sa.', '3' => 'So.'] as $dayValue => $dayLabel): ?>
|
|
<fieldset class="meal-day">
|
|
<legend><?= htmlspecialchars($dayLabel, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?></legend>
|
|
<div class="checkbox-group">
|
|
<?php foreach ($mealOptionsByDay[$dayValue] as $mealValue => $mealLabel): ?>
|
|
<label><input type="checkbox" name="meals[<?= $dayValue ?>][]" value="<?= $mealValue ?>"> <?= $mealLabel ?></label>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
</fieldset>
|
|
<?php endforeach; ?>
|
|
<p class="form-help">Die Getränkepauschale und die Proberaumpauschale werden für Tagesgäste automatisch pro Anwesenheitstag berechnet.</p>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 4. Allergien und Essensvorlieben (für beide Gasttypen) -->
|
|
<div class="form-group">
|
|
<label>Allergien, Essensvorlieben oder religiöse Einschränkungen:</label>
|
|
<input type="text" name="allergies" placeholder="z.B. Vegetarier, Vegan, Glutenunverträglichkeit, etc.">
|
|
</div>
|
|
|
|
<!-- 5. Sonstige Hinweise -->
|
|
<div class="form-group">
|
|
<label for="other_notes">Sonstiges:</label>
|
|
<textarea id="other_notes" name="other_notes" rows="5" maxlength="5000" placeholder="Weitere Hinweise oder Wünsche"></textarea>
|
|
</div>
|
|
|
|
<button type="submit">Registrieren</button>
|
|
|
|
</form>
|
|
|
|
<script src="./scripts/functions.js?v=20260918-2"></script>
|
|
<script src="./scripts/security.js"></script>
|
|
|
|
</body>
|
|
</html>
|