NHANWEB

Tích hợp vBullentin 3.x vào code của bạn

Bài này viết sau khi phiên bản vBullentin 4.x ra mắt và hoàn thành một code tích hợp diễn đàn vào code của khách hàng nên share với các bác luôn cho vui cửa vui nhà.

Chúng ta biết rằng diễn đàn được nâng cấp liên tục và tùy theo phiên bản nữa do đó mình tìm cách tích hợp càng đơn giản càng tốt và hạn chế đụng chạm đến code vBullentin càng ít càng tốt vì mỗi lần tiến hành nâng cấp và sửa chữa là mỗi lần khó khăn cho lập trình viên cũng như những người sử dụng code tích hợp.

Diễn đàn vBullentin

Trong bài viết này mình hướng dẫn các bạn tích hợp table user vào mã nguồn của bạn (ví dụ như CMS chẳng hạn), các thành phần còn lại bạn tự thực hiện nhé :)

Yêu cầu tích hợp table user

  1. Có thể đăng nhập thông qua tài khoản diễn đàn.
  2. Có thể lấy ra một số thành phần cơ bản thông tin user nhằm sử dụng nó cho mục đích hiển thị trên mã lập trình của bạn.
  3. Sau khi đăng nhập, tài khoản có thể sử dụng trên cả diễn đàn và portal mà không cần phải đăng nhập thêm 1 lần nữa khi chuyển qua lại giữa 2 phần.

Ok! Mục đích bài viết này tạm thời dừng lại ở việc thực hiện những task đó thôi, bạn có thể dựa vào đó để làm thêm 1 số việc như truy vấn lấy thông tin thuộc các thành phần khác.

Cách thực hiện

Do sử dụng table user của vBullentin và muốn đồng nhất giữa đăng nhập forum và đăng nhập code của mình nên tôi sử dụng form login của vBullentin cho tiện và đỡ mắc công code, nghiên cứu lâu dài. Đồng thời, để không ảnh hưởng nhiều đến code của bạn (có thể đã xây dựng từ trước), tôi tách riêng phiên làm việc của user và lưu dưới dạng session để thực hiện trên code của mình, bạn có thể sử dụng session, cookie hoặc lưu dưới dạng table (như vBullentin đang làm) cũng được miễn sao thấy tiện. Để thực tế hóa, tôi tích hợp table user vào một code CMS Portal :)

Đầu tiên là form login, tôi bê nguyên form login của vBullentin qua portal của mình.

<script type=”text/javascript” src=”path_to_forum/clientscript/vbulletin_md5.js?v=368″></script>
<form action=”path_to_forum/login.php?do=login” method=”POST” onsubmit=”md5hash(vb_login_password, vb_login_md5password, vb_login_md5password_utf, 0)” name=”form_login” id=”form_login”>
<p><label>Tên đăng nhập</label><input type=”text” name=”vb_login_username” id=”navbar_username” accesskey=”u” tabindex=”101″></p>
<p><label>Mật khẩu</label><input type=”password” name=”vb_login_password” id=”navbar_password” tabindex=”102″></p>
<p style=”margin-top:8px;”><a href=”#” title=”Đăng nhập” onclick=”document.form_login.submit();”>Đăng nhập</a> <a href=”path_to_forum/login.php?do=lostpw” title=””>Quên mật khẩu</a> <a href=”path_to_forum/register.php” title=””>Đăng ký mới</a></p>
<input type=”hidden” name=”s” value=”” />
<input type=”hidden” name=”do” value=”login” />
<input type=”hidden” name=”vb_login_md5password” />
<input type=”hidden” name=”vb_login_md5password_utf” />
</form>

Bạn có thể tùy biến CSS theo ý bạn, nhưng nhớ giữ nguyên tên biến, số lượng biến vì chúng được sử dụng bởi forum vBullentin.

Phía trên là form đăng nhập cho portal của tôi, giờ tới phiên phần xử lý file login, có thay đổi một tí để nó làm việc với portal. Trong code portal của mình tôi sử dụng 1 Session để lưu phiên làm việc của User đăng nhập, bạn nào thích xài cái nào (như đã nói ở trên) thì tự xử theo ý mình nhé.

Mở file path_to_forum/login.php và tiến hành edit như sau:

Bạn tìm:

// ############################### start do login ###############################
// this was a _REQUEST action but where do we all login via request?
if ($_POST['do'] == 'login')
{
	$vbulletin->input->clean_array_gpc('p', array(
		'vb_login_username'        => TYPE_STR,
		'vb_login_password'        => TYPE_STR,
		'vb_login_md5password'     => TYPE_STR,
		'vb_login_md5password_utf' => TYPE_STR,
		'postvars'                 => TYPE_BINARY,
		'cookieuser'               => TYPE_BOOL,
		'logintype'                => TYPE_STR,
		'cssprefs'                 => TYPE_STR,
	));

	// can the user login?
	$strikes = verify_strike_status($vbulletin->GPC['vb_login_username']);

	if ($vbulletin->GPC['vb_login_username'] == '')
	{
		eval(standard_error(fetch_error('badlogin', $vbulletin->options['bburl'], $vbulletin->session->vars['sessionurl'], $strikes)));
	}

	// make sure our user info stays as whoever we were (for example, we might be logged in via cookies already)
	$original_userinfo = $vbulletin->userinfo;

	if (!verify_authentication($vbulletin->GPC['vb_login_username'], $vbulletin->GPC['vb_login_password'], $vbulletin->GPC['vb_login_md5password'], $vbulletin->GPC['vb_login_md5password_utf'], $vbulletin->GPC['cookieuser'], true))
	{
		($hook = vBulletinHook::fetch_hook('login_failure')) ? eval($hook) : false;

		// check password
		exec_strike_user($vbulletin->userinfo['username']);

		if ($vbulletin->GPC['logintype'] === 'cplogin' OR $vbulletin->GPC['logintype'] === 'modcplogin')
		{
			// log this error if attempting to access the control panel
			require_once(DIR . '/includes/functions_log_error.php');
			log_vbulletin_error($vbulletin->GPC['vb_login_username'], 'security');
		}
		$vbulletin->userinfo = $original_userinfo;

		if ($vbulletin->options['usestrikesystem'])
		{
			eval(standard_error(fetch_error('badlogin_strikes', $vbulletin->options['bburl'], $vbulletin->session->vars['sessionurl'], $strikes)));
		}
		else
		{
			eval(standard_error(fetch_error('badlogin', $vbulletin->options['bburl'], $vbulletin->session->vars['sessionurl'])));
		}
	}

	exec_unstrike_user($vbulletin->GPC['vb_login_username']);

	// create new session
	process_new_login($vbulletin->GPC['logintype'], $vbulletin->GPC['cookieuser'], $vbulletin->GPC['cssprefs']);

Thêm vào bên dưới

//Create login status for portal
	// Author: Nguyen Duy Nhan
	$user = array(
		"username"			=>	$vbulletin->userinfo['username'],
		"userid"			=>	$vbulletin->userinfo['userid'],
		"lastvisit"			=>	$vbulletin->session->vars["lastactivity"],
		"message_total"		=>	$vbulletin->userinfo["pmtotal"],
		"message_unreal"	=>	$vbulletin->userinfo["pmunread"],
		"logouthash"		=>	$vbulletin->userinfo["logouthash"],
		"loggedin"			=>	1
	);
	$_SESSION["your_session_name"] = $user;
	//-----------------------------------

Đoạn code chúng ta thêm vào bên dưới có tác dụng tạo ra một Session để khai báo thông tin cho portal biết là user đã đăng nhập thành công và đồng thời lấy ra một số thông tin cơ bản của user để hiển thị bên ngoài portal. Để thuận tiện thì tôi lưu luôn lên trên Session, điểm hạn chế của nó là thông tin không được cập nhật liên tục nhưng vấn đề đó ta sẽ bàn sau :D

Tiếp theo bạn sử lý sự kiện logout của user, tìm

// ############################### start logout ###############################
if ($_REQUEST['do'] == 'logout')
{
	define('NOPMPOPUP', true);

Đây là đoạn sử lý logout, thêm vào phía dưới nó:

//Create login status for portal
	// Author: Nguyen Duy Nhan
		$user = array(
		"username"			=>	"",
		"userid"			=>	0,
		"lastvisit"			=>	time,
		"message_total"		=>	0,
		"message_unreal"	=>	0,
		"loggedin"			=>	0
	);

	$_SESSION["your_session_name"] = $user;
	@session_unset();
	//=====

Vậy là xong :D

Phương pháp tích hợp này khá đơn giản tuy nhiên đáp ứng được tốt nhu cầu sử dụng chung user với forum mà vẫn đảm bảo được hoạt động độc lập cho cả portal và forum, tránh tương tác với Database cũng như source code của vBullentin quá nhiều làm ảnh hưởng đến hệ thống cũng như gây khó khăn khi nâng cấp phiên bản :)

Exit mobile version