= htmlspecialchars($t['title'], ENT_QUOTES) ?>
+= nl2br(htmlspecialchars(substr($t['body'], 0, 240), ENT_QUOTES)) ?>= strlen($t['body']) > 240 ? '…' : '' ?>
+Antworten: = (int)$t['answers'] ?>
+diff --git a/partials/structure/nav.php b/partials/structure/nav.php
index 7702d57..50f10a3 100644
--- a/partials/structure/nav.php
+++ b/partials/structure/nav.php
@@ -16,6 +16,7 @@ $isDebug = defined('APP_DEBUG') && APP_DEBUG === true;
Start
Events
Suche
+ Community
Profil
FAQ
@@ -37,6 +38,7 @@ $isDebug = defined('APP_DEBUG') && APP_DEBUG === true;
Start
Events
Suche
+ Community
Profil
FAQ
diff --git a/public/page/community.php b/public/page/community.php
new file mode 100644
index 0000000..e51433c
--- /dev/null
+++ b/public/page/community.php
@@ -0,0 +1,129 @@
+pdo();
+$userId = $_SESSION['user_id'] ?? null;
+$error = '';
+
+if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'thread_create') {
+ if (!$userId) {
+ $error = 'Bitte einloggen, um Fragen zu stellen.';
+ } elseif ($pdo) {
+ $title = trim((string)($_POST['title'] ?? ''));
+ $body = trim((string)($_POST['body'] ?? ''));
+ if ($title === '' || $body === '') {
+ $error = 'Titel und Text sind erforderlich.';
+ } else {
+ $pdo->prepare('CREATE TABLE IF NOT EXISTS forum_threads (
+ id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
+ user_id BIGINT UNSIGNED NOT NULL,
+ title VARCHAR(200) NOT NULL,
+ body TEXT NOT NULL,
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci')->execute();
+ $pdo->prepare('INSERT INTO forum_threads (user_id, title, body) VALUES (:uid, :title, :body)')
+ ->execute(['uid' => $userId, 'title' => $title, 'body' => $body]);
+ header('Location: /community');
+ exit;
+ }
+ }
+}
+
+$threads = [];
+if ($pdo) {
+ $pdo->prepare('CREATE TABLE IF NOT EXISTS forum_posts (
+ id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
+ thread_id BIGINT UNSIGNED NOT NULL,
+ user_id BIGINT UNSIGNED NOT NULL,
+ body TEXT NOT NULL,
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ INDEX idx_thread (thread_id)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci')->execute();
+
+ $sql = 'SELECT ft.id, ft.title, ft.body, ft.created_at,
+ u.id as uid, u.created_at as user_created,
+ p.display_name,
+ (SELECT COUNT(*) FROM forum_posts fp WHERE fp.thread_id = ft.id) AS answers,
+ (SELECT COUNT(*) FROM forum_posts fp2 WHERE fp2.user_id = u.id) +
+ (SELECT COUNT(*) FROM forum_threads ft2 WHERE ft2.user_id = u.id) AS user_posts
+ FROM forum_threads ft
+ JOIN users u ON u.id = ft.user_id
+ LEFT JOIN user_profiles p ON p.user_id = u.id
+ ORDER BY ft.created_at DESC
+ LIMIT 50';
+ $threads = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC) ?: [];
+}
+
+function compute_points(array $row, \PDO $pdo): float {
+ $uid = (int)$row['uid'];
+ $threads = (int)($row['user_posts'] ?? 0);
+ $answers = (int)($row['answers'] ?? 0);
+ $eventCreated = (int)$pdo->query("SELECT COUNT(*) FROM events WHERE created_by = {$uid}")->fetchColumn();
+ $eventParticipants = (float)$pdo->query("SELECT COUNT(*) FROM event_participants WHERE user_id = {$uid}")->fetchColumn();
+ $invites = 0;
+ return $threads * 0.5 + $answers * 1 + $eventCreated * 1 + $eventParticipants * 0.1 + $invites * 0.5;
+}
+
+function membership_level(float $points): string {
+ if ($points >= 1000) return 'Daddy of Daddies';
+ if ($points >= 300) return 'Master Daddy';
+ if ($points >= 150) return 'Good Daddy';
+ if ($points >= 50) return 'Mini Daddy';
+ if ($points >= 5) return 'Baby Daddy';
+ return 'New Daddy';
+}
+?>
+ Community Bitte einloggen, um Fragen zu stellen oder zu antworten. = nl2br(htmlspecialchars(substr($t['body'], 0, 240), ENT_QUOTES)) ?>= strlen($t['body']) > 240 ? '…' : '' ?> Antworten: = (int)$t['answers'] ?> Noch keine Fragen gestellt.Forum
+
+
+
+
+
+
+
+ = htmlspecialchars($t['title'], ENT_QUOTES) ?>
+
Thread nicht gefunden.
'); +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'reply') { + if (!$userId) { + $error = 'Bitte einloggen, um zu antworten.'; + } elseif ($pdo) { + $body = trim((string)($_POST['body'] ?? '')); + if ($body === '') { + $error = 'Antwort darf nicht leer sein.'; + } else { + $pdo->prepare('INSERT INTO forum_posts (thread_id, user_id, body) VALUES (:tid, :uid, :body)') + ->execute(['tid' => $id, 'uid' => $userId, 'body' => $body]); + header('Location: /community_thread?id=' . $id); + exit; + } + } +} + +$thread = null; +$posts = []; +if ($pdo) { + $stmt = $pdo->prepare('SELECT ft.*, p.display_name FROM forum_threads ft LEFT JOIN user_profiles p ON p.user_id = ft.user_id WHERE ft.id = :id'); + $stmt->execute(['id' => $id]); + $thread = $stmt->fetch(PDO::FETCH_ASSOC); + if ($thread) { + $stmt = $pdo->prepare('SELECT fp.*, p.display_name FROM forum_posts fp LEFT JOIN user_profiles p ON p.user_id = fp.user_id WHERE fp.thread_id = :id ORDER BY fp.created_at ASC'); + $stmt->execute(['id' => $id]); + $posts = $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; + } +} + +if (!$thread) { + http_response_code(404); + exit('Thread nicht gefunden.
'); +} +?> +Community
+Von = htmlspecialchars($thread['display_name'] ?: 'Mitglied', ENT_QUOTES) ?> · = htmlspecialchars($thread['created_at'], ENT_QUOTES) ?>
+= nl2br(htmlspecialchars($thread['body'], ENT_QUOTES)) ?>
+= nl2br(htmlspecialchars($p['body'], ENT_QUOTES)) ?>
+Noch keine Antworten.
+ +Bitte einloggen, um zu antworten.
+ += htmlspecialchars($ev['teaser_public'], ENT_QUOTES) ?>
-Kinder: = ((int)$ev['allow_kids'] === 1) ? 'Mit Kindern' : 'Ohne Kinder' ?>
-Ort: = htmlspecialchars($ev['location_label'], ENT_QUOTES) ?>
+Ort: = htmlspecialchars($ev['location_label'], ENT_QUOTES) ?>