2019-06-03

同じセクション内で自エントリを選択しているエントリを取り出す #craftcms

同じセクション内で、エントリAが別のエントリBを選択している場合に、エントリB側でエントリAを取り出すというのをやってみた。

【CraftCMS】エントリフィールドをキーとしてエントリを取得する - Qiita
https://qiita.com/SHIN_DEVELOP...

@BUN がコメントしてる内容を参考にさせてもらって動いた。

ドキュメントサイトとしては以下のリレーションの説明の中の「行列を経由する」が参考になった

リレーション | Craft 3 ドキュメント
https://docs.craftcms.com/v3/j...

今回の対象が Matrix に持たせてあるブロックなので。

CMSのフィールド構成

構成(hundle)としては

セクション:article
本文部分を管理するMatrixフィールド:articlebody
記事選択のブロック:rel_article

記事詳細ページ用のテンプレートで処理するので以下のような感じで取り出す。

{% set relatedEntries = craft.entries.section('article').relatedTo({
    targetElement: entry,
    field: 'articlebody.rel_article'
  }).all() %}

例えば別のテンプレート(記事を一覧表示させてるとか)であれば

{% set hoge = craft.entries.section('article').id(5943) %}

{% set fuga = craft.entries.section('article').relatedTo({
  targetElement: hoge,
  field: 'articlebody.rel_article'
}).all() %}

こんな感じでまず id 指定など(slugとかタイトルとか)で取り出したものをtargetElement に指定すればよい。

エントリの選択関係と表示状態

このエントリで

MacBookAir のキーボードを修理に出した | mersy note
https://note.mersy418.com/arti...

以下のエントリを選択している。

MacBook をキーボードの修理にだした | mersy note
https://note.mersy418.com/arti...

管理画面

表示側

関連記事として表示する

あとはそれを取り出して表示させる。

最終的にはこんな感じで。

{# 自分を参照しているエントリがある場合はそれを表示 #}
  {% set relatedEntries = craft.entries.section('article').relatedTo({
    targetElement: entry,
    field: 'articlebody.rel_article'
  }).all() %}

  {% if relatedEntries %}
  <div class="card">
    <div class="card-header">関連記事リスト</div>
    <ul class="list-group list-group-flush">
    {% for entry in relatedEntries %}
      <li class="list-group-item"><a href="{{ entry.url }}">{{ entry.title }}</a></li>
    {% endfor %}
    </ul>
  </div>
  {% endif %}

https://note.mersy418.com/article/mn-macbook

targetElement, sourceElement 慣れないと理解しづらいけど使いながら覚えていきたいところ。