Главная > Новости > Интеграция phpbb со своей CMS

Интеграция phpbb со своей CMS

Тема оказалась очень популярной в инете, сам phpbb юзал, но вот интегрировать с cms не приходилось. ББ оказалась заразой редкостной, в сети куча рецептов, но почему-то с phpbb 3, который стоит у меня не срабатывали, удалось на буржуйском сайте найти рецепт, который после напильника заработал у меня. Еще кстати очень полезный в этом деле ресурс http://wiki.phpbb.com
Итак, что мне надо от этой интеграции:

  1. чтобы при регистрации на сайте юзеры попадали в базу cms и в базу phpbb
  2. при авторизации на сайте юзер авторизовывался и на форуме
  3. при выходе на сайте, выходил бы и на форуме

Первый пункт оказался самым простым, чтобы добавить грамотно юзера в базу надо сделать 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 часа.

Поделиться в соц. сетях

Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
  1. Руслан
    5 Ноябрь 2010 в 14:45 | #1

    а какие библиотеки нужно подключать что бы эти функции работали ?

  2. admin
    5 Ноябрь 2010 в 17:20 | #2

    @Руслан
    никаких, в моем примере приведен пример моего кода, там используются мой класс работы с базой данных и мои дополнительные фции (класс CMS), но их не сложно заменить на свои, там всего в двух местах. все остальное, что нужно бб, он подтянет сам, для этого там есть include_once($phpbb_root_path.’common.’.$phpEx);.

  3. 24 Декабрь 2010 в 02:11 | #3

    Огромное спасибо, Вы мне очень помогли. Очень просто и понятно!

  4. 2 Октябрь 2011 в 19:49 | #4

    $db1 -> QueryExec( $sql );
    $id = mysql_insert_id();

    Обрати внимание в первой строке универсальный обработчик sql во второй – нет.

  5. 17 Август 2013 в 08:21 | #5

    Большое спасибо, статья очень помогла, коротко и ясно, без всякой ваты! =)

  6. Alex
    1 Март 2015 в 19:28 | #6

    Здравствуйте!
    Объясните пожалуйста начинающему в phpBB
    в каких файлах необходимо вносить изменения?

*