logo

パレット - カラフルに🎨

Palette — ビジュアルページビルダー、デザインの専門知識は不要です。

ライブデモ パレットをダウンロード

Scroll

9.2. Drupal で「フック」とは何を意味するのか?

23/09/2019, by mikhail

この記事は Drupal に慣れてもらうためのもので、カスタムモジュールを追加した後、さらにコード例を書いていきます。

Drupal は、すべてが完璧で何も変える必要のないモノリシックなシステムではありません。顧客からあれこれの機能をサイトに追加するよう頼まれることは非常によくあります。Drupal のコアコードを維持しつつ Drupal に機能を追加できるように、モジュールを使います。モジュールシステムを使うと、Drupal の機能を拡張できます。しかし、既成の contrib モジュールの機能を拡張する必要がある場合はどうでしょうか?もちろん、drupal.org でイシューを作成して必要な機能の改良をリクエストでき、おそらく 1 か月、2 か月…1、2 年後に、特定のモジュールで必要な機能を得られます。しかし、別の方法で行動し、必要なコードを自分で書くこともできます。Drupal の追加モジュールや Drupal 自体の機能を拡張するために、独自のモジュールでフックとプラグインを使います。

主なアイデアは、Drupal のコードや追加モジュールのコードを維持する必要がないということで、これによりプログラマーの作業に対する支払いを大幅に節約できます。モジュールと Drupal のコードを簡単に更新できるように、Drupal のコアと contrib モジュールに変更を加えてはいけません。さもないと、次にモジュールや Drupal コアが更新されるときに、あなたのすべての変更が消去されます。

モジュールと Drupal コアの相互接続、そしてモジュール同士の相互接続のために、Drupal にはフックシステムがあります。フックは関数のコールバックです。つまり、コードの実行がフックに達すると、私たちがモジュールで追加する私たちの関数のコードが追加されます。したがって、さまざまなコンテンツタイプのユーザーデータ、メニュー、タクソノミー、ノードを、変更、追加、削除、あるいは単に読み込みや表示の際に、いつでも処理できます。Drupal 8 のフックはかなり多いですが、Drupal 7 と比べればすでに少なくなっています。多くのフックがサードパーティの symfony コンポーネントを通じて実装されました:

https://api.drupal.org/api/drupal/core%21core.api.php/group/hooks/8.2.x

7 番目のバージョンを見ると、長い間下にスクロールしなければなりません:

https://api.drupal.org/api/drupal/includes%21module.inc/group/hooks/7.x

しかし、これは Drupal 8 の力が弱くなったことを意味するのではなく、Drupal 7 のフックで実装されているすべてのものが、Drupal 8 ではそのために適切なプラグインを追加する必要があるということです。

Drupal 8 のフックのリストを注意深く見ると、名前の末尾に _alter が付いているのがわかります。これは、このフックが変数の値を変更するために設計されていることを意味します。例えば:

hook_form_alter() - Drupal での処理中にフォームの配列を変更できます。後で、Drupal でフォームが配列からどう生成されるかを分析します。このフックをモジュールで適用するには、他のフックと同様に、単に関数を書きます:

function mymodule_form_alter() {
  // change the form array
}


例を簡略化し、関数の引数や namespace は書きませんでした。とりあえず、フックがどう動作するかを理解する必要がある間は、それを理解していきます。Mymodule は私たちのモジュールで、hook という単語の代わりに私たちのモジュールの名前を書くと、関数が自動的にフォーム配列を拾って変更します。どう動作するのでしょうか?prepareForm メソッドで、別の alter() メソッドが呼び出されます:

$this->moduleHandler->alter($hooks, $form, $form_state, $form_id);

これは、hook_form_alter() を実装する Drupal の各モジュールが、この場所に独自のコードを挿入することを意味します。したがって、Drupal のどこかにコードを追加する場合、まず最初にすべきはフックを通じて、次にプラグインを通じて、そしてそれがもう完全に contrib モジュールを変えずには不可能な場合にのみ、モジュールにパッチを当てる/ハックする/変更する(残念ながら、そうしなければなりません)ことです。今のところ、プラグインの変更を必要とするタスクには直面していないので、独自のモジュールの書き方を学びましょう。