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などを直接書いた方が、まだましな印象です。
また、参照フィールドを使うと、その関係性を書くところがなくなってしまいます。
本当は、新築時の坐漁荘と西園寺公望の関係は、施主なので、その情報も入れたいところです。
おそらく、何らかの表現方法があると思うのですが、まだよくわかっていません。
もう少しいろいろと読んだり、調べたりしてみようと思います。