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 = '
'; foreach ($attachments as $att) { $name = $att['original_name'] ?: basename((string)$att['file_path']); if (isImagePath((string)$att['file_path'])) { $out .= ''.e($name).''; } else { $out .= ''.e($name).''.formatBytes((int)$att['file_size']).''; } } 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, u.avatar_path, (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'; ?>
COMMUNITY FORUM

Keyser Community Forum

Topics and replies from registered members and business owners.

Disabled for non-admins
LATEST TOPICS

Conversations

+

No topics yet

Start the first community conversation.

true, 'files'=>[]]; if (!$errors) { $uploaded = forumStoreAttachments(); if (!$uploaded['ok']) $errors[] = $uploaded['error']; } if (!$errors) { $replyId = qrun("INSERT INTO forum_replies(topic_id,user_id,body)VALUES(?,?,?)", [$topic['id'], uid(), $body]); forumSaveAttachments($uploaded['files'] ?? [], uid(), 0, $replyId); qrun("UPDATE forum_topics SET updated_at=datetime('now') WHERE id=?", [$topic['id']]); flash('Reply posted.', 'success'); go(forumTopicUrl($topic).'#reply-'.$replyId); } } } $topicAttachments = qall("SELECT * FROM forum_attachments WHERE topic_id=? AND reply_id IS NULL ORDER BY created_at", [$topic['id']]); $replies = qall(" SELECT fr.*, u.username, u.avatar_path FROM forum_replies fr JOIN users u ON u.id=fr.user_id WHERE fr.topic_id=? ORDER BY fr.created_at ASC ", [$topic['id']]); $replyAttachments = []; foreach ($replies as $reply) { $replyAttachments[$reply['id']] = qall("SELECT * FROM forum_attachments WHERE reply_id=? ORDER BY created_at", [$reply['id']]); } include __DIR__.'/includes/header.php'; ?>

REPLIES

repl

POST A REPLY
',array_map('e',$errors))?>

This topic is locked.

Allowed: . Max each.