34950-vm/register.php
2025-10-17 11:02:25 +00:00

227 lines
13 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
session_start();
require_once 'db/config.php';
require_once 'mail/MailService.php';
// Helper function to fetch webinar details
function get_webinar_details($id) {
if (empty($id)) return null;
try {
$stmt = db()->prepare("SELECT id, title, description, scheduled_at, presenter FROM webinars WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
error_log("Database error fetching webinar ID $id: " . $e->getMessage());
return null;
}
}
$webinar_id = filter_input(INPUT_GET, 'webinar_id', FILTER_VALIDATE_INT) ?: filter_input(INPUT_POST, 'webinar_id', FILTER_VALIDATE_INT) ?: 1;
$webinar = get_webinar_details($webinar_id);
if (!$webinar) {
http_response_code(404);
echo "Webinar not found.";
exit;
}
$error_message = null;
$success_message = null;
$form_data = $_SESSION['form_data'] ?? [];
unset($_SESSION['form_data']);
// --- FORM SUBMISSION (POST REQUEST) ---
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// --- DATA CAPTURE ---
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$first_name = filter_input(INPUT_POST, 'first_name', FILTER_SANITIZE_STRING);
$last_name = filter_input(INPUT_POST, 'last_name', FILTER_SANITIZE_STRING);
$company = filter_input(INPUT_POST, 'company', FILTER_SANITIZE_STRING);
$how_did_you_hear = filter_input(INPUT_POST, 'how_did_you_hear', FILTER_SANITIZE_STRING);
$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW);
$confirm_password = filter_input(INPUT_POST, 'confirm_password', FILTER_UNSAFE_RAW);
$timezone = filter_input(INPUT_POST, 'timezone', FILTER_SANITIZE_STRING);
// Store form data in session to repopulate on error
$_SESSION['form_data'] = $_POST;
if (!$first_name || !$last_name || !$email) {
$error_message = 'Please fill out all required fields.';
} elseif ($password !== $confirm_password) {
$error_message = 'Passwords do not match.';
} else {
try {
$stmt = db()->prepare("SELECT id FROM attendees WHERE webinar_id = ? AND email = ?");
$stmt->execute([$webinar_id, $email]);
if ($stmt->fetch()) {
$error_message = 'You are already registered for this webinar.';
} else {
$password_hash = password_hash($password, PASSWORD_DEFAULT);
$sql = "INSERT INTO attendees (webinar_id, first_name, last_name, email, company, how_did_you_hear, password, timezone)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
$stmt = db()->prepare($sql);
$stmt->execute([$webinar_id, $first_name, $last_name, $email, $company, $how_did_you_hear, $password_hash, $timezone]);
$webinar_date_obj = new DateTime($webinar['scheduled_at']);
$subject = "Confirmation: You're Registered for " . $webinar['title'];
$body_html = "<h1>You're in!</h1><p>Thanks for registering for our webinar: <strong>{$webinar['title']}</strong>.</p><p>It will take place on <strong>" . $webinar_date_obj->format('l, F j, Y \a\t g:i A T') . "</strong>.</p><p>You can now log in to your dashboard to see the details.</p>";
MailService::sendMail($email, $subject, $body_html);
// --- PREPARE SUCCESS RESPONSE ---
$webinar_date = new DateTime($webinar['scheduled_at'], new DateTimeZone('UTC'));
$start_time_utc = $webinar_date->format('Ymd\THis\Z');
$webinar_date->add(new DateInterval('PT1H')); // Assume 1 hour duration
$end_time_utc = $webinar_date->format('Ymd\THis\Z');
$google_link = 'https://www.google.com/calendar/render?action=TEMPLATE&text=' . urlencode($webinar['title']) . '&dates=' . $start_time_utc . '/' . $end_time_utc . '&details=' . urlencode($webinar['description']) . '&ctz=UTC';
$ics_content = implode("\r\n", [
'BEGIN:VCALENDAR', 'VERSION:2.0', 'BEGIN:VEVENT',
'URL:' . 'http://' . $_SERVER['HTTP_HOST'],
'DTSTART:' . $start_time_utc, 'DTEND:' . $end_time_utc,
'SUMMARY:' . $webinar['title'], 'DESCRIPTION:' . $webinar['description'],
'END:VEVENT', 'END:VCALENDAR'
]);
$outlook_link = 'data:text/calendar;charset=utf-8,' . rawurlencode($ics_content);
$success_message = "<h1>Youre in!</h1>
<p>Thanks for registering for <strong>" . htmlspecialchars($webinar['title']) . "</strong>.</p>
<p>Check your email for your confirmation. You can now log in to see the details.</p>
<div class='calendar-buttons'>
<a href='" . htmlspecialchars($google_link) . "' target='_blank'>Add to Google Calendar</a>
<a href='" . htmlspecialchars($outlook_link) . "' download='webinar.ics'>Add to Outlook (ICS)</a>
</div>";
unset($_SESSION['form_data']); // Clear form data on success
}
} catch (Exception $e) {
error_log("Registration error: " . $e->getMessage());
$error_message = 'An unexpected error occurred. Please try again.';
}
}
if ($error_message) {
// Redirect back to the form with the error message
$_SESSION['error_message'] = $error_message;
header("Location: register.php?webinar_id = " . $webinar_id);
exit;
}
} else {
// On GET request, check for session error messages
if (isset($_SESSION['error_message'])) {
$error_message = $_SESSION['error_message'];
unset($_SESSION['error_message']);
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Register for <?= htmlspecialchars($webinar['title']) ?></title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; background-color: #1a202c; color: #e2e8f0; margin: 0; padding: 2rem; display: flex; justify-content: center; align-items: center; min-height: 100vh; }
.container { max-width: 900px; width: 100%; display: grid; grid-template-columns: 1fr 1fr; gap: 4rem; align-items: start; }
.left-pane h1 { font-size: 2.5rem; color: #f6e05e; margin-bottom: 1rem; }
.left-pane .date-time { font-size: 1.25rem; font-weight: bold; margin-bottom: 1.5rem; }
.left-pane .value-prop { font-size: 1.1rem; color: #a0aec0; line-height: 1.6; }
.speakers { margin-top: 2rem; }
.speakers h3 { font-size: 1.2rem; color: #cbd5e0; margin-bottom: 1rem; }
.speaker { display: flex; align-items: center; margin-bottom: 1rem; }
.speaker img { width: 50px; height: 50px; border-radius: 50%; margin-right: 1rem; background-color: #4a5568; }
.right-pane .card { background-color: #2d3748; border-radius: 0.5rem; padding: 2rem; border: 1px solid #4a5568; }
.right-pane h2 { margin-top: 0; font-size: 1.5rem; color: #f6e05e; text-align: center; }
.form-group { margin-bottom: 1.5rem; }
label { display: block; margin-bottom: 0.5rem; font-weight: bold; }
input[type="email"], input[type="text"], input[type="password"] { width: 100%; padding: 0.75rem; background-color: #1a202c; border: 1px solid #4a5568; border-radius: 0.375rem; color: #e2e8f0; font-size: 1rem; box-sizing: border-box; }
.submit-btn { display: block; width: 100%; background-color: #f6e05e; color: #1a202c; padding: 0.85rem; border: none; border-radius: 0.375rem; font-weight: bold; font-size: 1.125rem; cursor: pointer; transition: background-color 0.2s; }
.submit-btn:hover { background-color: #f6d32d; }
.error-message { background-color: #c53030; color: #fff; padding: 1rem; border-radius: 0.375rem; text-align: center; margin-bottom: 1.5rem; }
.success-message { text-align: center; color: #cbd5e0; font-size: 1.1rem; line-height: 1.6; }
.success-message h1 { color: #f6e05e; font-size: 2rem; margin-top: 0; }
.calendar-buttons a { display: inline-block; background-color: #4a5568; color: #e2e8f0; padding: 0.75rem 1.5rem; border-radius: 0.375rem; text-decoration: none; margin: 1rem 0.5rem 0; font-weight: bold; transition: background-color 0.2s; }
.calendar-buttons a:hover { background-color: #5a6578; }
@media (max-width: 768px) { .container { grid-template-columns: 1fr; } }
</style>
</head>
<body>
<div class="container">
<div class="left-pane">
<h1><?= htmlspecialchars($webinar['title']) ?></h1>
<div class="date-time" id="local-date-time">Loading date...</div>
<p class="value-prop"><?= htmlspecialchars($webinar['description']) ?></p>
<div class="speakers">
<h3>Speakers</h3>
<div class="speaker"><img src="assets/images/pexels/22601971.jpg" alt="Philip Daineka"> <span>Philip Daineka</span></div>
<div class="speaker"><img src="assets/images/pexels/34285016.jpg" alt="Alex Rubanau"> <span>Alex Rubanau</span></div>
<div class="speaker"><img src="assets/images/pexels/34238049.jpg" alt="Alexey Vertel"> <span>Alexey Vertel</span></div>
</div>
</div>
<div class="right-pane">
<div class="card">
<?php if ($success_message): ?>
<div class="success-message">
<?= $success_message ?>
<div style="margin-top: 2rem;">
<a href="index.php" style="color: #f6e05e; text-decoration: underline;">Back to Home</a>
</div>
</div>
<?php else: ?>
<?php if ($error_message): ?>
<div class="error-message"><?= htmlspecialchars($error_message) ?></div>
<?php endif; ?>
<form id="registration-form" method="POST" action="register.php?webinar_id=<?= $webinar['id'] ?>">
<h2>Register & Get Calendar Invite</h2>
<div class="form-group">
<label for="email">Email (required)</label>
<input type="email" id="email" name="email" required value="<?= htmlspecialchars($form_data['email'] ?? '') ?>">
</div>
<div class="form-group">
<label for="first_name">First name</label>
<input type="text" id="first_name" name="first_name" required value="<?= htmlspecialchars($form_data['first_name'] ?? '') ?>">
</div>
<div class="form-group">
<label for="last_name">Last name</label>
<input type="text" id="last_name" name="last_name" required value="<?= htmlspecialchars($form_data['last_name'] ?? '') ?>">
</div>
<div class="form-group">
<label for="company">Company</label>
<input type="text" id="company" name="company" value="<?= htmlspecialchars($form_data['company'] ?? '') ?>">
</div>
<div class="form-group">
<label for="how_did_you_hear">How did you hear about this webinar?</label>
<input type="text" id="how_did_you_hear" name="how_did_you_hear" value="<?= htmlspecialchars($form_data['how_did_you_hear'] ?? '') ?>">
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" id="password" name="password" required>
</div>
<div class="form-group">
<label for="confirm_password">Confirm Password</label>
<input type="password" id="confirm_password" name="confirm_password" required>
</div>
<input type="hidden" name="webinar_id" value="<?= $webinar['id'] ?>">
<input type="hidden" name="timezone" id="timezone">
<button type="submit" class="submit-btn">Register Now</button>
</form>
<?php endif; ?>
</div>
</div>
</div>
<script>
// --- TIMEZONE & DATE LOCALIZATION ---
document.getElementById('timezone').value = Intl.DateTimeFormat().resolvedOptions().timeZone;
const webinarDateUTC = '<?= $webinar["scheduled_at"] ?>';
const localDate = new Date(webinarDateUTC + 'Z');
const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric' };
document.getElementById('local-date-time').textContent = localDate.toLocaleDateString(undefined, options);
</script>
</body>
</html>