mbToBytes(setting('forum_image_resize_threshold_mb','1'), 1), 'image_max_width' => (int)setting('forum_image_max_width','1600'), 'image_quality' => (int)setting('forum_image_quality','82'), ]; } function forumStoreAttachments(): array { return storeMultipleUploads( 'attachments', 'forum', forumAllowedExts(), mbToBytes(setting('forum_upload_max_mb','5'), 5), forumUploadOpts() ); } function forumSaveAttachments(array $files, int $userId, int $topicId = 0, int $replyId = 0): void { foreach ($files as $file) { qrun( "INSERT INTO forum_attachments(topic_id,reply_id,user_id,file_path,original_name,mime_type,file_size)VALUES(?,?,?,?,?,?,?)", [$topicId ?: null, $replyId ?: null, $userId, $file['path'], $file['name'] ?? '', $file['mime'] ?? '', (int)($file['size'] ?? 0)] ); } } function forumAttachmentList(array $attachments): string { if (!$attachments) return ''; $out = '
'; } function forumText(string $text): string { return nl2br(e($text)); } $errors = []; $allowedHint = implode(', ', forumAllowedExts()); $maxHint = setting('forum_upload_max_mb','5').' MB'; if ($topicSlug === '') { if (isPost() && ps('_act') === 'create_topic') { csrfCheck(); $title = ps('title'); $body = ps('body'); $catId = (int)p('category_id'); $cat = qone("SELECT * FROM forum_categories WHERE id=? AND is_active=1", [$catId]); if ($title === '') $errors[] = 'Topic title is required.'; if ($body === '') $errors[] = 'Topic body is required.'; if (!$cat) $errors[] = 'Please choose a forum category.'; $uploaded = ['ok'=>true, 'files'=>[]]; if (!$errors) { $uploaded = forumStoreAttachments(); if (!$uploaded['ok']) $errors[] = $uploaded['error']; } if (!$errors) { $tempSlug = 'draft-'.bin2hex(random_bytes(8)); $topicId = qrun( "INSERT INTO forum_topics(category_id,user_id,title,slug,body)VALUES(?,?,?,?,?)", [$catId, uid(), $title, $tempSlug, $body] ); $slug = uniqueForumSlug($title, $topicId); qrun("UPDATE forum_topics SET slug=? WHERE id=?", [$slug, $topicId]); forumSaveAttachments($uploaded['files'] ?? [], uid(), $topicId, 0); flash('Topic posted.', 'success'); go(forumTopicUrl(['slug'=>$slug])); } } $categories = qall("SELECT * FROM forum_categories WHERE is_active=1 ORDER BY sort_order,name"); $topics = qall(" SELECT ft.*, fc.name category_name, u.username, (SELECT COUNT(*) FROM forum_replies fr WHERE fr.topic_id=ft.id) AS reply_count, COALESCE((SELECT MAX(fr.created_at) FROM forum_replies fr WHERE fr.topic_id=ft.id), ft.created_at) AS last_activity FROM forum_topics ft JOIN forum_categories fc ON fc.id=ft.category_id JOIN users u ON u.id=ft.user_id ORDER BY ft.is_pinned DESC, datetime(last_activity) DESC "); include __DIR__.'/includes/header.php'; ?>Topics and replies from registered members and business owners.
Start the first community conversation.
This topic is locked.