Интеграция на phpbb в уебсайт базиран на CodeIgniter

Забелязах, че във форумите на framework-а CodeIgniter има доста теми свързани с интеграцията на phpbb. Все пак има една библиотека постната във форумите – тук,  но тя не изпълняваше моите изисквания. Всъщност единственото нещо, което беше полезно за мен е частта с логването, т.е.конструктора. Тази част от кода е почти еднаква и тук трябва да благодаря на Tomaž Muraus за тези първоначални насоки. Моите добавки към библиотеката са останалите полезни функции. Така че в крайна сметка направих една простичка библиотека за CodeIgniter, която управлява изпълнението на отдалечен логин, отдалечено добавяне на потребител, редакция (смяна на парола) и изтриване на потребител. Ще ви покажа кода тук и ще го орежа малко, защото в текущия си вид съдържа някои допълнителни неща свързани с конкретните нужди на проекта, за който направих библиотеката.

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
* CodeIgniter phpBB3 Bridge
* @author Georgi Budinov, credits to Tomaž Muraus at http://www.tomaz-muraus.info
* @link georgi.budinov.com
*/
class Phpbb_bridge
{
 public $CI;
 protected $_user;

 /**
 * Constructor.
 */
 public function __construct()
 {
   if (!isset($this->CI))
   {
     $this->CI =& get_instance();
   }

   // Set the variables scope
   global $phpbb_root_path, $phpEx, $user, $auth, $cache, $db, $config, $template, $table_prefix;

   $rootPath = $this->CI->config->item('root_path');

   define('IN_PHPBB', TRUE);
   define('FORUM_ROOT_PATH', $rootPath.'forum/');

   $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : FORUM_ROOT_PATH;
   $phpEx = substr(strrchr(__FILE__, '.'), 1);

   // Include needed files
   include($phpbb_root_path . 'common.' . $phpEx);
   include($phpbb_root_path . 'config.' . $phpEx);
   include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
   include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
   include($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);
   include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);

   // Initialize phpBB user session
   $user->session_begin();

   $auth->acl($user->data);
   $user->setup();

   // Save user data into $_user variable
   $this->_user = $user;
 }

 /**
 * @param $email
 * @param $username
 * @param $password
 * @return unknown_type</pre>
 */
 public function user_add($email, $username, $password)
 {
   $user_row = array(
     'username'              => $username,
     'user_password'         => phpbb_hash($password),
     'user_email'            => $email,
     'group_id'              => 2, // by default, the REGISTERED user group is id 2
     'user_timezone'         => (float) date('T'),
     'user_lang'             => 'bg',
     'user_type'             => USER_NORMAL,
     'user_ip'               => $_SERVER['REMOTE_ADDR'],
     'user_regdate'          => time(),
   );

   return user_add($user_row, false);
 }

 /**
 * @param $username
 * @param $password
 * @return bool
 */
 public function user_edit($username, $password)
 {
   return user_edit($username, $password);
 }

 /*
 * Logins the user in forum
 */
 public function user_login($username, $password)
 {
   $auth = new auth();

   return $auth->login($username, $password);
 }

 public function user_logout()
 {
   $this->_user->session_kill();
   $this->_user->session_begin();
 }

 /**
 * @param $user_id
 * @return unknown_type
 */
 public function user_delete($user_id)
 {
   return user_delete('remove', $user_id, false);
 }
}

Още нещо трябва да отбележа: user_edit функцията не съществува в phpbb3. Затова аз дефинирах такава в includes/functions_user.php:

/**
* Change password
*
* @param string $username
* @param string $newPassword
* @return boolean
*/
function user_edit($username, $newPassword)
{
 global $db, $user, $auth, $config, $phpbb_root_path, $phpEx;

 if (empty($username) || empty($newPassword))
 {
   return false;
 }

 $sql = 'UPDATE ' . USERS_TABLE . ' SET user_password=\'' . $db->sql_escape(md5($newPassword)) . '\' WHERE username = \''.$db->sql_escape($username).'\'';
 $db->sql_query($sql);

 return true;
}

И не на последно място ще трябва да решите по какъв начин да се справите с повторението на функцията redirect. Аз я замених в CodeIgniter framework-а, тъй като беше по-лесно за мен.
Enjoy!

НОВО 1:

За версия на PHPBB по-голяма или равна на 3.0.8. трябва да бъде променено името на cache класа от cache на cache_phpbb. Файловете са както следва:

./common.php , ./style.php , ./download/file.php и ./includes/cache.php

НОВО 2:

За да работи правилно библиотеката трябва да бъде избран различен драйвер за конекция към базата данни от този който сте избрали за CI. Например mysql за CI и mysqli за PHPBB (настройва се от ./config.php)

Прочети статията на: English

  1. Мерси много.

    • Александър
    • ноември 14th, 2013 11:08am

    Ето нещо над което да помислиш :)

    088 public function user_login($username, $password)
    089 {
    090 $auth = new auth();
    091
    092 return $auth->login($username, $password);
    093 }

    В тази функция, ако да речем потребителя е баннат по IP или потребителско име, какво ще се случи? :)

  1. Все още няма нито един trackback.