アイキャッチ画像: デスクの上でパソコンを使用している

Drupal.org の「サブテーマ」と「テーマの継承」に関する記事を翻訳してご紹介できればと思います。

Drupal をビジネスユースで使う場合、テーマはオリジナルのものを作成して使う形が一般的です。 オリジナルのテーマを作成すると Drupal としての制約はほぼなくなるためサイトデザインを柔軟に作りこむことができますが、一方で、オリジナルのテーマをゼロから作るという作業には大きな時間がかってしまいます。 また、ゼロベースで同じようなテーマを何度も作っていると「車輪の再発明」や「反 DRY の原則」的な部分が多く出てきてしまい、エンジニアのモチベーションダウンにもつながりかねません。 そんな問題を解消してくれるのが、上述の「テーマの継承」という Drupal のシステムです。

今回はそのテーマ継承に関するページの日本語訳となります。 Drupal 開発で避けては通れないテーマ開発の話題ですので、多くの Drupal エンジニアの方に参考にしていただけるのではないかと思います。 テーマ作成に慣れた方も未体験の方もご参考にしていただけると幸いです。

今回の翻訳元のページはこちら。

翻訳時点で最新の2014年06月16日更新のバージョンをもとにしています。

例のごとく、読みやすさ・使いやすさを意識し、ところによっては意訳ところによっては直訳としています。 原文の厳密な正確なニュアンスが知りたい方はぜひ原文の方にあたってみてください。

では、以下が翻訳文となります。

サブテーマの作成

サブテーマ( sub-themes )は他のテーマとよく似ていますが、異なるポイントがひとつあります。 親テーマのリソースを継承するという点です。 サブテーマと親テーマをつなげるテーマのチェイン能力には限界はありません。 サブテーマは他のサブテーマの子になることができますし、枝分かれさせることもできて、あなたの好きなように構成することができます。 これが、サブテーマの大きなポテンシャルの源です。

ワイヤフレームとしてデザインされたベーステーマから始め、サブテーマ側でディティールを埋めていく状況を想像してください。 こういう状態であれば、同じワイヤフレームから別のサブテーマを枝分かれさせれば、また別のデザインを試すことができます。 マルチサイトインストールを利用していて、一貫性のあるルック&フィールにしたい場合はどうでしょうか? サブテーマを使うことで、デザイン要素の多くを共有することができます。 サイト固有の変更点は個別のサブテーマで設定し、共有の要素は一度だけ設定してすべてのインストール先に適用するといったことが可能です。 注意深くプランを立てれば、可能性に限界はありません。

サブテーマの作成

サブテーマは、親テーマからもらった固有の内部名称(つまり Drupal に使われる名前)を持ちます。 この名前には空白や特殊文字を使うことはできません。 サブテーマの名前は英字始まりですべて小文字もしくは数字と _ (アンダースコア)で構成する必要があります。 このサブテーマの内部名称を「 my_subtheme 」としましょう。

my_subtheme フォルダ

サブテーマはサブテーマフォルダの中に配置しましょう。 このフォルダはサブテーマの内部名称と同じ名前(例えば my_subtheme )にしましょう。

サブテーマフォルダは sites/example.com/themesexample.com はあなたのサイト名を表します )フォルダの中に置くようにしましょう。 複数のサイトで使いたいサブテーマは sites/all/themes に置きましょう。 (たとえば sites/example.com/themes/my_subthemesites/all/themes/my_subtheme とします。)

my_subtheme.info ファイル

あなたのテーマが他のテーマのサブテーマであることを宣言するには、 my_subtheme.info ファイルを my_subtheme フォルダの中に置く必要があります(「 my_subtheme 」はサブテーマの内部名称を表すことを思い出してください)。 もっともかんたんな方法は theme_name.info ファイルを親テーマからコピーして次の 1 行を my_subtheme.info に追加し、親となる「ベーステーマ」を宣言する方法です(「 theme_name 」は親テーマの内部名称を表します。)。 「 theme_name 」は親テーマの内部名称に変更してください(つまり、親テーマの .info ファイルの名前です。たいていすべて小文字のものです。)。

base theme = theme_name

また、 name = で始まる行を変更して人間向けの名前を変更したり、 description = で始まる行を変更し説明文を変更したりするとよいでしょう。 たとえば:

name = My sub-theme
description = This is a sub-theme of theme Bartik, made by John for the web site example.com (red, responsive).
core = 7.x
base theme = bartik

以下のセクションで示すように、サブテーマはベーステーマのほとんどのプロパティを継承します。 重要な例外は、リージョン( region )とコアバージョン、カラー( color )情報です。 おそらくあなたはベーステーマの info ファイルのリージョンセクションとコアバージョンの宣言部をコピーしたいと思うでしょう。 ベーステーマがカラーモジュールをサポートしていて自分のサブテーマでもサポートしたい場合には、ベーステーマのカラーフォルダをコピーして次のようなベーステーマの info ファイルの 1 行を自分のサブテーマの info ファイルに追加したいと思うことでしょう。

stylesheets[all][] = css/colors.css

この場合は、あわせて colors.css をベーステーマからサブテーマ内の css フォルダにコピーするようにしましょう。

スタイルシートの継承

親テーマで定義されているスタイルシートは、サブテーマの .info ファイルで最低ひとつ以上宣言されていれば継承されます。 親テーマのスタイルシートの継承を行うには、最低でもひとつのスタイルシートを宣言する必要があります。

継承されたスタイルシートのオーバーライド: サブテーマの中で同じファイル名のスタイルシートを指定してください。 たとえば、親テーマから継承された style.css をオーバーライドするには、サブテーマの .info ファイルに次の 1 行を追加してください。

stylesheets[all][] = style.css

そして、スタイルシートファイル style.css も作成する必要があります。 インポートされたスタイルを単に無効にしたい場合は、空のファイルを作れば大丈夫です。

JavaScript の継承

親テーマで定義された JavaScript はすべて継承されます。

継承された JavaScript のオーバーライド: サブテーマで同じファイル名の JavaScript ファイルを指定してください。 たとえば、親テーマから継承された script.js をオーバーライドするには、サブテーマの .info ファイルに次の 1 行を追加してください。

scripts[] = script.js

そして、 script.js ファイルも作成する必要があります。 インポートされたスクリプトを単に無効にしたい場合は、空のファイルを作れば大丈夫です。

Template.php の関数の継承

親テーマの template.php ファイルで定義されたものはすべて継承されます。 これはテーマ関数のオーバーライドプリプロセス関数、その他ファイル内のすべてのものを含みます。 サブテーマには加えて固有の template.php ファイルを持つことができ、関数を追加したり、親テーマの関数をオーバーライドしたりすることができます。

template.php には大きく 2 種類の関数: テーマ関数のオーバーライドプリプロセス関数 があります。 テンプレートシステムはこれら 2 種類の関数をまったく違う方法で扱います。

テーマ関数はテーマのいろんなところ( 「 [hook] 」や $var など)で呼び出されます。 サブテーマがテーマ関数をオーバーライドするとき、そのテーマ関数の他のバージョンはひとつも実行されません。

一方、プリプロセス関数は .tpl ファイルの処理前に呼び出されます。 たとえば、 [テーマ]_preprocess_page は page.tpl.php が描画される前に呼び出されます。 テーマ関数とは異なり、プリプロセス関数はサブテーマでオーバーライドされません。 代わりに、親テーマのプリプロセス関数が先に呼ばれ、サブテーマのプリプロセス関数がその次に呼ばれる形になります。

親テーマの関数の継承をすべて止める方法はありません。 上で述べたとおり、親テーマのテーマ関数を上書きすることはできます。 しかし、親テーマのプリプロセス関数を削除する方法は、唯一、 hook_theme_registry_alter() を使う方法だけです。

ページ・ノード・ブロックとその他のテンプレート( .tpl.php )ファイルの継承

Drupal はテーマがリソースを継承することのできるファイルをたくさん用意しています。 特定のファイル名や構造を指定することで、テーマはテンプレートをオーバーライドしたり継承したりすることができます。 もっと詳しい情報は「テンプレートサジェスチョンを扱う」のページをご覧ください。

Drupal 7 親テーマの .tpl.php ファイルはすべて継承されます。 さらに細かな設定をするためにテンプレートを追加することができます。 たとえば、継承された node.tplphp の上に node--blog.tpl.php を作成するといった具合です。

- (ハイフン)ひとつは単語の区切りとして使われます: たとえば、「 user-picture.tpl.php 」や「 node--long-content-type-name.tpl.php 」など。 ですので、 -- ダブルハイフンこそが -- の前に来るものをより明確にオーバーライドするために使われるものとなります。 もっと詳しい情報は「 6.x テーマの 7.x への変換」のページをご覧ください。

Drupal 6: 親テーマの .tpl.php ファイルはすべて継承されます。 しかし、テンプレートファイルに細かな設定を加えるためには、より一般的なテンプレートファイルを親テーマから手作業でコピーしてこなくてはなりません。 たとえば、サブテーマで node-blog.tpl.php テンプレートを追加したい場合は、 node.tpl.php を親クラスからコピーしてこなくてはなりません。 このバグは Drupal 7 では修正されましたが、 Drupal 6 では修正されないことになっています

継承された .tpl.php テンプレートのオーバーライド: サブテーマフォルダの中に親クラスのものと同じ名前のテンプレートファイルを追加し、親テーマからのテンプレートをオーバーライドさせてください。

スクリーンショット・ロゴ・ファビコンの継承

親テーマのスクリーンショットは継承されます。 親テーマのロゴ( logo.png/logo.jpg )も継承されません。 親テーマのファビコン( favion.ico )も継承されません

継承されたスクリーンショットのオーバーライド: サブテーマの .info ファイルで新しいメージファイルを指定してください。

リージョン( region )の継承

サブテーマは親クラスからカスタムリージョンを継承はしません。 カスタムリージョンを使っている場合は、リージョンの宣言部を親テーマの .info ファイルからコピーしましょう。 サブテーマの page.tpl.php ファイルがサブテーマのリージョン設定にマッチするように注意が必要です。

フィーチャー( features )の継承

Drupal 6 では、デフォルトとは異なるフィーチャーセットを使用している場合は、これらはベーステーマから継承されません。 デフォルト以外のフィーチャーを使っている場合は、フィーチャーの宣言を親テーマの .info ファイルからコピーするようにしましょう。

カラー( color )の継承

カラーディレクトリの Color.module サポート は継承されません。

Theme の設定の継承

高度なテーマ設定の theme-settings.php を通して行うテーマの設定は、親テーマの .info ファイルから設定の宣言をコピーしないかぎり継承されません。

例: Color モジュールを利用する Garland のサブテーマの作成

・・・以上です。 いかがだったでしょうか?

モジュール開発に比べると単調になりがちなテーマ作成作業ですが、テーマ継承の仕組みを活用すればシンプルかつエレガントにサイトの骨組みとなる HTML テンプレートを生成することができます。