Drupal モジュール開発コトハジメ

 さる 4月12日に、京都は安井金比羅宮にて開催された DrupalCamp in Japan vol.1 Kyoto にて「Connecting Nulab’s services to Drupal 〜つなぐ、つなげる Drupal とヌーラボのサービス〜」というタイトルにて、ヌーラボの各サービス Backlog、Cacoo、Typetalk と Drupal を連携させる Drupal のモジュールについて紹介させていただきました。イベント全体については Think IT さんにもレポートが出ておりますので、是非ご参照ください。

Drupal Camp 2014 Kyoto

このエントリでは、発表後に頂いた

「Drupal はサイト構築から初める人は多いけれど、プログラミングから入る人は少ない。どういったやり方をしたのか?またどう感じたか?」

という質問に対し、会場ではお答え出来なかったところも含めいまいちどやった事を整理してご紹介したいと思います。

 1. 全部入り環境で雰囲気を掴む

まず、SQLite のデータファイルも含んだ Drupal が丸ごと入ったアーカイブをコミュニティの方からいただいて、それをローカルの Mac で動かすところからはじめました。初期設定も全て SQLite に入った状態でしたので、アーカイブを展開した後は、以下のような設定をするだけでローカルで動かすことが出来ました。( ブラウザアクセス用に /etc/hosts に 127.0.0.1      test.drupal  の追記もしました )

<VirtualHost *:80>
    ServerAdmin test@example.com
    DocumentRoot /Users/someda/ws/test.drupal
    ServerName test.drupal
    ErrorLog "/private/var/log/apache2/test.drupal-error_log"
    CustomLog "/private/var/log/apache2/test.drupal-access_log" common

    <Directory /Users/someda/ws/test.drupal>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride all
        Order deny,allow
        Allow from 127.0.0.1
    </Directory>

</VirtualHost>

その後、この環境をベースにDrupal 7.x 向けのモジュール開発チュートリアルを読みながらひたすら写経です。これによって、まず基本的なモジュール開発の雰囲気を掴むことが出来ました。

インストールやセットアップでつまづく事なく、簡単なモジュール開発を体験し、素早く雰囲気を掴むことが出来ました。

2. Drupal 7 Module Development を読む

モジュールを開発するにはコレ、とおススメされ「Drupal 7 Module Development」を読みました。洋書ではありますが、初心者でも読めるような配慮がなされており、読み進めるのにストレスは感じませんでした。ただ、それなりにボリュームがあるので、自分のモジュール開発に必要そうな、

  • Chapter 1: Developing for Drupal 7 
  • Chapter 2: Creating Your First Module 
  • Chapter 3: Drupal’s Theme Layer 
  • Chapter 4: Theming a Module 
  • Chapter 5: Building an Admin Interface
  • Chapter 10: JavaScript in Drupal 

を読み進め、残りの章は冒頭だけ読んで何が書かれているか把握するに留めておきました。

一度チュートリアルでモジュールを作っていたので、はやる気持ちもあり遠回りにも思えましたが、これを読んだおかげで Drupal モジュールの全体像や Theme との関係など、全体を大づかみすることが出来たので、結果として後に実際の開発時間を短縮することが出来たと思います。

3. Vagrant (+Ansible) で開発環境を構築

今回の作業で唯一 得意だったのがココです。全部入り環境は便利だったものの、何か失敗した時にはスクラッチからやり直したいことも発生します。その場合に Mac のローカル環境に手を入れてしまうとやり直しがしにくくなるため、Vagrant+Ansible で VirtualBox 上に仮想環境を作って、いざというときには簡単に Drupal のインストールからやり直せる状態を作りました。こちらについては、開発したモジュールとともに以下の GitHub のリポジトリに公開してあります。

この環境の工夫点は、Vagrant の Synced Folder という機能を使って、以下のように Mac 側の www というローカルのディレクトリを、VirtualBox 側の Drupal のディレクトリと同期をとっている点です。

  config.vm.synced_folder "www/", "/srv/www/", :owner => "www-data", :mount_options => [ "dmode=775", "fmode=774" ]

このおかげで、モジュール開発はローカルの Mac 上の www 以下のファイルを通常通りエディタで編集し、その結果を VirtualBox 上の仮想環境を通して確認することが出来ます。アップロードの手間が必要なくテンポよく開発を進めれます。このアイディアは、Wordpress 向けの Varyant Vagrant Vagrants (VVV) を参考にしました。

また、Vagrant Sahara プラグインを入れて、ちゃんと稼働しているキリの良い状態になったら、Git でコードをコミットするのと同時に Sahara でも以下のように環境をコミットしておきます。例えばコミットする時は以下のようにします。

git add .
git commit -m "some module done" 
vagrant sandbox commit

 そして、設定変更や自分のコードのせいで真っ白な画面になった時にも、Sahara でロールバックし、Git のコードも例えば未コミットの場合は stash に退避したり、以前のコミットに reset する事で、簡単に以前の稼働する環境に戻ることが出来ます。( Git については、「サルでも分かる Git 入門」もどうぞ )

# ここでは未コミットの変更を stash に退避
git stash save
vagrant sandbox rollback

初めてのフレームワークなど、不慣れな環境での開発ではデバッグもままならない事が多いので、簡単に「動いていた状態」に戻せる仕組み作りは有用だと思います。また、このやり方自体は、モジュール開発だけでなく、テーマの開発でも活用できそうに感じています。

 4. いよいよ開発

ここまでで下準備は整ったので、後はいよいよ開発です。この開発の時に役に立ったのが、Examples モジュールです。Examples モジュールには特定の処理に絞ってコンパクトにまとめられているので、やりたい事がはっきりしている場合はまずこちらを眺めてみるのがおススメです。

  • action_example ( Typetalk の通知処理の実装 )
  • xmlrpc_example ( Backlog の API 呼び出しの実装 )

また、開発の作業全体を通じて役にたったのが、drupal.org の API リファレンスです。通常のリファレンスとしても有用なのですが、検索時にサジェストが効くので、これによって幾つか知らなかったフックを知る事ができました。

drupal.org api reference

 例えば、上の図のように、hook_form_alter を調べようとしていたときに、hook_form_FORM_ID_alter という hook があることをこのサジェストのおかげで知る事ができ、それを利用することでコード内での分岐なしにシンプルにフックを記述することが出来ました。

その他にも豊富なモジュールも参考になりました。Backlog Contact Form は既存の Contact モジュールをフックで拡張しただけですし、Typetalk でも内部の API 呼び出しには OAuth2 Client モジュール をほぼ例のまま使っています。

下準備に時間をかけたということもありますが、 こういった沢山のサンプルのおかげもあって、発表でお話した通り三つのモジュールを一日で創り上げることができました。


最初はフックで処理を追加するというのが正直ピンとこなかったのですが、そのあたりの世界観が掴めると開発は進めやすくなったように思います。また、hook_*_alter のような仕組みによる既存の処理の上書きなどは独特で、ドキュメントを読むだけではピンとこなかったのですが、実際にモジュールを拡張してみると「なるほど」と納得できるものでした。基本的に処理の拡張ポイントが数多く提供されているので、記述量を抑えつつ、色々な事が出来るモジュールを作りやすくなっているように感じました。

Drupal 8 では少し開発スタイルも変わるようなので、引き続きそのあたりもウォッチしておきたいと思います。Enjoy Drupal !

より良いチームワークを生み出す

チームの創造力を高めるコラボレーションツール

製品をみる