Тема оказалась очень популярной в инете, сам phpbb юзал, но вот интегрировать с cms не приходилось. ББ оказалась заразой редкостной, в сети куча рецептов, но почему-то с phpbb 3, который стоит у меня не срабатывали, удалось на буржуйском сайте найти рецепт, который после напильника заработал у меня. Еще кстати очень полезный в этом деле ресурс https://wiki.phpbb.com
Итак, что мне надо от этой интеграции:
- чтобы при регистрации на сайте юзеры попадали в базу cms и в базу phpbb
- при авторизации на сайте юзер авторизовывался и на форуме
- при выходе на сайте, выходил бы и на форуме
Первый пункт оказался самым простым, чтобы добавить грамотно юзера в базу надо сделать 2 запроса в базу:
$user_actkey = md5(rand(0, 100) . time()); $user_actkey = substr($user_actkey, 0, rand(8, 12)); $sql = "INSERT INTO `phpbb_users` (`user_type`, `group_id`, `user_perm_from`, `user_ip`, `user_regdate`, `username`, `username_clean`, `user_password`, `user_passchg`, `user_pass_convert`, `user_email`, `user_email_hash`, `user_birthday`, `user_lastvisit`, `user_lastmark`, `user_lastpost_time`, `user_lastpage`, `user_last_confirm_key`, `user_last_search`, `user_warnings`,`user_last_warning`,`user_login_attempts`, `user_inactive_reason`, `user_inactive_time`, `user_posts`, `user_lang`, `user_timezone`,`user_dst`, `user_dateformat`, `user_style`, `user_rank`, `user_colour`, `user_new_privmsg`, `user_unread_privmsg`, `user_last_privmsg`, `user_message_rules`, `user_full_folder`, `user_emailtime`, `user_topic_show_days`, `user_topic_sortby_type`, `user_topic_sortby_dir`, `user_post_show_days`, `user_post_sortby_type`, `user_post_sortby_dir`, `user_notify`, `user_notify_pm`, `user_notify_type`, `user_allow_pm`, `user_allow_viewonline`, `user_allow_viewemail`, `user_allow_massemail`, `user_options`, `user_avatar`, `user_avatar_type`, `user_avatar_width`, `user_avatar_height`,`user_sig`, `user_sig_bbcode_uid`, `user_sig_bbcode_bitfield`, `user_from`, `user_icq`, `user_aim`, `user_yim`, `user_msnm`, `user_jabber`, `user_website`, `user_occ`, `user_interests`, `user_actkey`,`user_newpasswd`, `user_form_salt`, `user_new`, `user_reminded`, `user_reminded_time`) VALUES ( 0, 2, 0, '{$_SERVER['REMOTE_ADDR']}', {$time}, '".CMS::addslashes($_POST['userLogin'])."', '".CMS::addslashes($_POST['userLogin'])."', '".md5($_POST['userPassword'])."', {$time}, 0, '".CMS::addslashes($_POST['userEmail'])."', ".sprintf('%u', crc32(strtolower($_POST['userEmail']))) . strlen($_POST['userEmail']).", '', {$time},{$time}, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 'ru', 0.00, 0, '|d M Y|, H:i', 1, 0, '', 0, 0, 0, 0, -3, 0, 0, 't', 'd', 0, 't', 'a', 0, 1, 0, 1, 1, 1, 1, 230271, '', 0, 0, 0, '', '', '', '', '', '', '', '', '', '', '', '', '{$user_actkey}', '', 'badb8e6fcb48bb00', 1, 0, 0); "; $db1 -> QueryExec( $sql ); $id = mysql_insert_id(); $sql = "INSERT INTO `phpbb_user_group` (`group_id`, `user_id`, `group_leader`, `user_pending`) VALUES (2, {$id}, 0, 0), (7, {$id}, 0, 0)"; $db1 -> QueryExec( $sql );
Во втором запросе group_id = 2 и 7, в вашем случае могут быть другие айдишники, у меня это айдишники из таблицы phpbb_groups, соответствуют группам REGISTERED и NEWLY_REGISTERED.
Дальше идет интеграция авторизации CMS с авторизацией форума phpBB:
Пишем функцию, да, именно функцию, иначе могут быть проблемы.
function login($id){ define('IN_PHPBB', true); global $db, $cache, $config, $user, $phpbb_root_path, $phpEx; $phpbb_root_path = [тут путь к папке с форумом].'/forum/'; $phpEx = "php"; include_once($phpbb_root_path.'common.'.$phpEx); $user->session_begin(); //Signin automaticly for phpBB3 $user->session_create($id, true, true, true); return true; }
Перед вызовом функции делаете запрос в базу, для получения id юзера:
$sql = "SELECT user_id FROM phpbb_users WHERE username='".addslashes($_POST['login'])."'"; $res = $db1 -> Query($sql); if( $db1 -> max > 0 ) { login( $res[0]['user_id'] ); }
Поздравляю, вы авторизованы.
Теперь надо как то сделать общий выход. Пишем еще одну функцию:
function loginout(){ define('IN_PHPBB', true); global $db, $cache, $config, $user, $phpbb_root_path, $phpEx; $phpbb_root_path = $phpbb_root_path = [тут путь к папке с форумом].'/forum/'; $phpEx = "php"; include_once($phpbb_root_path.'common.'.$phpEx); $user->session_kill(); return true; }
Все готово, все 3 пункта выполнены, на этот левел ап у меня ушло 4 часа.