ちょっと何言ってるか分からない
誰もこんなことやらねーよな事案かもしれないが実際あったケースなので残す。
エントリフィールドを持つ、とあるセクションのエントリを起点として
そのフィールドに登録されているエントリを取得する
たった1文で3回エントリという言葉が出て非常にややこしいので図解
親エントリとしてAというセクションがあり
子エントリBでは親エントリを選択するエントリフィールドがある
エントリBのページを開いた時にエントリAの情報を取得したいがためであった
ページ構成としては
http://xxxx.jp/エントリA.slug/エントリBの一覧/エントリB
エントリAのページがあってそれぞれ子エントリにBがぶら下がってるケース
エントリAはカテゴリでよかったんじゃ?というのもあるが
投稿データをカテゴリとして増やしていくのはなんか違うと思ったからである
肝心のソースは?
まずエントリBの一覧をどうやって引っ張ってくるかであるが
理屈としてはエントリフィールドにエントリAが登録されているエントリBを全部取得である
簡単そうで難しい、まずエントリAのセクションを取得するところから
これはURL定義からsegmentの2番目(Indexとしては1)がslugなので単に文字列を取得することで解決
セクション moyashi をエントリA群、セクション nira をエントリB群とする
{% set parent_slug = craft.app.request.getSegment(1) %}
これをネタにエントリAを取得する
{% set parent_entry = craft.entries.section("moyashi").slug(parent_slug).one %}
エントリAを取得出来たらそれを紐づけているエントリB群を取得する
ここがリファレンス見てもよく分からず、またも中の人に泣きついて教えてもらった
relatedToを使えば出来るよ!
それ使ってみたけど出来なかったよ…
↓最初に書いた処理
{% set entriesB = craft.entries.section("nira").relatedTo("moyashi:" ~ parent_entry).all %}
そもそもrelatedToメソッドがどういうデータを取得するのかドキュメント読んでてもよく分からないのである
ちなみに↑これでも一応それっぽいデータを引っ張ってきてはいたが、
slugが違うのに微妙に似てるエントリも取ってきてしまうポンコツ記述であった
(よく分かんなかったのでSearchみたいなもんかな?ってノリで書いた)
で、たどり着いた正解がこちら
{% set entriesB = craft.entries.section("nira").relatedTo({targetElement : parent_entry}).all %}
配列でtargetElementに親エントリを指定すると良いとのことだった。うーん、難しい。
非常にありがたいことにリレーションの資料は日本語化もされている
が
ストレートに直訳されている部分も多いので結局どういうことなのか分からなかった
- 返されるエレメントが、渡したエレメントとソースまたはターゲットのどちらで関連付くかを気にしない場合、elementを使用します
- 与えられたエレメントのソースとして関連付くエレメントだけを見つけたい場合、sourceElement を使用します
- 与えられたエレメントのターゲットとして関連付くエレメントだけを見つけたい場合、targetElement を使用します
つまりどういうことだってばよ?
本当はtargetElementも不適切なのかもしれないが
何度も検証を重ねて**ヨシ!!**という結論に至ったので一旦良しとしているのである…