web-dev-qa-db-ja.com

Drupalで独自のフックを作成できますか?

他のDrupalモジュールが消費するDrupalモジュールにyour ownフックを作成することは可能ですか?そうでない場合、サードパーティの開発者がフックを提供するためのメカニズムがDrupalにありますか?すべてがそれほど遠くない場合、フックのリストはコアのどこに実装されていますか?

私が理解しているように、Drupalモジュールは hooks というシステムのようなイベントで機能します。新しいモジュールを作成するときは、フックを実装する関数を作成します。たとえば、hook_deleteフックがあります。モジュールに関数を実装する場合

function mymodule_delete($node)
{
}

この関数は、ノードが削除されるたびに呼び出されます。

私が知りたいのは、サードパーティのモジュール開発者として自分自身フックを作成する方法または私がいるということです。他のモジュール開発者がこのフックをサブスクライブできるように、hook_alanskickbutthookのようなものを言います。

これが可能な場合、どのように行いますか?私は公式ドキュメントを見回しましたが、そこには多くが見つかりませんでした。Drupalソースコードを調べ始めたときも、少しめまいがします(再帰は理解していますが、十分な時間をかけて考えていません再帰的な問題)。完全な解決策は歓迎されますが、私は正しい方向に向けられることを嬉しく思います。

33
Alan Storm

Module_invoke_all()は、独自のフックを作成するためのチケットです。

aPIを参照してください。

http://api.drupal.org/api/drupal/includes--module.inc/function/module_invoke_all

そして、この素晴らしい記事を見てください:

http://web.archive.org/web/20101227170201/http://himerus.com/blog/himerus/creating-hooks-your-drupal-modules

(編集: http://himerus.com/blog/himerus/creating-hooks-your-drupal-modules にありましたが、これはなくなりました)

フックを作成したら、次を使用して別のモジュールで呼び出すことができます。

/**
 * Implementation of hook_myhookname()
 */

function THISMODULENAME_myhookname(args){
  //do stuff
}
37
jpstrikesback

たとえば、他のユーザーが使用できるようにhook_my_custom_goodness()を作成したいとします。次に、このようなコードを、フックを発生させたい場所のモジュールに配置します。

$variables['msg'] = 'foo';

// Make sure at least one module implements our hook.
if (sizeof(module_implements('my_custom_goodness')) > 0) {
  // Call modules that implement the hook, and let them change $variables.
  $variables = module_invoke_all('my_custom_goodness', $variables);
}

drupal_set_message($variables['msg']); // Will display 'bar' instead.

さて、誰かがあなたのフックを使いたければ、次のように自分のモジュールで使うことができます:

/**
 * Implements hook_my_custom_goodness().
 */
function SOME_OTHER_MODULE_my_custom_goodness($variables) {
  $variables['msg'] = 'bar';
  return $variables;
}

ここでより完全な説明があります:

http://tylerfrankenstein.com/code/drupal-create-custom-hook-for-other-modules

6

Drupal 6&7の場合、 drupal_alter() がおそらく最良のオプションです。

module_invoke_all()のドキュメント で述べたように、

すべての引数は値で渡されます。参照によって引数を渡す必要がある場合は、drupal_alter()を使用します。

Drupal 8では、 ModuleHandler :: alter を使用します。

変更可能な変数を特定のhook_TYPE_alter()実装に渡します。

0
colan

もし思い出したら... http://api.drupal.org/api/drupal/modules--node--node.api.php/function/hook_delete/7

これは役に立ちますか? Drupalをいじってからしばらく経ちました。

カスタムDrupalフックを作成/提供するには、module_invokeまたはmodule_invoke_allでフックを呼び出しても他のモジュールフックと競合しないように実装する必要があります。フックの名前は一意である必要があります。そして、それはコードでどんなタイプの調整も必要としないような一般的な方法ですべて/特定の機能を提供するべきです。すべての設定は管理ページに行き、それらの設定を別のテーブルまたは=によって作成された既存のテーブルに保存する必要がありますDrupalまたはモジュールが依存するモジュール。フックは他のモジュールで実装するのが簡単で、実装がそれほど複雑であってはなりません。カスタムフックを作成するとき、モジュールは機能します( s)APIプロバイダーとして。

0
Brian