Интеграция с форумами phpBB3 и phpBBex

Board index Русско-язычный форум Интеграция с движками форумов

Forum name: Интеграция с движками форумов
Description: Раздел для обсуждений интеграции сайтов, разработанных на HTML5 Builder, с программным обеспечением форумов.

Post a reply


Enter the code exactly as it appears. All letters are case insensitive.
Confirmation code
:hi: :smile: :wink: :twisted: :sad: :evil: :smoke: :eh: :eek: :fie: :silenced: :razz: :oops: :help: :spy: :insane: :biggrin: :toothless: :ill: :nervious: :weirdface: :pray: :clap: :think: :boxing: :cyclop: :rambo: :zombie: :cry: View more smilies
   

Expand view Topic review: Интеграция с форумами phpBB3 и phpBBex

Интеграция с форумами phpBB3 и phpBBex

Post by admin » 23.04.2013, 21:05

Рано или поздно для WEB-разработчиков, использующих HTML5 Builder, встает вопрос об интеграции сайта с каким-либо форумом. Согласитесь, хорошо бы чтобы можно было хотя бы пройти идентификацию в одном месте ( на сайте или на форуме) и автоматически получить в другом - на форуме или сайте соответственно. Для собственных нужд был выбран изначально форум phpbb3 в основном по нескольким причинам - он имеет довольно широкое распространение (думаю потому, что наверно не самый плохой), имеется русскоязычная поддержка и, наверное самая первая причина в том, что данный движок использует мой одногруппник, если что, решил я, всегда "наеду" с вопросами на него. :smile: Недавно почитав о phpbbex, решил что этот движок более привлекателен, к тому же вышел из phpbb3, а значит должно быть много общего и механизм интеграции тоже.
У каждого разработчика здесь свои задачи. В сети информация на эту тему есть и разнообразная. Почитав, даже кое-что попробовал (без привязки сессий сайта к механизму сессий форума), пришел к выводу, что все-таки надо делать полную интеграцию по механизму сессий. Здесь описано, так сказать, направление куда "копать" в этом случае.
Зададим исходные условия:
1) Общая таблица пользователей
2) Регистрация осуществляется механизмом форума
3) Единая идентификация.
Ниже приведен код, который надо вставить в начало каждой страницы (конечно, на тех страницах, на которых нам это действительно необходимо):
Code: Select all
<?php
define
('IN_PHPBB', true);
define('PHPBB_ROOT_PATH', './forum/');   // задаем путь к форуму относительно корня сайта
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
require_once(
"rpcl/rpcl.inc.php");
// здесь можно подключить свои модули, например у меня так
require_once("dmglob.php");
require_once(
'config.' . $phpEx);

         //  Подключение форумного функционала
require_once($phpbb_root_path . 'config.' . $phpEx);
include(
$phpbb_root_path . 'common.' . $phpEx);         //  Эти 4 строки кода придется закомментировать при отладке и запуске
 //Start session management                             //   из IDE, в противном случае, IDE не "переваривает" форумный файл
$user->session_begin();                                //   common.php и впадает в глубокий ступор.
$auth->acl($user->data);                               //  
$user->setup();                                       //
           
     
// Здесь начинается подключение модулей IDE для самой формы
//Includes
use_unit("forms.inc.php");
------------
 // здесь Ваш код
?>

Здесь оставлен, так сказать, стиль указания подключамых файлов форумный, я имею ввиду использование переменной $phpEx.
Для установки параметров компонента DataBase необходимо использовать данные из форумного файла "config.php".
Итак, проделав все как описано выше, запускаем из IDE или на локальном сервере, видим неприятную картину - оказывается, оба форума имеют свою функцию "redirect", а phpbb3 еще и свой сласс "cache" (phpbbex использует другой класс phpbb_cache, что даже несколько упрощает его интеграцию), т.е. точно такие же, какие есть в HTML5 Builder.( В смысле имен). Что делать? Недолго думая, ищем все файлы форума, содержащие строки с такими функциями и просто меняем их на свои, например, я добавил префикс "f_" ( от "форум"), получилось "f_redirect" и "f_cache". Повторю, что для phpbbex необходимо только переименовать везде функцию, класс уже имеет в имени свой префикс. Проделав данную процедуру, запускаем проект снова и радуемся-все работает! Конечно, при обновлении форума придется все проделать заново, но это не занимает уж очень много времени, по карайней мере, гораздо меньше, чем писать свой форум. :smile:

Теперь о том, как сделать идентификацию на сайте. Создаем любую свою форму с Edit-полями, например, с именами "password","username", и чекбоксом "запомнить меня" с именем "autologin". В JS -событие кнопки входа прописываем перенаправление в форму проверки данных,например, так
Code: Select all
 document.forms[0].action = 'login.php?mode=login'
Для выхода нужно использовать "mode=logout".
В форме login.php в событии OnCreate

Code: Select all

$mode    
= request_var('mode', '');
if (($mode=='login') && (!$user->data['is_registered'])) $this->Login();
  else
     
{if(($mode== 'logout') && ($user->data['user_id'] != ANONYMOUS))
        { $this->lbErr->Visible=false;
          $this->lbMsg2->Visible=true; $this->pnSLLogin->Visible=false;
          $this->lbMsg->Visible=true;  $this->lbMsg->Caption='Вы успешно вышли из системы.';
          $user->session_kill(); session_unset(); session_destroy();
        }
      else redirect($redirect);
    }
 

Это мой код, в котором используется еще механизм возврата на ту страницу, с которой пришли сюда для входа или выхода.
Моя функция Login() такая
Code: Select all

    function Login
()
    {
      global $user,$auth,$config,$phpEx;
      $username = request_var('username', '', true);
      $password = request_var('password', '', true);
      $autologin  = (!empty($_POST['autologin'])) ? true : false;
      $login= $auth->login($username, $password, $autologin);
      if ($login['status']==LOGIN_SUCCESS)
        { $this->Timer1->Enabled=true;
          $this->lbMsg->Visible=true;
          $this->lbMsg2->Visible=true;
          $this->lbErr->Visible=false;
          $this->pnSLLogin->Visible=false;
          $this->lbMsg->Caption = 'Вы успешно вошли в систему.';
             // Reset permissions data if user has just logged in
          if(!empty($login))  $auth->acl($user->data);
        }
      else
        
{ $this->Timer1->Enabled=false;
          if(isset($login['error_msg']) && $login['error_msg'])
            {
                     // превысили количество попыток входа-показать капчу
                     //пока используем функцию форума
             if ($login['error_msg'] =='LOGIN_ERROR_ATTEMPTS') {
                login_box($_SERVER['DOCUMENT_ROOT']."/index.". $phpEx);
              }
              else
               
{  $err = $user->lang[$login['error_msg']];
                  if ($login['error_msg'] == 'LOGIN_ERROR_USERNAME' || $login['error_msg'] == 'LOGIN_ERROR_PASSWORD')
                  $err = (!$config['board_contact']) ? sprintf($user->lang[$login['error_msg']], '', '') : sprintf($user->lang[$login['error_msg']], '<a href="mailto:' . htmlspecialchars($config['board_contact']) . '">', '</a>');
                  $this->lbMsg->Visible=false;
                  $this->lbMsg2->Visible=false;
                  $this->lbErr->Visible=true;
                  $this->pnSLLogin->Visible=true;
                }
            }
          $this->lbErr->Caption=$err. '<br />';;
       }
    }
 

Еще несколько слов о том как использовать. Например в событии формы OnBeforeShow
Code: Select all

function Page1BeforeShow
($sender, $params)
    {
       global $config,$user,$auth;   
                     
// этот код выполнится только для зарегистрированных пользователей
      if (!empty($user->data['user_id']) && ($user->data['user_id'] !ANONYMOUS))  {........} 
          else 
{...}   // этот  для анонимных
    }
 

Или, например, так
Code: Select all

      global $user
,$auth,$phpEx;
                 // если пользователь не администратор, просим  еще раз ввести  логин-пароль
      if (!isset($user->data['session_admin']) || !$user->data['session_admin'])          redirect('admlogin.'.$phpEx);
 
Правда, придется немного попотеть, чтобы в своем файле "admlogin.php" (как в примере) добиться того, чтобы после нормальной идентификации сессия стала "админовской". Но похоже, есть более простой путь-использовать проверку на принадлежность пользователя к определенной группе. Конечно, нужно читать и знать кое-что об API форумов, полезно также покопаться в исходниках.
Код был написан для phpbb3 (3.0.11), работает и в phpbbex версии 1.6.0. В некоторых статьях рекомендуют для нужд сайта, например, дополнять форумную таблицу пользователей своими полями при необходимости. Мне представляется (правда, пока ничем ни подтверждено,ни опровергнуто), что лучше все-таки иметь свои таблицы для сайта и никак не трогать форумные во избежание возможных проблем при обновлении форума. Повторю, что это лишь мое сугубо личное мнение, чисто интуитивное, к тому же опыта работы с форумом пока немного.
Надеюсь, что данная статья будет полезной для тех, кто только начинает разбираться с данной темой,хотя это только самое начало. Здесь не затронута, например, проблема общего поиска для сайта и форума. С этой темой я пока сам не разбирался.

Список файлов для форума phpbbex 1.7.1 в которых надо переименовать функцию "redirect"
mcp.php
posting.php
report.php
ucp.php
viewforum.php
viewtopic.php

download\file.php

inludes\functions.php
includes\functions_display.php
includes\posts_merging.php
inludes\session.php

includes\acp\acp_inactive.php
inludes\acp\acp_permissions.php

includes\mcp\mcp_forum.php
includes\mcp\mcp_main.php
includes\mcp\mcp_queue.php
includes\mcp\mcp_reports.php

includes\ucp\ucp_groups.php
includes\ucp\ucp_pm_compose.php
includes\ucp\ucp_pm_options.php
cron