タスクの背景は次のとおりです。 Livestreetエンジン上にサイトがありましたが、そこには何も問題はありませんでしたが、ユーザーはフォーラムを望んでいました。 必要なのはそれだけです。 すでに登録されている各ユーザーはフォーラムで新しい方法で登録する必要があり、新しいユーザーは両方のCMSで登録する必要があるため、新しいエンジンをインストールして構成することはオプションではありません。 ソーシャルを介した登録/エントリー。 歴史的な理由でネットワークはありませんでした。 したがって、タスクは私に直面しました:
- SMF(Simple Machines Forum)2.0フォーラムを展開して 、 www.mysite.com / forumで利用できるようにします
- ユーザーがフォーラムにログオンするとき、Livestreetデータベースを確認する権限があるかどうかを確認してください。
- ユーザーはCMS Livestreetにのみ登録されます
- CMS Livestreetを介したログインとパスワードの検証のみ
SMFエンジンは、システムの動作を変更できるフックメカニズムを実装しています。 上記のタスクに基づいて、次のフックを使用してシステムの動作を再定義する必要があります。
- integration_verify_user
- integration_verify_password
- integration_validate_login
- integration_login
- integration_logout
- integration_reset_pass
- 統合レジスタ
- integration_change_member_data
SMFがその動作をオーバーライドすることを知るには、フォーラムエンジンのルートフォルダーにインストーラースクリプトを作成する必要があります。次の内容でadd_livestreetAuth_hook.phpを呼び出します。
<?php // If SSI.php is in the same place as this file, and SMF isn't defined, this is being run standalone. if (file_exists(dirname(__FILE__) . '/SSI.php') && !defined('SMF')) require_once(dirname(__FILE__) . '/SSI.php'); // Hmm... no SSI.php and no SMF? elseif (!defined('SMF')) die('<b>Error:</b> Cannot install - please verify you put this in the same place as SMF\'s index.php.'); add_integration_function('integrate_pre_include', "$sourcedir/Subs-LivestreetAuth.php"); add_integration_function('integrate_verify_user', 'livestreet_verify_user_add_hook',TRUE); add_integration_function('integrate_validate_login ', 'livestreet_validate_login_add_hook',TRUE); add_integration_function('integrate_login', 'livestreet_integrate_login_add_hook',TRUE); add_integration_function('integrate_logout', 'livestreet_integrate_logout_add_hook',TRUE); add_integration_function('integrate_reset_pass', 'livestreet_integrate_reset_pass_add_hook',TRUE); add_integration_function('integrate_register', 'livestreet_integrate_register_add_hook',TRUE); add_integration_function('integrate_change_member_data', 'livestreet_integrate_change_member_data_add_hook',TRUE); add_integration_function('integrate_menu_buttons', 'livestreet_integrate_menu_buttons_hook',TRUE); ?>
$ sourcedirは、SMFエンジンのSourcesディレクトリへのパスを含むグローバル変数です
add_integration_function-関数(2番目のパラメーター)をフック(1番目のパラメーター)にバインドするエンジンに実装された関数。 TRUEまたはFALSE関数の3番目のパラメーターは、バインディングをデータベースとキャッシュに保存するかどうかを決定します。
add_integration_function関数( 'integrate_pre_include'、 "$ sourcedir / Subs-LivestreetAuth.php")の最初の呼び出しは、以下に説明する関数が実装されているファイルへのパスをエンジンに伝えます。
次に、エンジンのSourcesディレクトリで、 Subs-LivestreetAuth.phpファイルを作成します。このファイルには、フックに関連付けられているすべての機能が実装されています。
その後、ブラウザからスクリプトwww.mysite.com/forum/add_livestreetAuth_hook.phpを起動します。 エラーなしで白い画面が表示された場合、バインドは成功しています。 さらに、神経を落ち着かせるために、smf_settingsデータベーステーブルの内容を確認できます。 テーブルの終わり近くに、それらに接続されているフックと関数のエントリがあります。
Sources / Subs-LivestreetAuth.phpファイルに関数を実装する際のいくつかのポイント。
- ファイルの最初の行には、ブラウザからファイルへの直接アクセスを防ぐために次のコードを含める必要があります。
if(!defined( 'SMF'))die( 'Hackingattempt ...'); - 各関数内でデータベースを操作するには、グローバル変数を宣言します。global $ smcFunc;
この変数には、データベースを操作するための関数の配列が含まれています。 このレイヤーがどのように機能するかの小さな例を示します。
$res=$smcFunc['db_query']('',"SELECT id_member FROM {db_prefix}members WHERE member_name=\"user1\"",array()); if($smcFunc['db_num_rows']($res)>0) { $smf_user_row=$smcFunc['db_fetch_assoc']($res); return $smf_user_row['id_member']; }
{db_prefix}-エンジンのインストール時に指定されたデータベーステーブルプレフィックス。
ドキュメントの詳細。 - 関数へのパラメーターの転送は参照によって実行されることに注意する必要があります。 例:
function livestreet_validate_login_add_hook(&$username,&$hashedPass=NULL,&$cookieLifetime) { return 'ok';// retry|ok }
このまたはそのフックにバインドされた関数が返すものをマニュアルで注意深く読んでください。
主な統合作業は、関数livestreet_verify_user_add_hook()にあります。この関数は、integrate_verify_userフックにリンクし、Sources / Subs-LivestreetAuth.phpファイルに実装しました。
- 彼女が最初にすべきことは、CMS Livestreetをインストールする$ _COOKIE ['key']を確認することです。 存在しない場合、または正しくない場合は、0(ゼロ)を返します。これにより、ログインしているユーザーがゲストであることを示します。
- 次に、$ _COOKIE ['key']の関数は、Livestreetデータベースのテーブル{$ prefix}セッションからuser_idを選択し、その後、テーブル{$ prefix}ユーザーのuser_idがユーザーに関するすべての情報を選択します。
- SMFデータベースのテーブル{db_prefix}のメンバーで、このログインを持つユーザーがいるかどうかをチェックし、そうでない場合はログに記録します
- SMFデータベースのテーブル{db_prefix}メンバーのid_memberを返します
livestreet_integrate_menu_buttons_hookフックについても言及したいと思います。 これにより、エンジンのメインメニュー項目をオーバーライドできます。 たとえば、私の場合は必要でした:
- サイトのメインページにリンクを追加します
- [ログイン]リンクをクリックすると、ユーザーはCMS Livestreetログインおよびパスワードのログインページに送信されます
- 「登録」リンクをクリックすると、ユーザーはCMS Livestreet登録ページに移動します。
実際には、関数の実装:
function livestreet_integrate_menu_buttons_hook(&$buttons) { //print_r($buttons);exit;// if($config=getLivestreetConfig()) { $new_buttons=array( 'login'=>array( 'href'=>'http://mysite.com/login/', ), 'register'=>array( 'href'=>'http://mysite.com/registration/', ), ); foreach($new_buttons as $key=>$val) { if(isset($buttons[$key])) { //unset($buttons[$val]); $buttons[$key]['href']=$val['href']; } } // $buttons=array( 'mainpage'=>array( 'title'=>' ', 'href'=>'http://mysite.com/', 'show'=>1, 'sub_buttons'=>array() ) )+$buttons; } }
すべてのメインメニュー項目を含む多次元配列は、参照によって関数に渡されます。
フックを取り外します。
フックへの関数のバインドを削除するには、フォーラムエンジンのルートディレクトリにファイルを作成する必要があります(たとえば、 remove_livestreet_auth_hook.php ) 。remove_integration_function関数が1つずつ呼び出されます。 ファイルの内容の例:
<?php // If SSI.php is in the same place as this file, and SMF isn't defined, this is being run standalone. if (file_exists(dirname(__FILE__) . '/SSI.php') && !defined('SMF')) require_once(dirname(__FILE__) . '/SSI.php'); // Hmm... no SSI.php and no SMF? elseif (!defined('SMF')) die('<b>Error:</b> Cannot install - please verify you put this in the same place as SMF\'s index.php.'); remove_integration_function('integrate_pre_include', "$sourcedir/Subs-YourAction.php"); remove_integration_function('integrate_verify_user ', 'livestreet_verify_user_add_hook'); remove_integration_function('integrate_validate_login ', 'livestreet_validate_login_add_hook'); remove_integration_function('integrate_login', 'livestreet_integrate_login_add_hook'); remove_integration_function('integrate_logout', 'livestreet_integrate_logout_add_hook'); remove_integration_function('integrate_reset_pass', 'livestreet_integrate_reset_pass_add_hook'); remove_integration_function('integrate_register', 'livestreet_integrate_register_add_hook'); remove_integration_function('integrate_change_member_data', 'livestreet_integrate_change_member_data_add_hook');
次に、インストールの場合と同様に、ブラウザからスクリプトを実行して実行する必要があります。