2
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?

More than 5 years have passed since last update.

【CraftCMS】エントリフィールドをキーとしてエントリを取得する

Last updated at Posted at 2019-05-02

ちょっと何言ってるか分からない

誰もこんなことやらねーよな事案かもしれないが実際あったケースなので残す。

エントリフィールドを持つ、とあるセクションのエントリを起点として
そのフィールドに登録されているエントリを取得する

たった1文で3回エントリという言葉が出て非常にややこしいので図解

名称未設定.jpg

親エントリとして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も不適切なのかもしれないが
何度も検証を重ねて**ヨシ!!**という結論に至ったので一旦良しとしているのである…

2
0
3

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
2
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?