123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- <?php
- /**
- * This file is part of the ForkBB <https://github.com/forkbb>.
- *
- * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
- * @license The MIT License (MIT)
- */
- declare(strict_types=1);
- namespace ForkBB\Models\Group;
- use ForkBB\Models\Action;
- use ForkBB\Models\Forum\Forum;
- use ForkBB\Models\Group\Group;
- use PDO;
- use RuntimeException;
- class Perm extends Action
- {
- /**
- * @var array
- */
- protected $fields;
- /**
- * Получение таблицы разрешений для раздела
- */
- public function get(Forum $forum): array
- {
- $vars = [
- ':fid' => $forum->id > 0 ? $forum->id : 0,
- ':adm' => FORK_GROUP_ADMIN,
- ];
- $query = 'SELECT g.g_id, fp.read_forum, fp.post_replies, fp.post_topics
- FROM ::groups AS g
- LEFT JOIN ::forum_perms AS fp ON (g.g_id=fp.group_id AND fp.forum_id=?i:fid)
- WHERE g.g_id!=?i:adm
- ORDER BY g.g_id';
- $perms = $this->c->DB->query($query, $vars)->fetchAll(PDO::FETCH_UNIQUE);
- $result = [];
- foreach ($perms as $gid => $perm) {
- $group = $this->c->groups->get($gid);
- # $forums = $this->c->ForumManager->init($group);
- # $group->g_read_forum = (int) ($forums->get($forum->id) instanceof Forum);
- $group->g_read_forum = $group->g_read_board;
- foreach ($perm as $field => $value) {
- $group->{'fp_' . $field} = $value;
- $group->{'set_' . $field} = (1 === $group->{'g_' . $field} && 0 !== $value) || 1 === $value;
- $group->{'def_' . $field} = 1 === $group->{'g_' . $field};
- $group->{'dis_' . $field} = 0 === $group->g_read_board || ('read_forum' !== $field && $forum->redirect_url);
- }
- $result[$gid] = $group;
- }
- $this->fields = \array_keys($perm);
- return $result;
- }
- /**
- * Обновление разрешений для раздела
- */
- public function update(Forum $forum, array $perms): void
- {
- if ($forum->id < 1) {
- throw new RuntimeException('The forum does not have ID');
- }
- foreach ($this->get($forum) as $id => $group) {
- if (0 === $group->g_read_board) {
- continue;
- }
- $row = [];
- $modDef = false;
- $modPerm = false;
- foreach ($this->fields as $field) {
- if ($group->{'dis_' . $field}) {
- $row[$field] = $group->{'set_' . $field} ? 1 : 0;
- $modDef = $row[$field] !== $group->{'g_' . $field} ? true : $modDef;
- } else {
- $row[$field] = empty($perms[$id][$field]) ? 0 : 1;
- $modDef = $row[$field] !== $group->{'g_' . $field} ? true : $modDef;
- $modPerm = $row[$field] !== (int) $group->{'set_' . $field} ? true : $modPerm;
- }
- }
- if (
- $modDef
- || $modPerm
- ) {
- $vars = [
- ':gid' => $id,
- ':fid' => $forum->id,
- ];
- $query = 'DELETE
- FROM ::forum_perms
- WHERE group_id=?i:gid AND forum_id=?i:fid';
- $this->c->DB->exec($query, $vars);
- }
- if ($modDef) {
- $vars = \array_values($row);
- $vars[] = $id;
- $vars[] = $forum->id;
- $list = \array_keys($row);
- $list[] = 'group_id';
- $list[] = 'forum_id';
- $list2 = \array_fill(0, \count($list), '?i');
- $list = \implode(', ', $list);
- $list2 = \implode(', ', $list2);
- $query = "INSERT INTO ::forum_perms ({$list})
- VALUES ({$list2})";
- $this->c->DB->exec($query, $vars);
- }
- }
- }
- /**
- * Сброс разрешений для раздела
- */
- public function reset(Forum $forum): void
- {
- if ($forum->id < 1) {
- throw new RuntimeException('The forum does not have ID');
- }
- $vars = [
- ':fid' => $forum->id,
- ];
- $query = 'DELETE
- FROM ::forum_perms
- WHERE forum_id=?i:fid';
- $this->c->DB->exec($query, $vars);
- }
- /**
- * Удаление разрешений для группы
- */
- public function delete(Group $group): void
- {
- if ($group->g_id < 1) {
- throw new RuntimeException('The group does not have ID');
- }
- $vars = [
- ':gid' => $group->g_id,
- ];
- $query = 'DELETE
- FROM ::forum_perms
- WHERE group_id=?i:gid';
- $this->c->DB->exec($query, $vars);
- }
- /**
- * Копирование разрешений первой группы во вторую
- */
- public function copy(Group $from, Group $to): void
- {
- if (
- $from->g_id < 1
- || $to->g_id < 1
- ) {
- throw new RuntimeException('The group does not have ID');
- }
- $this->delete($to);
- $vars = [
- ':old' => $from->g_id,
- ':new' => $to->g_id,
- ];
- $query = 'INSERT INTO ::forum_perms (group_id, forum_id, read_forum, post_replies, post_topics)
- SELECT ?i:new, forum_id, read_forum, post_replies, post_topics
- FROM ::forum_perms
- WHERE group_id=?i:old';
- $this->c->DB->exec($query, $vars);
- }
- }
|