PhpBB3トラップシステム

1.はじめに



これは何ですか


トラップシステムを使用すると、アプリケーションおよびMOD開発者はphpBBコードでトラップを設定したり、独自の機能でそれらを使用したりできます。



トラップを使用できるPhpBB関数


phpBBには、トラップでキャッチできる4つの関数があります。



phpbb_user_session_handler() -ユーザー内で呼び出される::セッションおよびユーザーオブジェクトを正しく初期化した後にセットアップ。

append_sid($ url、$ params = false、$ is_amp = true、$ session_id = false) -リンクを形成するために呼び出されます(セッション識別子を追加します);

$ template-> display($ handle、$ include_once = true) -(まだコンパイルされていない)テンプレートの出力の直前に呼び出されます;

exit_handler() -phpBB3コード実行の最後に呼び出されます。



注: $ template-> displayを使用するトラップは、 $ templateの3番目の引数($ templateオブジェクトへの参照)を取ることができます。これは、グローバルなテンプレートの代わりに使用できます。



phpBB3をアプリケーションに統合した場合は、定数を使用できます。



PHPBB_MSG_HANDLER (メッセージハンドラーの上書き);

PHPBB_DB_NEW_LINK (sql_connectのnew_linkパラメーターを上書き);

PHPBB_ROOT_PATH ($ phpbb_root_pathを上書き);

PHPBB_ADMIN_PATH ($ phpbb_admin_pathを上書き);

PHPBB_USE_BOARD_URL_PATH ($ phpbb_root_pathの代わりに写真にgenerate_board_url()を使用します)。



定数PHPBB_USE_BOARD_URL_PATHが trueに設定されている場合、phpBBはアップロードされたすべての画像に対してgenerate_board_url()(スクリプトパスを含むフォーラムへのリンクを返します)を使用します。 この定数はファイル内にあります。



/includes/session.php-ユーザー:: img()

/includes/functions_content.php-smiley_text ()



また、テンプレート変数のパスも変更します。

{T_THEME_PATH}-スタイル/ xxx /テーマ

{T_TEMPLATE_PATH}-スタイル/ xxx /テンプレート

{T_SUPER_TEMPLATE_PATH}-スタイル/ xxx /テンプレート

{T_IMAGESET_PATH}-スタイル/ xxx / imageset

{T_IMAGESET_LANG_PATH}-スタイル/ xxx / imageset / yy

{T_IMAGES_PATH}-画像/

{T_SMILIES_PATH}-$ config ['smilies_path'] /

{T_AVATAR_PATH}-$ config ['avatar_path'] /

{T_AVATAR_GALLERY_PATH}-$ config ['avatar_gallery_path'] /

{T_ICONS_PATH}-$ config ['icons_path'] /

{T_RANKS_PATH}-$ config ['ranks_path'] /

{T_UPLOAD_PATH}-$ config ['upload_path'] /

{T_STYLESHEET_LINK}-スタイル/ xxx /テーマ/ stylesheet.css(CSSが動的に生成される場合はstyle.phpへのリンク)

新しいテンプレート変数{BOARD_URL}は、ボードURLとスクリプトパスで構成されます。



2.クラス関数およびメソッドでのトラップの使用を許可します


次の例は、phpBB3が組み込みトラップシステムを使用する方法を説明しています。 独自のトラップを登録することに興味があるかもしれませんが、このコードをデモンストレーションすると、トラップシステムをよりよく理解するのに役立ちます...



まず、この例は、トラップをインターセプトできるようにする場合に必要なコードを関数に埋め込む方法を示しています。



  1. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }



  2. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }



  3. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }



  4. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }



  5. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }



  6. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }



  7. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }



  8. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }



  9. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }



  10. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }



  11. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }



  12. function my_own_function ( $my_first_parameter , $my_second_parameter ) { global $phpbb_hook ; if ( $phpbb_hook -> call_hook ( __FUNCTION__ , $my_first_parameter , $my_second_parameter ) ) { if ( $phpbb_hook -> hook_return ( __FUNCTION__ ) ) { return $phpbb_hook -> hook_return_result ( __FUNCTION__ ) ; } } [ ] }







上記のcall_hook関数は、常に関数のパラメーターを使用して呼び出す必要があります。



そしてこの例は、クラスメソッドがトラップをインターセプトする方法を示しています...

  1. クラス my_hookable_object
  2. {
  3. 関数 hook_me $ my_first_parameter $ my_second_parameter
  4. {
  5. グローバル $ phpbb_hook ;
  6. if $ phpbb_hook- > call_hook array __CLASS__ __FUNCTION__ $ my_first_parameter $ my_second_parameter ))
  7. {
  8. if $ phpbb_hook- > hook_return array __CLASS__ __FUNCTION__ )))
  9. {
  10. return $ phpbb_hook- > hook_return_result array __CLASS__ __FUNCTION__ ;
  11. }
  12. }
  13. [コードはこちら]
  14. }
  15. }




ここでの唯一の違いは、最初のパラメーターの定義方法です。 関数の場合、これは__FUNCTION__定数のみであり、メソッドの場合、配列配列(__ CLASS __、__ FUNCTION__)です。 PHP4では、__ CLASS__定数は常に小文字でクラス名を返します。



さて、phpBBには、トラップをインターセプトできる事前定義関数がありますが、それらを使用可能にする方法(したがって、他のユーザーがトラップをインターセプトできるようにする方法)は? これにはadd_hook()メソッドがあります:

  1. //独自の関数を追加します
  2. //トラップをキャッチ
  3. $ phpbb_hook- > add_hook 'my_own_function' ;
  4. //独自のメソッドを追加します。
  5. //トラップをキャッチ
  6. $ phpbb_hook- > add_hook array 'my_hookable_object' 'hook_me' ;


add_hook()と同じパラメーターで$ phpbb_hook-> remove_hook()を呼び出すことで、関数/メソッドでトラップをインターセプトする機能を削除することもできます。 これは、トラップを呼び出さないようにする場合に便利です。



3.トラップロギング


次に、呼び出される関数の定義に移りましょう。 これを行うには、append_sid()関数を例として(この関数はデフォルトのトラップで使用できます)、2つのクラスと関数を作成します:

  1. class my_append_sid_class {
  2. //関数
  3. function my_append_sid $ hook $ url $ params = false $ is_amp = true $ session_id = false {
  4. //前のトラップの可能な結果を​​取得します
  5. $ result = $ hook- > previous_hook_result 'append_sid' ;
  6. return $ result [ 'result' ] 「<br />そして私は2番目でした。」 ;
  7. }
  8. }
  9. //別のクラス
  10. class my_second_append_sid_class {
  11. function my_append_sid $ hook $ url $ params = false $ is_amp = true $ session_id = false {
  12. //前のトラップの可能な結果を​​取得します
  13. $ result = $ hook- > previous_hook_result 'append_sid' ;
  14. echo $ result [ 'result' ] 「<br />そして私は3番目です。」 ;
  15. }
  16. }
  17. //通常の関数
  18. function my_append_sid $ hook $ url $ params = false $ is_amp = true $ session_id = false {
  19. //前のトラップの可能な結果を​​取得します
  20. $ result = $ hook- > previous_hook_result 'append_sid' ;
  21. return '私は最初に呼ばれた' ;
  22. }
  23. // 2番目のクラスの初期化
  24. $ my_second_append_sid_class = new my_second_append_sid_class ;




必ず1つの例外を除いてトラップをフックする関数に対して定義されている関数に同じパラメーターを追加してください。最初のパラメーターは常に&$ hookであり、操作可能なフックオブジェクトへの参照です。



ここで、 $ phpbb_hook-> register()メソッドを使用して、トラップを1つずつ登録します。

  1. //ここで、append_sid関数の「代替」を順番に登録します...
  2. //関数を登録します(最初に呼び出されます)
  3. $ phpbb_hook- > register 'append_sid' 'my_append_sid' ;
  4. //最初のクラスを登録します
  5. $ phpbb_hook- > register 'append_sid' array 'my_append_sid_class' 'my_append_sid' ;
  6. // ..および2番目のクラス
  7. $ phpbb_hook- > register 'append_sid' array $ my_second_append_sid_class 'my_append_sid' ;




この例では、独自の関数を強制的にインターセプトすることもできます。



  1. // phpbbでキャッチされるトラップを登録します
  2. $ phpbb_hook- > register 'append_sid' 'my_own_append_sid' ;
  3. //トラップを傍受する関数を追加します
  4. $ phpbb_hook- > add_hook 'my_own_append_sid' ;
  5. //関数によってインターセプトされるトラップを登録します
  6. $ phpbb_hook- > register 'my_own_append_sid' 'also_my_own_append_sid' ;




特殊加工/チェーン


フック登録メソッドは、特別な連鎖モードを決定するために3番目の引数を受け入れることができます。 値は、 firstlaststandaloneを取ることができます。



$ phpbb_hook-> register( 'append_sid'、 'my_own_append_sid'、 'first')は、チェーンの先頭での関数呼び出しを保証します。 最初のブロック内で複数の関数を呼び出すことができます-ここではFIFOの原理が使用されています。

$ phpbb_hook-> register( 'append_sid'、 'my_own_append_sid'、 'last')は、チェーンの最後での関数呼び出しを保証します。 後者内の複数の関数の呼び出しが可能です-ここではFIFOの原理が使用されています。

$ phpbb_hook-> register( 'append_sid'、 'my_own_append_sid'、 'standalone')は、特定の関数のみが呼び出されるようにします。 他のすべての機能はチェーンから削除され、他の機能はその後チェーンに追加されません。 2つのアプリケーションがスタンドアロンモードを切り替えようとすると、PHP通知が表示され、2番目の関数は無視されます。

オブジェクトのトラップの解決


なぜなら トラップシステムは初期化されたオブジェクトを区別できませんが、クラス自体でのみ動作するため、コードレベルでこれを解決する必要があります。



可能な方法の1つは、プロパティを使用することです。

  1. クラス my_hookable_object {
  2. 関数 blabla
  3. {
  4. }
  5. }
  6. クラス my_hookable_object2 my_hookable_objectを拡張します
  7. {
  8. var $ call_hook = true ;
  9. 関数 hook_me $ my_first_parameter $ my_second_parameter
  10. {
  11. if $ this- > call_hook
  12. {
  13. グローバル $ phpbb_hook ;
  14. if $ phpbb_hook- > call_hook array __CLASS__ __FUNCTION__ $ my_first_parameter $ my_second_parameter ))
  15. {
  16. if $ phpbb_hook- > hook_return array __CLASS__ __FUNCTION__ ))
  17. {
  18. return $ phpbb_hook- > hook_return_result array __CLASS__ __FUNCTION__ ;
  19. }
  20. }
  21. }
  22. 「フックされていない」を 返す ;
  23. }
  24. }
  25. 関数フック $ hook $ first $ second
  26. {
  27. return 'hooked' ;
  28. }
  29. $ first_object = new my_hookable_object2 ;
  30. $ second_object = new my_hookable_object2 ;
  31. $ phpbb_hook- > add_hook array 'my_hookable_object2' 'hook_me' ;
  32. $ phpbb_hook- > register array 'my_hookable_object2' 'hook_me' ' hooking ' ;
  33. // $ first_objectのトラップを呼び出さないでください
  34. $ first_object- > call_hook = false ;
  35. echo $ first_object- > hook_me 'first' 'second' '<br />' ;
  36. echo $ second_object- > hook_me 'first' 'second' '<br />' ;
  37. //出力:
  38. 夢中にならない
  39. 夢中




別の可能性は、関数変数を使用することです(変数をトラップに渡すときに省略できます)。

  1. クラス my_hookable_object {
  2. 関数 blabla
  3. {
  4. }
  5. }
  6. クラス my_hookable_object2 my_hookable_objectを拡張します
  7. {
  8. 関数 hook_me $ my_first_parameter $ my_second_parameter $ hook_me = true
  9. {
  10. if $ hook_me
  11. {
  12. グローバル $ phpbb_hook ;
  13. if $ phpbb_hook- > call_hook array __CLASS__ __FUNCTION__ $ my_first_parameter $ my_second_parameter ))
  14. {
  15. if $ phpbb_hook- > hook_return array __CLASS__ __FUNCTION__ ))
  16. {
  17. return $ phpbb_hook- > hook_return_result array __CLASS__ __FUNCTION__ ;
  18. }
  19. }
  20. }
  21. 「フックされていない」を 返す ;
  22. }
  23. }
  24. 関数フック $ hook $ first $ second
  25. {
  26. return 'hooked' ;
  27. }
  28. $ first_object = new my_hookable_object2 ;
  29. $ second_object = new my_hookable_object2 ;
  30. $ phpbb_hook- > add_hook array 'my_hookable_object2' 'hook_me' ;
  31. $ phpbb_hook- > register array 'my_hookable_object2' 'hook_me' ' hooking ' ;
  32. echo $ first_object- > hook_me 'first' 'second' false '<br />' ;
  33. echo $ second_object- > hook_me 'first' 'second' '<br />' ;
  34. //出力:
  35. 夢中にならない
  36. 夢中




4.結果を返す


関数がインターセプトされた関数で結果を返すか、実行を継続するかを明確に決定する必要があります。 これはアプリケーションの必要性が原因である可能性があり、結果として、トラップによってインターセプトされた関数が結果を返す場合にのみ、関数は結果を返します。



ケースNo. 1-関数実行の結果を返す


次の関数がトラップをサポートすると想像してください。

  1. 関数 append_sid $ url $ params = false $ is_amp = true $ session_id = false {
  2. グローバル $ _SID $ _EXTRA_URL $ phpbb_hook ;
  3. //トラップを使用する開発者は行う必要があります
  4. //グローバル$ _SIDおよび$ _EXTRA_URL自体
  5. //機能し、それらを巧みに管理します。
  6. //ほとんどのコードはここからコピーできます
  7. if $ phpbb_hook- > call_hook __FUNCTION__ $ url $ params $ is_amp $ session_id )) {
  8. if $ phpbb_hook- > hook_return __FUNCTION__
  9. {
  10. return $ phpbb_hook- > hook_return_result __FUNCTION__ ;
  11. }
  12. }
  13. [ ... ]
  14. }




これで関数です。 結果を返した直後に、 append_sid()関数結果返します。

  1. //インターセプトされた関数
  2. 関数 my_append_sid $ hook $ url $ params = false $ is_amp = true $ session_id = false
  3. {
  4. //可能な結果を​​取得します
  5. $ result = $ hook- > previous_hook_result 'append_sid' ;
  6. return '何かを返した後、append_sid()関数は私の結果を返します' ;
  7. }




前述の関数の結果を取得するには、 previous_hook_result()メソッドで常に使用する必要があります。このメソッドは、配列array( 'result' => [your result])の配列を返します。



ケース2-一般的に、私たちは何も返さない


アプリケーションが何かを返す必要がない場合があるため、次の関数は引き続き実行されます。

  1. 関数 append_sid $ url $ params = false $ is_amp = true $ session_id = false
  2. {
  3. グローバル $ _SID $ _EXTRA_URL $ phpbb_hook ;
  4. if $ phpbb_hook- > call_hook __FUNCTION__ $ url $ params $ is_amp $ session_id ))
  5. {
  6. if $ phpbb_hook- > hook_return __FUNCTION__
  7. {
  8. return $ phpbb_hook- > hook_return_result __FUNCTION__ ;
  9. }
  10. }
  11. [ ... ]
  12. }
  13. //インターセプトされた関数
  14. 関数 my_append_sid $ hook $ url $ params = false $ is_amp = true $ session_id = false
  15. {
  16. //可能な結果を​​取得します
  17. $ result = $ hook- > previous_hook_result 'append_sid' ;
  18. [ ... ]
  19. //一部の変数を上書きするだけで何も返さないため、append_sid()関数は何も返しません。
  20. }




注:戻るか返さないかの決定は、トラップのチェーンへの呼び出しの最後にのみ行われます。 例:

  1. //インターセプトされた関数
  2. 関数 my_append_sid $ hook $ url $ params = false $ is_amp = true $ session_id = false
  3. {
  4. //可能な結果を​​取得します
  5. $ result = $ hook- > previous_hook_result 'append_sid' ;
  6. //変数$ resultには値が含まれていません
  7. return 'FILLED' ;
  8. }
  9. //この関数はmy_append_sid()の後にも登録および実行されます
  10. 関数 my_own_append_sid $ hook $ url $ params = false $ is_amp = true $ session_id = false
  11. {
  12. $ result = $ hook- > previous_hook_result 'append_sid' ;
  13. //変数$ resultは 'FILLED'で埋められます
  14. //しかし、なぜなら 何も返さない場合、append_sid()関数は引き続き実行されます
  15. }
  16. //両方の関数を登録する方法
  17. $ phpbb_hook- > register 'append_sid' 'my_append_sid' ;
  18. $ phpbb_hook- > register 'append_sid' 'my_own_append_sid' ;




6.ファイル/クラス/メソッドを埋め込む


一般に、選択できる方法は2つあります。



1)ファイルをinclude / hooks /フォルダーに追加します。 ファイルにはhook_プレフィックスが必要です。 このファイルはcommon.php内で接続し、トラップを登録したり、他のファイルや関数を接続したりできます 必要な場合にのみ他のファイルを接続することをお勧めします(たとえば、関数呼び出し内)。



新しく移動したファイルにphpBB3からアクセスできるようにするには、キャッシュをクリアする必要があることに注意してください。



2)2番目の方法は、トラップ用のフォルダーに特別なファイルを配置する代わりに、phpBB3コードをラップしたい人向けです。 これは通常、アプリケーションファイル内にphpBBファイルを含めることによって行われます。 トラップを登録するには、アプリケーションで関数を作成する必要があります。

  1. //コンストラクター内で実行される私の関数
  2. 関数 phpbb_hook_register $ hook
  3. {
  4. $ hook- > register 'append_sid' 'my_append_sid' ;
  5. }
  6. [ ... ]




元のテキスト




All Articles