Drupalのモジュールを作ってみよう - ハローワールド

Drupalのモジュールを作ってみます。
とはいえ、右も左もわからないのでとりあえず何か「モジュール」と呼べる最低限のモノを作ってみます。
いわゆるハローワールドですね。

ハローワールドモジュールの詳細

画面に「Hello World!」と表示する

忙しい人向け

忙しい人のために結果だけ先に書いておきます。忙しい人向けというか、後で自分で参照するときのためです。

cd /var/www/drupal
mkdir sites/all/modules/helloworld
vi sites/all/modules/helloworld/helloworld.info
name = ハローワールド
description = 世界に笑顔で挨拶をする程度のモジュール
core = 6.x
vi sites/all/modules/helloworld/helloworld.module
<?php

function helloworld_menu() {
  $item['helloworld']= array(
    'title' => 'ハローワールド',
    'page callback' => 'helloworld_helloworld',
    'access arguments' => array('access content'),
  );
  return $item;
}

function helloworld_helloworld() {
  return '<p>Hello World !</p>';
}

モジュールのディレクトリを作る

Drupalのモジュールというのは全てディレクトリ単位でまとめられていて、モジュールを構成するファイルたちは全て一つのディレクトリの中に詰め込まれています。
これから作るハローワールドモジュールにもディレクトリが必要なので、ディレクトリを作ってあげます。

mkdir sites/all/modules/helloworld


Drupalのトップディレクトリに「modules」といういかにもな名前のディレクトリがあるのですが、そこに作るのではなくて「sites/all/modules」というディレクトリに作るのがよいみたいです。
何がどう良いのかはよくわかりませんが、多分元から入ってるモジュールと後から追加したモジュールがわかりやすいように分けてるのだと思います。

.infoファイルを作る

helloworldモジュールのディレクトリができあがったわけですが、これだけではまだモジュールとして認識されないようです。
モジュール名.infoという名前のファイルを作らないといけません。
今作っているのは「helloworld」という名前のモジュールなのでhelloworld.infoという名前でファイルを作成します。

vi sites/all/modules/helloworld/helloworld.info


これは設定ファイルのようなもので、モジュールについての説明とか他モジュールとの依存関係とかを書くファイルなのだそうですが、ハローワールドの精神にのっとって必要最低限のことだけ書いてみることにします。
こんな感じ

name = ハローワールド
description = 世界に笑顔で挨拶をするモジュール

nameというのはモジュールの名前。descriptionというのはモジュールの説明です。
本当は英語で書いて翻訳ファイルというものを作るのだそうですが、面倒なので直接日本語で書いてしまいました。国際社会を舞台にグローバルなウンタラでカンタラする人は英語で書くのがよいと思います。

.moduleファイルを作る

モジュール名.moduleという名前のファイルを作ります。
今作っているのは「helloworld」という名前のモジュールなのでhelloworld.moduleという名前でファイルを作成します。

vi sites/all/modules/helloworld/helloworld.module


このファイルが、Drupalモジュールの本体になるファイルです。
拡張子は「module」ってなってますが、中身は純然としたphpのプログラムファイルです。
今回は最低限のことしかやりたくないので、これだけ書いておきます。

<?php

モジュール一覧を確認

ここまでで1つのディレクトリと2つのファイルを作成しました。ここまでやって初めてモジュールがDrupalに認識されます。それでは認識されたモジュールを確認してみましょう。ドキドキしますね。そうでもないですか。

モジュールの名前と説明が画面に表示されました。やりましたね。


しかしよーく見ると、なんだか怒られてるみたいです。
「このバージョンはDrupalコアのバージョン 6.4 と互換性がありません」
赤い標識みたいなので×マークまで出てます。こいつが邪魔してモジュールを有効にすることができません。これは困りました。


あと、モジュール名がめちゃくちゃに折り返されて表示されています。

なんだかイヤな感じです。「英語の読めない日本人はWordPressでも使ってろm9(^Д^)プギャー」 ということですね。わかります。

.infoファイル再び

Drupalトップディレクトリの「modules」に入っていた他のモジュールを参考にして、helloworld.infoに以下の一行を追加。

core = 6.x


ファイル全体で見るとこんな感じになりました。

name = ハローワールド
description = 世界に笑顔で挨拶をする程度のモジュール
core = 6.x


再度モジュール一覧を確認してみると

おおー。警告が消えてる。


これでようやくハローワールドモジュールを有効にすることができるようになりました。helloworld.moduleに何も書いていないので、モジュールを有効にしても何も起こらないのですが、とにかくモジュールっぽいものができました。パチパチパチ。個人的にはここまでできて大満足で自分を褒めてあげたい有森裕子なのですが、画面に「HelloWorld!」と表示するという目標を書いてしまったのでもう少しがんばります。

.moduleファイルの中身

ちょっと上の方でも書きましたが、「モジュールが何を行うのか」という根本的なことを書くのがモジュール名.moduleファイル(以下「モジュールファイル」)です。
モジュールファイルの中にはPHPのプログラムを書きます。具体的には「モジュール名_」から始まる名前の関数を延々と書いていきます。この関数が「フック」と呼ばれているものです。フックはDrupal本体から様々なタイミングで呼び出されて実行されます。


helloworld.module

<?php

function helloworld_menu() {
  $item['helloworld']= array(
    'title' => 'ハローワールド',
    'page callback' => 'helloworld_helloworld',
    'access arguments' => array('access content'),
  );
  return $item;
}

function helloworld_helloworld() {
  return '<p>Hello World !</p>';
}


実際の中身は↑のようになります。

メニューフック

helloworld_menu()関数はメニューのフックです。Drupalがメニューを表示する際に呼ばれます。

function helloworld_menu() {
  $item['helloworld']= array(
    'title' => 'ハローワールド',
    'page callback' => 'helloworld_helloworld',
    'access arguments' => array('access content'),
  );
  return $item;
}

この関数は連想配列連想配列を返します。
外側の連想配列はURLをキーに、メニュー項目を値に持つようにします。
内側の連想配列はメニュー項目を表す連想配列です。

title メニューに表示される文字列
page callback リンクをクリックすると呼ばれる関数
access arguments このメニュー項目を選択することのできる権限

access argumentsに指定した権限access contentは、「コンテンツを見ることができる」権限で、これは匿名ユーザーにも与えられている権限です。これにより我らがハローワールドモジュールは、誰でもアクセスできるメニュー項目としてメニューに追加されます。

page callbackで関数を指定したので、その関数を定義します。ここでいよいよ最初の目的であった「ハローワールド」の出力が可能になります。いやあ長い道のりでした。

function helloworld_helloworld() {
  return '<p>Hello World !</p>';
}

コールバック関数は文字列を返します。Drupalはこの関数から文字列を受け取って画面に表示するわけですね。

確認

メニューに「ハローワールド」という項目が追加されました。



メニューから「ハローワールド」をクリックすると、以下のように表示されました。

わーわー!

気がついたこと

モジュールファイルを変更、保存して、その後Drupalサイトの上で「F5」を押しても変更が反映されなかったりします。原因はよくわかりませんが(多分キャッシュ機能みたいなのが働いてるんじゃないかな)、これはモジュールを一度無効にして、その後有効にすると反映されるのですが・・・毎回やるのは面倒くさいなあ。