Drupalのテーマシステムについて [D7]
Drupal の特徴のひとつは高性能なテーマシステムを備えていることです。たいへんに柔軟性が高くさまざまなサイト・システム構築に対応できますが、反面複雑で、理解するにはそれなりの困難が伴います。ここではDrupalのテーマシステムについて簡単な説明をしていきます。
Drupalシステム=ロジック+プレゼンテーション
CMSで独自デザインのサイトをつくるには、テンプレートのカスタマイズを行います。Drupalでも同様ですが、Wordpressなどの一般的なCMSと比べると「テンプレート」の意味合いが少し異なっています。
Drupalでは機能の拡張を行うとき、ロジックレイヤ(データ処理)とプレゼンテーションレイヤ(画面表示)を明確に分けることになっています。テンプレートはプレゼンテーションレイヤを構成する主要な部品であり、データを画面に表示するプログラムなのです。使いやすくするために「テンプレート」という形式になっていますが同じことをPHPの関数で実装することも可能ですし、ロジックレイヤとの間に割り込んで表示データの構造を変更することもできるなど、とても汎用性の高いシステムになっています。
ロジックレイヤは主に「モジュール」として実装されます。またプレゼンテーションレイヤは主に「テーマ」として実装されます。ロジックとプレゼンテーションがきれいに分離していれば、どのようなモジュール・テーマの組み合わせであっても一貫した画面表示を行う、汎用性の高いシステムをつくることができま す。
この汎用性を実現するためにDrupalのプレゼンテーションレイヤ(テーマシステム)は複雑な構成になっています。ここでその概要を見てみましょう。
Drupalの処理の流れ
図はDrupalの処理の流れを簡単に示したものです。
- まずユーザがWebページにアクセスします。要求されたページデータを指定するURLはWebサーバを介してDrupalに伝えられ、Drupalの処理がスタートします。
- リクエストURLはDrupalのメニューシステムで解析され、対応するPHP関数(ページコールバック関数)が呼び出されます。
- ページコールバック関数はデータベースアクセスやデータ計算などの処理を行います。
- ページコールバック関数が処理結果を画面に表示するとき、直接HTMLのコードを出力することはしません。そのかわりに「レンダリング配列」と呼ばれるデータ構造を構築して出力します。
- レンダリング配列はDrupalのシステムによりテーマレイヤに渡されます。レンダリング配列を表示する前段階の処理を行い、最後にテンプレートにレンダリング配列を渡します。
- テンプレートはレンダリング配列の内容もとにHTMLのコードを組み立て、出力します。
Drupalのページは、本文やフォーム要素など、多くの部品(エレメント)で構成されています。リクエストされたページを構成している全てのエレメントに対してこのような処理を繰り返し、返されたHTMLコードをひとつにまとめて、Webサーバのレスポンスとしてユーザに返します。
Drupalのテーマカスタマイズ
Drupalのテーマカスタマイズ作業は、いくつかのレベルに分けられます。
レベル1 スタイルシートのカスタマイズ
テーマを構成するスタイルシートや画像だけをカスタマイズするレベルです。Drupalのテーマが出力するHTMLタグには、状況に応じてさまざまなクラス名がつけられますので、スタイルシートのカスタマイズだけでも一般的なサイトであれば十分に対応することが可能です。Drupal内部の知識はあまり必要ではなく、もっともデザイナーよりのカスタマイズと言えるでしょう。
レベル2 テンプレートのカスタマイズ
テンプレートファイルやテーマ関数などをカスタマイズするレベルです。デザインによってはHTMLタグ構成の変更をしたいこともありますので、このような時に必要になってきます。
テンプレートファイルの変更ならば、基本的なPHPの知識があれば可能です。テーマ関数の変更にはそれなりのプログラミングの知識が必要となってきます。
HTMLタグの変更程度であればテンプレートファイルの変更で十分に対応できますので、多少のPHPの知識さえあればデザイナーでも対応可能なレベルと言えるでしょう。
レベル3 レンダリング配列の操作
Drupalの処理の中で、モジュールが行うデータ処理の結果はレンダリング配列としてテーマシステムに渡されます。テーマシステムはレンダリング配列に対していくつかの前処理を行いますが、そのとき特定の名前の関数(フック関数)を各モジュールやテーマの中から探し、見つかればレンダリング配列を引数にして呼び出します。フック関数の中では渡されたレンダリング配列を変更してテーマシステムに戻すことができます。
たとえば特定のページでは一部のエレメントを表示しないとか、エレメントに独自のクラス名を追加するなどの操作を行うことができるわけです。
このような操作にはプログラマーとしての知識が必要になりますが、高度なカスタマイズにも対応することができます。カスタマイズの内容によってはこのレベルでの対応を考えるべきでしょう。
このようにDrupalのテーマカスタマイズはさまざまなレベルで行うことができます。システムのコアで実装されているテンプレートであってもオーバーライドすることができますので、デザイン上の制限はほぼないと言うことができます。