0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DrupalのViewsで、建築のデータベースを作る

Last updated at Posted at 2024-04-06

Drupalに入門中です。
「Designing Connected Content」を読んでいます。

環境

  • Drupal 10.2.5

作りたいサイト

建築のデータベースサイトを想定したテストサイトです。

建築ページと関係者ページの、2種類のページがあり、建築ページには、建築の情報と関係者(建築家や施主)へのリンクがあり、関係者ページには、その人が関わった建築ページへのリンクがあるようなイメージです。

ただし、建築は移築やリノベーションすることがあるので、建築ページの中に、工事のエンティティが複数並ぶイメージです。

作りたいデータベース

以下のようなデータベースを考えました。

コンテンツタイプの作成

おそらく、実際に運用するサイトを作成する場合には、Paragraphsモジュールや、Storage Entitiesモジュールなどを使うのだと思いますが、今回はテストサイトなので、最初からあるコンテンツタイプを使います。
(なので、工事ページが表示されてしまいます。おそらく実運用では、rabbit holeモジュールなどで、ページの表示を消すことになるはずです。)

参照先を先に作らないといけないので、まず関係者タイプから作ります。
「サイト構築>コンテンツタイプ>コンテンツタイプの追加」から、「関係者」(システム内部名称は「persons」)を保存します。
タイトルフィールドのラベルは、氏名とします。
フィールドは、Bodyというラベルのフィールドが最初からあるので、これを人物概要として使います。

次に、同じく「コンテンツタイプの追加」から、「工事」(システム内部名称は「buildings」)を保存します。
タイトルフィールドのラベルは、工事名とします。
Bodyというラベルのフィールドは、関係者のときと同じく、工事概要として使います。
そして、「参照先関係者」フィールドを作ります。
「新しいフィールドの作成>参照>コンテンツ」を選びます。
ラベルを「参照先関係者」とし、システム内部名称は「field_relation_person」として、「継続」ボタンを押します。
参照先は、先ほど作った、関係者のコンテンツタイプを選んでおきます。
関係者は、ひとつの工事に対して複数人いる可能性があるので、「許容する値の数」は無制限にしておきました。

次に、同じく「コンテンツタイプの追加」から、「建築」(システム内部名称は「architectures」)を保存します。
Bodyは、関係者や工事と同じです。
参照先工事も、工事のときと同じ方法で作成します。
ラベルは「参照先工事」とし、システム内部名称は「field_relation_building」としました。
参照先は、工事のコンテンツタイプにします。

Viewsの作成

Viewsというのは、Drupal独特のもので、WordPressでいうところのWP_Queryを管理画面から編集できるようにしたもののようです。(まだいまいち理解できていません)

建築から工事と、工事から関係者は、参照フィールドがあるので、Viewsを作らなくても画面に表示されます。
しかし、関係者ページに、それを参照先としている建築ページの一覧を表示するには、Viewsと、そのリレーション及びコンテクスチュアルフィルターを使わないといけません。

リレーション及びコンテクスチュアルフィルターについては、「リレーションシップとコンテクスチュアルフィルターを知ろう」が参考になりました。

以下、手順を説明します。

「サイト構築>ビュー>ビューを追加」から、追加します。
ビューの名前は、「関係者から見た建築一覧」とし、システム内部名称は「arch_list_from_person」としました。
「ビューの設定」は、タイプ指定を「建築」としました。
同時に、ブロックを作成し、保存します。

ビューができたら、「高度」を選びます。
まず、「リレーション」を追加し、先ほど指定した参照フィールドを選択します。
「field_relation_buildingから参照されているコンテンツ」と、「field_relation_personから参照あれているコンテンツ」の2つです。
(なお、「使用しているコンテンツ」という選択肢もありますが、こちらではうまくいきませんでした。)

そして、field_relation_personの方は、さらにfield_relation_buildingへリレーションさせてください。
(自分で書きながら、とても分かりにくいのですが、これはLEFT JOINさせる順番の話です。先に、field_relation_buildingをLEFT JOINさせ、それからさらに、field_relation_personをLEFT JOINさせる必要があります。)

次に、「高度>コンテクスチュアルフィルター」を追加します。
「ID」を選び、「field_relation_personコンテンツ」にリレーションさせます。
「フィルター値が利用可能でないとき>デフォルトの値を設定」を、「URLから取得したコンテンツID」に設定します。

コンテンツの作成

ここまで設定が長かったですが、いよいよコンテンツを作成します。

今回は、西園寺公望別邸である坐漁荘を入力してみたいと思います。
坐漁荘を選んだ理由は、県をまたいだ移築や復元があって、建物の経緯が複雑だからです。
なお概要説明は、ここでの主旨ではないので簡略化しています。

「コンテンツ>コンテンツを追加」から、以下のとおり入力していきます。

建築エンティティ

  • 建築名:坐漁荘
  • 建築概要:数奇屋造りの建築です
  • 参照先工事:坐漁荘、坐漁荘(明治村)、興津坐漁荘

工事エンティティ

工事1

  • 工事名:坐漁荘
  • 工事概要:1920年に、静岡県に建てられました
  • 参照先関係者:西園寺公望

工事2

  • 工事名:坐漁荘(明治村)
  • 工事概要:1970年に、愛知県の明治村に移築しました
  • 参照先関係者:

工事3

  • 工事名:興津坐漁荘
  • 工事概要:2004年に、静岡県で復元されました
  • 参照先関係者:

関係者エンティティ

  • 氏名:西園寺公望
  • 人物概要:日本の政治家です

レイアウトビルダーの設定

関係者ページに、Viewsで作ったブロックを配置します。
レイアウトビルダーを使います。

「サイト構築>コンテンツタイプ>関係者>フィールドの管理>表示管理」と進んでいくと、「レイアウトのオプション」から「レイアウトビルダーを使用」が選べます。(選べない場合は、機能拡張でLayout Builderを有効化する必要があります)

「保存」すると、「レイアウト管理」ボタンが出てくるので、それを押します。
「ブロックを追加」し、先ほど作成したViewsを選択します。

完成品

以下のとおり出来上がりました。
CSSを当てていないので、見た目は悪いですが、きちんとデータがリンクされていました。

ただ、工事ページへのリンクも出てきてしまっており、これを消す方法は、よく分かりませんでした。
おそらく、レイアウトビルダーなどでできるのではないかと思ったのですが、どこを設定しても、リンクが消えませんでした。

建築ページ(坐漁荘のページ)

建築ページのスクリーンショット

関係者ページ(西園寺公望のページ)

関係者ページのスクリーンショット

終わりに

Drupalは、用語も独特で難しく、なかなか思ったとおりになりせんでした。
とくにViewsについては、今のところあまり恩恵を感じられず、PDOなどを直接書いた方が、まだましな印象です。

また、参照フィールドを使うと、その関係性を書くところがなくなってしまいます。
本当は、新築時の坐漁荘と西園寺公望の関係は、施主なので、その情報も入れたいところです。
おそらく、何らかの表現方法があると思うのですが、まだよくわかっていません。

もう少しいろいろと読んだり、調べたりしてみようと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?