Files
2026-09-08 18:21:10 +01:00

89 lines
3.7 KiB
PHP

<?php
// Admin: add / rename / reorder / lock / delete forums.
require_once __DIR__ . '/../lib/bootstrap.php';
$me = require_admin();
$d = db();
$msg = ''; $err = '';
$edit = (int)($_GET['edit'] ?? 0);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
require_csrf();
$act = $_POST['act'] ?? '';
$fid = (int)($_POST['fid'] ?? 0);
if ($act === 'add') {
$n = mb_substr(trim((string)($_POST['name'] ?? '')), 0, 60);
if ($n === '') $err = 'Forum name required.';
else {
$d->prepare("INSERT INTO forums (name,descr,sort_order) VALUES (?,?,?)")
->execute([$n, mb_substr(trim((string)($_POST['descr'] ?? '')), 0, 120),
(int)($_POST['sort_order'] ?? 0)]);
$msg = 'Forum "' . $n . '" created.';
}
} elseif ($act === 'save' && $fid) {
$n = mb_substr(trim((string)($_POST['name'] ?? '')), 0, 60);
if ($n === '') $err = 'Forum name required.';
else {
$d->prepare("UPDATE forums SET name=?,descr=?,sort_order=?,is_locked=? WHERE id=?")
->execute([$n, mb_substr(trim((string)($_POST['descr'] ?? '')), 0, 120),
(int)($_POST['sort_order'] ?? 0),
(int)($_POST['is_locked'] ?? 0), $fid]);
$msg = 'Forum saved.';
}
} elseif ($act === 'del' && $fid) {
// ON DELETE CASCADE removes its topics and their posts
$d->prepare("DELETE FROM forums WHERE id=?")->execute([$fid]);
$msg = 'Forum and all its topics deleted.';
$edit = 0;
}
}
page_start('Admin: forums', ['back' => '/admin/index.php']);
if ($err) p_err($err);
if ($msg) p_ok($msg);
if ($edit) {
$s = $d->prepare("SELECT * FROM forums WHERE id=?");
$s->execute([$edit]);
$f = $s->fetch();
if (!$f) bail('Admin', 'No such forum.', '/admin/forums.php');
p_para('Editing forum #' . $f['id']);
p_form('/admin/forums.php?edit=' . $edit, [
['name' => 'act', 'type' => 'hidden', 'value' => 'save'],
['name' => 'fid', 'type' => 'hidden', 'value' => (string)$f['id']],
['name' => 'name', 'label' => 'Name', 'value' => $f['name'], 'maxlength' => 60],
['name' => 'descr', 'label' => 'Description', 'value' => $f['descr'], 'maxlength' => 120],
['name' => 'sort_order', 'label' => 'Sort order', 'value' => (string)$f['sort_order'],
'maxlength' => 4, 'format' => '*N'],
['name' => 'is_locked', 'label' => 'Locked', 'type' => 'select',
'value' => (string)$f['is_locked'], 'options' => ['0' => 'no', '1' => 'yes']],
], 'Save forum');
p_form('/admin/forums.php', [
['name' => 'act', 'type' => 'hidden', 'value' => 'del'],
['name' => 'fid', 'type' => 'hidden', 'value' => (string)$f['id']],
], 'DELETE forum');
p_links([['/admin/forums.php', 'Back to forum list']]);
page_end();
exit;
}
$rows = $d->query("SELECT f.*, (SELECT COUNT(*) FROM topics t WHERE t.forum_id=f.id) tc
FROM forums f ORDER BY f.sort_order, f.id")->fetchAll();
foreach ($rows as $r) {
p_link('/admin/forums.php', '#' . $r['id'] . ' ' . $r['name'] . ' (' . $r['tc'] . 't)'
. ($r['is_locked'] ? ' [locked]' : ''), ['edit' => $r['id']]);
}
if (!$rows) p_para('No forums.');
p_rule();
p_para('Add a forum:');
p_form('/admin/forums.php', [
['name' => 'act', 'type' => 'hidden', 'value' => 'add'],
['name' => 'name', 'label' => 'Name', 'maxlength' => 60],
['name' => 'descr', 'label' => 'Description', 'maxlength' => 120],
['name' => 'sort_order', 'label' => 'Sort order', 'value' => '0',
'maxlength' => 4, 'format' => '*N'],
], 'Add forum');
p_links([['/admin/index.php', 'Admin home']]);
page_end();