Drupal 8初心者講座

この記事の目次

前回までで、コンテンツ管理の基盤となるコンテンツタイプとタクソノミーの仕組みを見てきました。これまでは暗黙的にページとして表示されるコンテンツ(Drupal ではノードと呼びます)を前提に議論してきましたが、Drupal のコンテンツには、もうひとつブロックと呼ばれる形態があります。ノードには固有のパスが割り当てられますが、ブロックはパスとは関係なく、例えばサイドメニューや広告など、任意のページの一部として埋め込まれます。今回はブロックの扱いについて見ていくことにしましょう。

ノードとブロック

Drupal でページ上に出力される情報(コンテンツ)は、次のいずれかの形で管理されます。

ノード

Drupal でページや記事などのコンテンツを作成すると、それらはすべてノードとして保存されます。ノードとは、Drupal におけるコンテンツの保存単位で、ノード の識別番号 (ノードID)、作成日時、更新日時、リビジョンなど、共通の仕様に基づく属性を持っています。コンテンツの構造はコンテンツタイプによって変わりますが、ノードとしての属性は共通です。また、作成したノードには固有の URL が割り当てられ、インターネット上で一意に識別することができます。

ブロック

他方ブロックは、ページ内の区画に表示されるひとまとまりのコンテンツ要素です。ノードが固有の URL を持ち、それ自体が独立したページとして表示されるのに対し、ブロックはページに埋め込まれたコンテンツ要素として表示されます。コア標準のブロックモジュールを使用して静的なマークアップをブロックとして定義できるほか、メニュー、パンくず、検索、ログイン…等さまざまな機能を提供するブロックの実装が存在し、その出力を任意の位置に配置して利用することができます。イメージとしては、ノードが Web ページの本文、ブロックはその周囲に表示されるメニュー、バナー、ブログパーツ等の表示要素に対応するものと考えるとわかりやすいでしょう。

このブロックを配置するページ内の区画をリージョンといいます。Drupal のコアシステムは、デフォルトで次のようなリージョンを定義しています。

image1

Drupal コアのデフォルト リージョン

こうしたリージョンの構成や各リージョンの表示レイアウトを定義するのがテーマです。

テーマとリージョン

テーマとは、コンテンツの表現(Presentation)をつかさどる Drupal の構成要素で、最終的な HTML のマークアップを定義するテンプレートやスタイルシート、JavaScript 等を組み合わせて Web ページの体裁や UI の操作性を実装する一種のプラグインソフトウェアです。

このテーマに含まれるテンプレートでリージョンが定義されます。テンプレートは最終的に出力されるページの HTML マークアップのひな形を与えるものですが、この中に動的コンテンツが展開される変数を埋め込んだものがリージョンの実体です。テンプレート内の埋め込み位置によってリージョンのレイアウトが決まります。Drupal 8 では Twig というテンプレートエンジンを利用するので、リージョンの埋め込み部分も Twig の文法に従って記述します。

image2

Twig テンプレートの例

こうして定義したリージョンにブロックをはめ込んでいくことで、コンテンツのレイアウトを設定します。ブロックには可視性を制御する仕組みも標準で用意されており、言語、コンテンツタイプ、ページの URL、閲覧中のユーザー等に基づいて、ブロックの表示/非表示を制御することで、閲覧時の状況に応じて選択的にブロックを表示させることができます。同じリージョンに複数のブロックを並べることもできますから、同じリージョンに、状況によって異なるブロックを表示する、といったことも簡単にできます。

Drupal には、Panels や Display Suite など、コンテンツをレイアウトするためのより高度なソリューションも用意されています。現状これらはコアには含まれていませんが、テンプレートを編集することなく、管理画面上の操作のみで多様なレイアウトを定義したり、より細かな条件に基づいて可視性を制御したりできるので、プロジェクトによっては欠かせない機能になっています。標準ブロック以外のレイアウト手法については、Think IT の連載記事の 「【Drupal 8入門】ブロックレイアウトとコンタクトフォーム作成」 も参考にしてください。

また、現時点ではリリースされていませんが、Drupal 8.5 以降、レイアウトビルダと呼ばれる機能がコアに含められる予定です。これが利用できるようになると、コアの標準機能だけで、より高度なコンテンツのレイアウトが可能になるでしょう。

DrupalCon Vienna の Driesnode でのデモ

どの手法を利用するのが適切かはケースバイケースで、プロジェクトの規模や複雑さ、メンテナンスの条件等に応じて判断する必要があります。いずれにしても、ブロックシステムは Drupal の最も基本的なコンテンツレイアウト機能であり、今後も使い続けられていくことに変わりはありません。以下では、Drupal 8 でブロックを管理する操作を見ていくことにしましょう。

レイアウトビルダについてはこちらの記事もご覧ください。「Drupal 8.5.0 リリース: 新機能や変更点を8.4と比較

Drupal 8 のブロックシステム

ブロックレイアウト

ブロックをレイアウトする管理画面が 「ブロックレイアウト」 です。

image3

ブロックレイアウト

Drupal 8 では、同じブロックを異なる複数のリージョンに配置することもできます。カタログの中から目的のブロックを選び、ブロックのいわば "表示窓" を生成して、リージョンにはめ込むイメージです。はめ込む要素はブロックの複製ではなく "表示窓" ですから、各ブロックの機能やデータが共有されます。たとえば、1つのブロックを編集して内容を変更すると、他のすべての同じブロックの配置先にも反映されます。

image4-1image4-2

「ブロックレイアウト」 画面で行う操作のイメージ

ブロックタイプ

Drupal 8 のブロックは、ノードと同様、種々のフィールドを追加して独自の型を作ることができます。これをブロックタイプといいます。初期状態では本文フィールドだけからなる基本ブロックのみですが、これとは別の独自のブロックタイプを定義し、何度でも再利用することができます。

image5

ブロックタイプのフィールド管理画面

カスタムブロックライブラリ

定義済みのブロックタイプを元に作成したブロックはカスタムブロックとして保存されます。作成済みのカスタムブロックの一覧を表示する画面が 「カスタムブロックライブラリ」 です。ここから、既存のカスタムブロックを編集したり削除したりできます。

image6

「カスタムブロックライブラリ」画面

具体的な操作手順については、Think IT 連載記事の 「【Drupal 8入門】ブロックレイアウトとコンタクトフォーム作成」 にまとめていますので、実際に操作する際にはそちらを参照してください。

まとめ

今回は、コンテンツをレイアウトするための最も基本的な標準機能であるブロックシステムを紹介しました。コンテンツの配置先となる区画としてのリージョン、そこに格納されるコンテンツ出力としてのブロック、およびテーマとの関係を理解いただけたでしょうか。次回は、特定の条件でコンテンツを抽出するクエリビルダである Views を取り上げます。