【第2回】Drupalカスタムモジュールにてフックを使って既存処理に割り込む

  •  
 
MAXIMUM に投稿

タグ

今回はDrupalのフック関数について解説します。

前回のフォルダ構成で触れた「横から割り込めるフック処理を入れるmarucha.module以外については必須です。」という部分についての深掘りになります。

1. 今回やりたいこと

今回は例としてDrupalに元々存在する検索フォームを置き換えます。 通常の送信ボタンではなく、Marucha検索という表示に変更できます。

2. moduleファイル作成

とりあえず先ずはフック関数がどういう実装になるかですが、下記のようにmarucha_form_alterという感じでモジュール名を入れる必要があります。

hook_form_alter()が元々の形で、Drupalのコア機能が用意しているものになります。

<?php
use Drupal\Core\Form\FormStateInterface;
function marucha_form_alter(&$form, FormStateInterface $form_state, $form_id) {
// $form_idで対象を絞らないと、サイト内のすべてのフォームに影響する。
  if ($form_id === 'search_block_form') {
    $form['actions']['submit']['#value'] = t('Marucha検索');
  }
}

3. 割り込み動作

こういった処理を追加すると画面へ表示する前に関数が呼ばれ、見た目が変わったりします。例えば、標準だと、送信ボタンとしか表示されないものをMarucha検索ボタンに変更するといった具合です。

メイン処理を書き換えることなく、コア依存が高いものでも変更を加えていくような再開発が可能になります。 ※技術的にはコントローラのみで実装するなどの代替手段はありますが、その場合コード行数がコア並みに多くなるため見辛くなります。

4. キャッシュクリア

面倒かもしれませんが、前回同様にキャッシュクリアが必要になります。

下記コマンドを相当するディレクトリ配下で打つとフックのソースコードが適用ということになります。

Macターミナルかつddev環境を前提に例で挙げます。

ddev drush cr

5. 注意点

一応ですが、このフックという書き方はコア依存が強いため、Drupalのバージョンを上げた際の動きがどうなるのかは若干謎です。(アクイアの方針的には後方互換継続)

バージョンアップの際に試験工数が増えるというのはデメリットかもしれません。

6. 感想

セミオーダーメイド的な開発が可能になっており、柔軟に速い開発対応が出来るというのが良いかなと思いました。

また、フック自体のコード量は比較的少なくなりそうなので、実装内容が分かりやすいのも良いなと思いました。

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。