89 lines
3.7 KiB
PHP
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();
|