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

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

## 環境

- Drupal 10.2.5

## 作りたいサイト

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

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

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

## 作りたいデータベース

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

```plantuml
@startuml test
hide circle

entity "建築" as architectures {
id
--
建築名
建築概要
参照先工事
}
entity "工事" as buildings {
id
--
工事名
工事概要
参照先関係者
}

entity "関係者" as persons {
id
--
氏名
人物概要
}

architectures ||--|{ buildings
buildings }|--|{ persons
@enduml
```

## コンテンツタイプの作成

おそらく、実際に運用するサイトを作成する場合には、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と、そのリレーション及びコンテクスチュアルフィルターを使わないといけません。

リレーション及びコンテクスチュアルフィルターについては、「[リレーションシップとコンテクスチュアルフィルターを知ろう](https://www.studio-umi.jp/blog/7/789)」が参考になりました。

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

「サイト構築＞ビュー＞ビューを追加」から、追加します。
ビューの名前は、「関係者から見た建築一覧」とし、システム内部名称は「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を当てていないので、見た目は悪いですが、きちんとデータがリンクされていました。

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

### 建築ページ（坐漁荘のページ）
![建築ページのスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310353/1be8f884-567e-a22f-ba76-ef230ac7be54.png)

### 関係者ページ（西園寺公望のページ）
![関係者ページのスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310353/bdfb6624-445f-e8db-fcb2-a19e46317894.png)

## 終わりに

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

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

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