diff --git a/public/manage/forum.php b/public/manage/forum.php new file mode 100644 index 00000000..629befc4 --- /dev/null +++ b/public/manage/forum.php @@ -0,0 +1,70 @@ +bindValue('forum_id', (int)($_GET['f'] ?? 0)); + $forum = $getForum->execute() ? $getForum->fetch(PDO::FETCH_ASSOC) : false; + + if (!$forum) { + echo render_error(404); + break; + } + + $roles = Database::query('SELECT `role_id`, `role_name` FROM `msz_roles`')->fetchAll(PDO::FETCH_ASSOC); + $perms = manage_forum_perms_list(forum_perms_get_role_raw($forum['forum_id'], null)); + + echo tpl_render('manage.forum.forum', compact('forum', 'roles', 'perms')); + break; + + case 'forumperms': + $getRole = Database::prepare(' + SELECT `role_id`, `role_name` + FROM `msz_roles` + WHERE `role_id` = :role_id + '); + $getRole->bindValue('role_id', (int)($_GET['r'] ?? 0)); + $role = $getRole->execute() ? $getRole->fetch(PDO::FETCH_ASSOC) : false; + + if (!$role) { + echo render_error(404); + break; + } + + $forumId = empty($_GET['f']) ? null : (int)($_GET['f'] ?? 0); + + if ($forumId) { + $getForum = Database::prepare(' + SELECT `forum_name` + FROM `msz_forum_categories` + WHERE `forum_id` = :forum_id + '); + $getForum->bindValue('forum_id', $forumId); + $forum = $getForum->execute() ? $getForum->fetch(PDO::FETCH_ASSOC) : false; + + if (!$forum) { + echo render_error(404); + break; + } + + tpl_var('forum', $forum); + } + + $perms = manage_forum_perms_list(forum_perms_get_role_raw($forumId, $role['role_id'])); + + echo tpl_render('manage.forum.forumperms', compact('role', 'perms')); + break; +} diff --git a/src/Forum/perms.php b/src/Forum/perms.php index eef59377..7eb2d6cd 100644 --- a/src/Forum/perms.php +++ b/src/Forum/perms.php @@ -20,7 +20,7 @@ function forum_perms_get_keys(): array return $perms; } -function forum_perms_create(): int +function forum_perms_create(): array { $perms = []; @@ -131,28 +131,34 @@ function forum_perms_get_user_raw(?int $forum, int $user): array return $perms; } -function forum_perms_get_role_raw(?int $forum, int $role): array +function forum_perms_get_role_raw(?int $forum, ?int $role): array { $emptyPerms = forum_perms_create(); - if ($role < 1) { + if ($role < 1 && $role !== null) { return $emptyPerms; } - $getPerms = Database::prepare(sprintf(' - SELECT - `' . implode('`, `', forum_perms_get_keys()) . '` - FROM `msz_forum_permissions` - WHERE `forum_id` %s - AND `user_id` IS NULL - AND `role_id` = :role_id - ', $forum === null ? 'IS NULL' : '= :forum_id')); + $getPerms = Database::prepare(sprintf( + ' + SELECT + `' . implode('`, `', forum_perms_get_keys()) . '` + FROM `msz_forum_permissions` + WHERE `forum_id` %s + AND `user_id` IS NULL + AND `role_id` %s + ', + $forum === null ? 'IS NULL' : '= :forum_id', + $role === null ? 'IS NULL' : '= :role_id' + )); if ($forum !== null) { $getPerms->bindValue('forum_id', $forum); } - $getPerms->bindValue('role_id', $role); + if ($role !== null) { + $getPerms->bindValue('role_id', $role); + } if (!$getPerms->execute()) { return $emptyPerms; diff --git a/src/manage.php b/src/manage.php index 2e8128e4..aa4a388d 100644 --- a/src/manage.php +++ b/src/manage.php @@ -55,15 +55,11 @@ function manage_get_menu(int $userId): array } if (perms_check($perms['forum'], MSZ_PERM_FORUM_MANAGE_FORUMS)) { - $menu['Forums']['Listing'] = '/manage/forums.php?v=listing'; + $menu['Forum']['Listing'] = '/manage/forum.php?v=listing'; } if (perms_check($perms['forum'], 0)) { - $menu['Forums']['Permissions'] = '/manage/forums.php?v=permissions'; - } - - if (perms_check($perms['forum'], 0)) { - $menu['Forums']['Settings'] = '/manage/forums.php?v=settings'; + $menu['Forum']['Settings'] = '/manage/forum.php?v=settings'; } if (perms_check($perms['changelog'], MSZ_PERM_CHANGELOG_MANAGE_CHANGES)) { @@ -442,3 +438,155 @@ function manage_perms_list(array $rawPerms): array ], ]; } + +function manage_forum_perms_list(array $rawPerms): array +{ + return [ + [ + 'section' => 'forum', + 'title' => 'Forum', + 'perms' => [ + [ + 'section' => 'can-list', + 'title' => 'Can see the forum listed, but not access it.', + 'perm' => MSZ_FORUM_PERM_LIST_FORUM, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_LIST_FORUM, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-view', + 'title' => 'Can view and access the forum.', + 'perm' => MSZ_FORUM_PERM_VIEW_FORUM, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_VIEW_FORUM, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-create-topic', + 'title' => 'Can create topics.', + 'perm' => MSZ_FORUM_PERM_CREATE_TOPIC, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_CREATE_TOPIC, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-delete-topic', + 'title' => 'Can delete topics (required a post delete permission).', + 'perm' => MSZ_FORUM_PERM_DELETE_TOPIC, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_DELETE_TOPIC, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-move-topic', + 'title' => 'Can move topics between forums.', + 'perm' => MSZ_FORUM_PERM_MOVE_TOPIC, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_MOVE_TOPIC, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-lock-topic', + 'title' => 'Can lock topics.', + 'perm' => MSZ_FORUM_PERM_LOCK_TOPIC, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_LOCK_TOPIC, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-sticky-topic', + 'title' => 'Can make topics sticky.', + 'perm' => MSZ_FORUM_PERM_STICKY_TOPIC, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_STICKY_TOPIC, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-announce-topic', + 'title' => 'Can make topics announcements.', + 'perm' => MSZ_FORUM_PERM_ANNOUNCE_TOPIC, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_ANNOUNCE_TOPIC, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-global-announce-topic', + 'title' => 'Can make topics global announcements.', + 'perm' => MSZ_FORUM_PERM_GLOBAL_ANNOUNCE_TOPIC, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_GLOBAL_ANNOUNCE_TOPIC, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-create-post', + 'title' => 'Can make posts (reply only, if create topic is disallowed).', + 'perm' => MSZ_FORUM_PERM_CREATE_POST, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_CREATE_POST, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-edit-post', + 'title' => 'Can edit their own posts.', + 'perm' => MSZ_FORUM_PERM_EDIT_POST, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_EDIT_POST, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-edit-any-post', + 'title' => 'Can edit any posts.', + 'perm' => MSZ_FORUM_PERM_EDIT_ANY_POST, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_EDIT_ANY_POST, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-delete-post', + 'title' => 'Can delete own posts.', + 'perm' => MSZ_FORUM_PERM_DELETE_POST, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_DELETE_POST, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + [ + 'section' => 'can-delete-any-post', + 'title' => 'Can delete any posts.', + 'perm' => MSZ_FORUM_PERM_DELETE_ANY_POST, + 'value' => manage_perms_value( + MSZ_FORUM_PERM_DELETE_ANY_POST, + $rawPerms['forum_perms_allow'], + $rawPerms['forum_perms_deny'] + ), + ], + ], + ], + ]; +} diff --git a/templates/manage/forum/forum.twig b/templates/manage/forum/forum.twig new file mode 100644 index 00000000..aef3f490 --- /dev/null +++ b/templates/manage/forum/forum.twig @@ -0,0 +1,25 @@ +{% extends 'manage/users/master.twig' %} +{% from 'manage/macros.twig' import permissions_table %} + +{% block manage_content %} +