Интеграция с PunBB

Скрещиваем LiveStreet и PunBB

Итак, что имеем:
1) LiveStreet, установлен в /
2) PunBB, установлен в /forum/
3) База одна и та же

Итак, начнем.
В файл /classes/modules/user/User.class.php в функцию Authorization добавляем


/**=================================
 *	PunBB Integration
 *==================================*/
define('FORUM_ROOT', '/var/www/forum/'); // а здесь у нас директория с форумом, полный путь
require_once FORUM_ROOT.'config.php';
require_once FORUM_ROOT.'include/dblayer/common_db.php';
require_once FORUM_ROOT.'include/functions.php';

$login = $oUser->getLogin();
$myhash = md5($oUser->getPassword().'abacabadabacabaeabacabadabacaba'); //сюда НАДО БЫ вписать что-нибудь уникальное, ну на всякий случай

$id = $forum_db->result($forum_db->query(
  sprintf("SELECT id FROM `".$db_prefix."users` WHERE `username` = '%s'",
	$forum_db->escape($login))
));
if (!$id) {
	$forum_db->query(sprintf("INSERT INTO `".$db_prefix."users` (`username`,`password`,`email`,`registered`,`registration_ip`,`last_visit`, `style`)
VALUES ('%s', '%s', '%s', %d, '%s', %d, 'Oxygen')",
		$forum_db->escape($login), $forum_db->escape($myhash), '', time(), $_SERVER['REMOTE_ADDR'], time()));
	$id = $forum_db->insert_id();
}
$hash = $forum_db->result($forum_db->query(
	sprintf("SELECT password FROM `".$db_prefix."users` WHERE `username` = '%s'",
	$forum_db->escape($login))
));
if ($hash != $myhash) {
	$hash = $myhash;
	$forum_db->query("UPDATE `".$db_prefix."users` SET password='$hash' WHERE id=$id");
}
$expire = time() + 31536000;
$salt = '';

//echo base64_encode($id.'|'.$hash.'|'.$expire.'|'.sha1($salt.$hash.forum_hash($expire, $salt)));
//die();
forum_setcookie($cookie_name, base64_encode($id.'|'.$hash.'|'.$expire.'|'.sha1($salt.$hash.forum_hash($expire, $salt))), $expire);				
/**=================================
 *	<<<END>>> PunBB desIntegration
 *==================================*/

сразу после следующего кода:

if (!$oUser->getId() or !$oUser->getActivate()) {
	return false;
}
/**
 * Генерим новый ключ авторизаии для куков
 */
$sKey=md5(func_generator().time().$oUser->getLogin());
/**
 * Создаём новую сессию
 */
if (!$this->CreateSession($oUser,$sKey)) {
	return false;
}
/**
 * Запоминаем в сесси юзера
 */
$this->Session_Set('user_id',$oUser->getId());
$this->oUserCurrent=$oUser;
/**
 * Ставим куку
 */
if ($bRemember) {
	setcookie('key',$sKey,time()+60*60*24*3,Config::Get('sys.cookie.path'),Config::Get('sys.cookie.host'));
}


И еще один грязный хак — идем в forum/include/functions.php и меняем функцию forum_setcookie на эту:

function forum_setcookie($name, $value, $expire)
{
	global $cookie_path, $cookie_domain, $cookie_secure;
	$cookie_path = '/';
	$cookie_domain = '';

	$return = ($hook = get_hook('fn_forum_setcookie_start')) ? eval($hook) : null;
	if ($return != null)
		return;

	// Enable sending of a P3P header
	header('P3P: CP="CUR ADM"');

	if (version_compare(PHP_VERSION, '5.2.0', '>='))
		setcookie($name, $value, $expire, $cookie_path, $cookie_domain, $cookie_secure, true);
	else
		setcookie($name, $value, $expire, $cookie_path.'; HttpOnly', $cookie_domain, $cookie_secure);
}


Теперь обработаем логаут
в /classes/actions/ActionLogin.class.php
функцию EventExit заменить на эту:

protected function EventExit() {
	$this->Security_ValidateSendForm();
	$this->User_Logout();
	
	/**=================================
	 *	PunBB Integration
	 *==================================*/
	define('FORUM_ROOT', '/var/www/forum/');
	require_once FORUM_ROOT.'config.php';
	require_once FORUM_ROOT.'include/functions.php';
	forum_setcookie($cookie_name, '', time());
	/**=================================
	 *	<<<END>>> PunBB desIntegration
	 *==================================*/		
	
	$this->Viewer_Assign('bRefreshToHome',true);
}


Минус способа в том, что для регистрации юзеров в форуме надо их всех разлогинить (т.к. мы при логине проверяем существование юзера в базе punbb). Не забудьте удалить файлы регистрации и логаута форума (ну или die(); туда прописать в начало) — login.php, register.php

14 комментариев

avatar
Я никогда не понимал, нафига к ЛС прикручивать форум. Но новость хорошая :))
avatar
Не реклама, но очень хороший пример, но он не на лс — mmoboom.ru
avatar
А когда в punbb кликать на профиль, будет показывать лсовская или форумная?
avatar
Осталось сделать одну систему личных сообщений и вывести количество комментариев в единый профиль на ls. и всё.
Первое делается просто, только подмен ссылок.
Второе ещё не знаю.
Третье, пока не знаю
avatar
Минус способа в том, что для регистрации юзеров в форуме надо их всех разлогинить (т.к. мы при логине проверяем существование юзера в базе punbb). Не забудьте удалить файлы регистрации и логаута форума (ну или die(); туда прописать в начало) — login.php, register.php
Т.е. если при интеграции, человек зарегистрировался. и постоянно нужно будет логиниться на форуме?
avatar
после интеграции чтобы заполнить табличку форума юзерами, надо всех разлогинить, т.к. заполняется оно при входе на сайт, это сделать нужно только 1 раз
avatar
Насколько я помню, скоро должна быть официальная интеграция с каким-нить форумом, или простенький с нуля, как на ммобум, про который говорили выше.
avatar
а как пользователей то разлогинить?:D
avatar
Как бы скрипт сам разлогинивает…
avatar
После всего проделанного, я попробывал сделать логаут в лс.
Результат:
Parse error: syntax error, unexpected T_PROTECTED in /home/USER/public_html/LS/classes/actions/ActionLogin.class.php on line 37
avatar
криво код скопировал
avatar
вообще-то нет
очистить в базе табличку сессий надо и кеш
avatar
подробнее
avatar
Можно добавить:
В файл /classes/modules/user/User.class.php после
$login = $oUser->getLogin();

вставляем строчку:
$email  = $oUser->getMail();


Ну и дальше при инсерте:
вместо '', — $email
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.