5

Drupalフックを特定のモジュールに結び付けるものは何ですか?

Drupal 7では、すべてのコアモジュールに「api」ファイルがあります

$ ls modules/*/*.api.php
modules/aggregator/aggregator.api.php   modules/openid/openid.api.php
modules/block/block.api.php             modules/overlay/overlay.api.php
modules/comment/comment.api.php         modules/path/path.api.php
modules/contextual/contextual.api.php   modules/rdf/rdf.api.php
modules/dashboard/dashboard.api.php     modules/search/search.api.php
modules/field/field.api.php             modules/shortcut/shortcut.api.php
modules/field_ui/field_ui.api.php       modules/simpletest/simpletest.api.php
modules/file/file.api.php               modules/system/system.api.php
modules/filter/filter.api.php           modules/system/theme.api.php
modules/help/help.api.php               modules/taxonomy/taxonomy.api.php
modules/image/image.api.php             modules/trigger/trigger.api.php
modules/locale/locale.api.php           modules/update/update.api.php
modules/menu/menu.api.php               modules/user/user.api.php
modules/node/node.api.php

これらの各ファイルには、呼び出されることのない(?)関数が含まれていますが、他のモジュール(サードパーティを含む)が実装できるフックの存在を文書化しています。

File: modules/path/path.api.php
function hook_path_delete($path) {
  db_delete('mytable')
    ->condition('pid', $path['pid'])
    ->execute();
}

私の質問:特定のフックを特定のモジュールに結び付けるものは何ですか?path_deleteフックがpath.api.phpファイルに含まれているのはなぜですか?entity_viewフックがsystem.api.phpファイルに含まれているのはなぜですか?これは事実の整理の後でただ恣意的ですか、それとも特定のフックを特定のモジュールに結び付ける何かがDrupalシステムにありますか?または、他の何か?

4

2 に答える 2

5

module_invoke()フックはandを使用して呼び出されmodule_invoke_all()ます。これら2つの関数のコードを見ると、どのように機能するかをまとめることができるかもしれませんが、基本的に、これをモジュールのコードに追加すると、次のようになります。

// Other code

$foo = module_invoke_all('foo_bar', $var1, $var2);

// More code

Drupalはhook_foo_bar($var1, $var2)、有効なモジュールで見つかったすべての実装を呼び出します。これに基づいて、特定のフックを特定のモジュールに結び付けるのは命名規則だけであることがわかります。モジュールを呼び出す場合foo、フック関数は。で始まる必要がありhook_foo_ます。

モジュールの呼び出しは*.api.php単なる関数呼び出しであるため、モジュールの作成者はfoo.api.php、フックの実装方法を実装者に通知するための文書化の目的でのみ含まれています。

たとえば、上記の場合、foo.api.php次のようなサンプル関数が含まれます。

/**
 * Doxygen comments documenting the function goes here
 */
function hook_foo_bar($var1, $var2) {
  return $var1 + $var2;
}

しかし、モジュールの実装者として、私はhook_foo_bar()別の方法で実装することができます。

function mymodule_foo_bar($var1, $var2) {
  return $var1 - $var2;
}

そして、module_invoke_all()呼び出されると、Drupalは実装モジュールの短い名前( )と( )にmymodule渡されたフック名を使用して関数を作成し、定義した関数を呼び出します。module_invoke_all()foo_barmymodule_foo_bar()

コアのsystemモジュールはちょっとしたキャッチオールです。Drupal8の1つのタスクは、モジュールを強制終了し、その機能を他のモジュールに委任することです。

于 2011-02-15T05:52:32.763 に答える
0


Drupalのフックを学ぶことができるかもしれませんか?簡単です:
http

://api.drupal.org/api/drupal/includes--module.inc/group/hooks/7 hook_path_deleteについて:
path.moduleを見てください。どこかにpath_delete(...)呼び出しがあります。
たとえば、path_node_update()では、この関数が呼び出され、現在のパスを変更します。ノードの新しいパスを作成するよりも、前に古いパスを削除します。
次に、定義されたpath_delete()関数がpath.incファイルのどこに配置されているかを確認します。
この関数では、次のように表示されます。module_invoke_all('path_delete'、$ path); -この関数は何をしますか?
これは、hook_path_deleteが定義されているすべてのモジュール(drupal 7ではキャッシュされている)を一覧表示し(前に示したように、yiuカスタムモジュールの場合はYOURMODULENAME_path_deleteとして定義され、ここにも含まれます)、これらすべての関数を1つずつ実行します(実行順序モジュールの重みとファイル名で定義されます)。
では、カスタムモジュールで何ができるでしょうか?この削除反応に応答して、他のいくつかのアクションを実行できます。たとえば、そのノードのパスを複製するために使用できる他のパスを削除します(これは単なる例です)。

psカスタムモジュールを開始するための良い点:http://drupal.org/contributors-guide

于 2011-02-15T04:51:31.733 に答える