PhpBB 3とKohana 3の統合

画像

これら2つのツールを組み合わせる方法に関する簡単なマニュアル。 実際、すべてがそれほど複雑ではありません。



問題の本質



phpBBには独自のAPIがありますが、問題はその使用方法です。 一般に、common.phpファイルをインクルードすれば十分ですが、そのようには機能しません。 まず、セッションクラスが交差します。 そして、2番目と3番目-内部を読みます。



始めましょう



index.php Kohanaを/ webに入れ、フォーラムを/ web /フォーラムに入れます



含まれるもの


フォーラムのコードを損なわないために、まず必要なファイルのコピーを作成する必要があります。 もちろんライブで編集することもできますが、フォーラムは機能しなくなりますが(キャップ​​のおかげ)、統合は機能します。 したがって、ためらうことなく、名前を変更します。



forum/common.php => forum/common_kohana.php

forum/includes/session.php => forum/includes/session_kohana.php







その後、 フォーラム/ common_kohana.phpに接続します



session_kohana.phpを編集します


このファイルには、セッションとユーザーの2つのクラスがあります。 セッションはKokhanovskyと競合します。ユーザーIも名前を変更しました。 したがって、修正します。



 class session // => class session_kohana
      
      





 class user extends session // => class user_kohana extends session_kohana
      
      







common_kohana.phpを編集します


ここに、セッションファイルの接続があります。

 require($phpbb_root_path . 'includes/session.' . $phpEx);
      
      





これは早急に修正する必要があります。

 require($phpbb_root_path . 'includes/session_kohana.' . $phpEx);
      
      







少し低く浸します。 エラーハンドラーのインストールは次のとおりです。

 // Set PHP error handler to ours set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler');
      
      







Cohanaには既に独自のハンドラーがあり、まったく悪いことではありません(ブラックジャックと痕跡があります)。

 // Set PHP error handler to ours //set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler');
      
      







以下に、Userクラスのインスタンスを含むメインオブジェクトを作成します。

 // Instantiate some basic classes $user = new user();
      
      







このクラスはフォーラム/includes/session_kohana.phpファイルに保存されています。 名前も変更しました。

 $user = new user_kohana();
      
      







さあ、ここにあります。 Kohanaはデフォルトでグローバル変数を強制終了するため、手動で追加する必要があります。 文字通り下に追加します:

 $GLOBALS['user'] = $user; $GLOBALS['auth'] = $auth; $GLOBALS['template'] = $template; $GLOBALS['cache'] = $cache; $GLOBALS['db'] = $db;
      
      







次に、構成が接続されます。

 // Grab global variables, re-cache if necessary $config = $cache->obtain_config();
      
      







インスタンスもグローバル化されます。 下に追加

 $GLOBALS['config'] = $config;
      
      







ファイルの最後にフックをインストールしています。 私はこれが仕事にどのように影響するかを完全には理解していませんでしたが、必要ではないようです。 フォーラムでのユーザーの作業のコンテキスト外で意味をなさないでください。 次のコードをコメントアウトしました。

 // Add own hook handler require($phpbb_root_path . 'includes/hooks/index.' . $phpEx); $phpbb_hook = new phpbb_hook(array('exit_handler', 'phpbb_user_session_handler', 'append_sid', array('template', 'display'))); foreach ($cache->obtain_hooks() as $hook) { @include($phpbb_root_path . 'includes/hooks/' . $hook . '.' . $phpEx); }
      
      







common.phpを扱った



接続



私は小さなクラスを作成しました。これは完全に理解しているクラスではなく、静的関数のセットです。 この関数はフォーラムを接続し、コード自体はindex.phpファイルから取得されます。

 public static function include_libs() { //      if (self::$libs_included) return TRUE; define('IN_PHPBB', true); define('PHPBB_DB_NEW_LINK', 1); $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './forum/'; $phpEx = substr(strrchr(__FILE__, '.'), 1); $GLOBALS['phpbb_root_path'] = $phpbb_root_path; $GLOBALS['phpEx'] = $phpEx; require_once($phpbb_root_path . 'common_kohana.' . $phpEx); require_once($phpbb_root_path . 'includes/functions_user.' . $phpEx); require_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx); // Start session management $user->session_begin(); self::$libs_included = TRUE; return TRUE; }
      
      







Zatykはこれにいました:

 define('PHPBB_DB_NEW_LINK', 1);
      
      





phpbbがデータベースに接続すると、次のようになります。

 $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, defined('PHPBB_DB_NEW_LINK') ? PHPBB_DB_NEW_LINK : false);
      
      







画像 定数PHPBB_DB_NEW_LINKを1に定義しないと、次のことが起こります。 あなたのサイトは明らかにデータベースを使用しています。 だからここに。



フォーラムが別のデータベースにぶら下がっており、データベースがすべて同じサーバー、同じユーザー(および同じパスワードを想定する必要がある)にある場合、それら、またはむしろポインター( リソースタイプの変数)は期待どおりに機能しません。 phpBBから呼び出されるmysql_connect関数は、呼び出しのパラメーターがCohanで作成されたパラメーターと同じ場合、現在のKokhanのmysql_connection_idを使用しようとします。 ハッシュを介してデータベースの一意性を制御するKokhanovskyの方法は、クラスから抽象化されて1レベル高いため、ここでは機能しません。

これについてはドキュメントに次のように書かれています:



同じmysql_connect()引数を使用して2番目の関数呼び出しが発生した場合、新しい接続は確立されません。 代わりに、関数は既に確立された接続へのリンクを返します。 new_linkパラメーターは、類似のパラメーターを持つ接続が既に開いている場合でも、 mysql_connect()関数が別の接続を開くようにすることができます。




よくここに。 これで作業できます。 ユーザー登録は次のように行われます。

 public static function register_user($username, $password, $email) { global $user; self::include_libs(); $user_row = array( 'username' => $username, 'user_password' => phpbb_hash($password), 'user_email' => $email, 'group_id' => 2, 'user_timezone' => 10.00, 'user_dst' => 1, 'user_lang' => 'ru', 'user_type' => 0, 'user_actkey' => '', 'user_ip' => Request::$client_ip, 'user_regdate' => time(), 'user_inactive_reason' => 0, 'user_inactive_time' => 0, ); try { $user_id = user_add($user_row, FALSE); return $user_id ? $user_id : FALSE; } catch (Exception $e) { return FALSE; } }
      
      







そして、特定のユーザーにログインしてログアウトすることができます。

 public static function login($user_id, $persist_login = FALSE) { global $user; self::include_libs(); $user->session_create($user_id, false, $persist_login, true); } public static function logout() { global $user; self::include_libs(); $user->session_kill(FALSE); return TRUE; }
      
      







ユーザーがログインしているかどうかを確認します。

 public function logged_in() { global $user; $this->include_libs(); return ($user->data['user_id'] == ANONYMOUS) ? FALSE : TRUE; }
      
      







一般に、ロールの割り当てなど、フォーラムAPI機能の多くを使用できます。 これは、ユーザーがプライベートフォーラムへのアクセスを開く方法です。

 function forum_open($forum_id, $user_id) { $this->include_libs(); $role_id = 14; // Full access $auth_admin = new auth_admin(); $q = DB::query(Database::SELECT, "SELECT o.auth_option, r.auth_setting FROM `bazar_acl_roles_data` AS r, `bazar_acl_options` AS o WHERE o.auth_option_id = r.auth_option_id AND r.role_id = :role_id") ->param(':role_id', $role_id) ->as_object() ->execute('forum'); $auth_settings = array(); foreach ($q as $row) { if ($row->auth_option != 'f_') { $auth_settings[$row->auth_option] = $row->auth_setting; } } $auth_admin->acl_set('user', $forum_id, $user_id, $auth_settings, $role_id, true); }
      
      







そして最後に、私は言います



これは悪いアプローチです PLOの基本原則に違反します。 グローバル変数、グローバル関数、定数...一般に、これは必要ありません。 そして、当然のことながら、コメントでお聞きしたいと思います。 通常の統合メカニズムが表示されたとき。 ありがとう



サービスはここで動作します 。 サイトとフォーラムに登録した場合、サイトにログインすると、フォーラムへのログインが行われます。

オリジナル記事



All Articles