ну что нужно выбрать в данном случае? - ФОрумы которые текущий юзер имеет право - ЧИТАТЬ. чтобы показать ему список доступных. так? получается что через LEFT JOIN exbb_access ON (exbb_access.forum_id=exbb_forums.forum_id AND exbb_access.access_name='read' ) тут смотря как у вас хранятся связи. групп и типов доступа.
Николай12, может я чего-то не понял, но всех движках есть система прав и права, ясный пень, в отдельных таблицах. достаточно одного запроса с джойном чтобы права были учтены. например punbb/fluxbb (и вероятно phpbb от которого они идейно набрались): выбрать все форумы, на которые есть право чтения (forum_perms.read_forum = 1 или такая запись отсутствует, т.е. по умолчанию право есть) Код (Text): SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name FROM categories AS c INNER JOIN forums AS f ON c.id=f.cat_id LEFT JOIN forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=:g_id) WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position
Теперь использую вот такую конструкцию: Код (Text): public function getForums($cat_id=false) { $where = ($cat_id != false) ? db::parse('WHERE cat_id=?i', $cat_id) : ''; $allForums = db::getInd('id', 'SELECT exbb_forums.*, exbb_access.access_value FROM exbb_forums LEFT JOIN exbb_access ON (exbb_access.forum_id=exbb_forums.id AND exbb_access.access_name="view_forum" AND exbb_access.group_id=?i) ?p ORDER BY position', core::$user->getGroupId(), $where); $this->subForums = array(); foreach ($allForums as $id => $forum) { if ((is_null($forum['access_value']) && Rights::$default['view_forum'] != 1) || $forum['access_value'] == 0) unset($allForums[$id]); if ($forum['parent_id'] != -1) { $this->subForums[$forum['parent_id']][$id] = $forum; unset($allForums[$id]); } } return $allForums; } Сам SQL-запрос: Код (Text): SELECT exbb_forums.*, exbb_access.access_value FROM exbb_forums LEFT JOIN exbb_access ON (exbb_access.forum_id=exbb_forums.id AND exbb_access.access_name="view_forum" AND exbb_access.group_id=ID_группы) тут WHERE (если выбирается только одна категория) ORDER BY position С 33запросов уменьшилось до 18. Добавлено спустя 5 минут 58 секунд: если кому интересно, можно скачать полный модуль главной страницы (где выводятся все категории и форумы) отдельно. http://exbb.pw/index.php?a=topic/getattach&id=1 Добавлено спустя 2 минуты 44 секунды: Может так делать неправильно, но у меня есть возможность указать, будет ли доступ если запись отсутствует для конкретного форума. Т.е. права по умолчанию. Хранятся тоже в таблице exbb_access но в поле forum_id у них стоит 0
таблица exbb_access - в таблице хранятся права доступа для групп таблица exbb_groups - в таблице хранится информация о группах пользователей. - поле admin_access - имеет ли доступ в админ-панель (0 - нет, 1 - да) зачем это поле(admin_access) сделано отдельным? ведь есть таблица для описания всех видов доступа. может логичнее там описать права доступа в админ панель? exbb_forums - в таблице хранится информация о форумах поле read_data - массив пользователей, которые прочитали форум. WHAT? тоесть там лежат айдишники ВСЕХ кто прочитал форум? ужасть
это временно. Пока не найду более правильного и быстрого способа. При добавлении сообщения или создания новой темы в форуме поле очищается
Теперь при нажатии на цифру с количеством SQL запросов ( SQL Queries: Цифра - внизу страницы) открывается такое окно со статистикой запросов: Добавлено спустя 6 минут 26 секунд: На exbb.pw почему-то неверно считается время выполнения SQL запроса вот так Код (Text): $start = microtime(true); $res = mysqli_query(self::$conn, $query); $end = microtime(true); $time = $end - $start; выходят такие результаты: Код (Text): [2] => Array ( [query] => SELECT option_value FROM exbb_options WHERE option_name='forum_title' [time] => 7.1048736572266E-5 [t] => 1401891227.5286 - 1401891227.5285 )
Спасибо) Помогло! Код (Text): [1] => Array ( [query] => SELECT option_value FROM exbb_options WHERE option_name='url' [time] => 0.00007 сек. [t] => 1401900019.235 - 1401900019.235 ) [2] => Array ( [query] => SELECT option_value FROM exbb_options WHERE option_name='forum_title' [time] => 0.00008 сек. [t] => 1401900019.2357 - 1401900019.2356 ) [3] => Array ( [query] => SELECT option_value FROM exbb_options WHERE option_name='default_template' [time] => 0.00006 сек. [t] => 1401900019.2358 - 1401900019.2357 ) [4] => Array ( [query] => SELECT * FROM exbb_users WHERE id=0 [time] => 0.00008 сек. [t] => 1401900019.2367 - 1401900019.2366 ) [5] => Array ( [query] => SELECT * FROM exbb_groups WHERE id=1 [time] => 0.00007 сек. [t] => 1401900019.2373 - 1401900019.2372 ) только время какое-то слишком маленькое получается. На самом деле запросы так быстро выполняются?
Ну а ты думал. Коннект к базе открывается "дорого", а запросы, тем более такие как у тебя, считай бесплатны.
Сделал нормальный профиль пользователя, исправил несколько багов, сделал модуль "Объявления на форуме"
Сделал новый Bootstrap шаблон админки, который теперь будет использоваться по-умолчанию. Возможна смена цветовых тем оформления. Скрины здесь: http://exbb.pw/index.php?a=announcements/index&
За прошедшее время сделал в своём движке много всего нового! http://exbb.pw/topics/10-page1.html А сегодня выложил новую версию, там огромное количество изменений!
Выложил новую версию движка и 2 плагина к ней: новый редактор BB кодов и мульти-загрузку файлов оба устанавливаются без правки кода