2020-05-21

間接的に関連づけられているエントリを関連付けられているエントリとして表示する #craftcms

西山さんのこちらの記事を読んで。

MovableType.netで記事(ウェブページ)を関連付けしてみた | www.ni4.jp
https://www.ni4.jp/2020/05/20-110300.html

MTAppjQuery の宣伝もありがとうございます!(笑
次のリリースでこの辺につかえそうな機能追加もある予定だけど。

MovableType.net はどんどん機能追加されっててるなぁ。
さすがです!!


西山さんが書いてたこの辺の話。

なんとなく mt:RelatedEntries の入れ子みたいなのでいけるんじゃないのかなぁという気がしつつ、試してないのでその辺は @hei_a に期待というかんじで(笑

関連付けされているエントリが関連付けている他のエントリを取り出す

このブログでもエントリ書く時に関連記事選択のブロックをおいて関連付けするようにしている。

これは基本的に一方向なので相互に関連付けする感じにはしていない。
相互に関連づけるのはこの辺のプラグインとかだったかな。

Reverse Relations
https://plugins.craftcms.com/r...

今なら GraphQL でやるかもな。

一方向で関連付けしておきつつ、逆のパターンは自エントリを参照している物を表示するようにしている。

これで自エントリを参照している状態のエントリは取り出しているので、そのエントリが関連づけているエントリを取り出せば、見た目上は西山さんがやろうとしてた感じのことはできるかなぁということで試してみる。。

Feedme をつかってエントリのフィールドを一括で編集する
が関連づけているエントリが
・「Craft CMS の lightswitchフィールドの値
・「Craft CMS で lightswitch がONのエントリを取り出す
・「MT のエントリを Craft CMS に移行する

Craft CMS の lightswitchフィールドの値
が関連づけているエントリはなく、関連づけられているエントリは
・「Feedme をつかってエントリのフィールドを一括で編集する
・「RSSに配信するかどうかのフィルタを追加する

Craft CMS で lightswitch がONのエントリを取り出す
が関連づけているエントリは
・「Craft CMS で特定のタグがついているものを除外して記事リストを作成する
関連づけられているエントリは
・「Feedme をつかってエントリのフィールドを一括で編集する
・「RSSに配信するかどうかのフィルタを追加する
・「Craft CMS の Matrix フィールドで特定のフィールドの値が一致するエントリをループで取得する

Craft CMS の lightswitchフィールドの値」と「Craft CMS で lightswitch がONのエントリを取り出す」は相互に関連付けしたりしていないので、ここができるようになるイメージ。

自エントリを関連づけているエントリの部分

は先のエントリにもある感じで

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

で取得したものを表示している。

この relatedEntries から関連づけているエントリを取り出す。

{% set thisEntryid = entry.id %}
{% set relatedEntryIds = [] %}
{% for entry in relatedEntries %}
  {% set relatedEntryIds = relatedEntryIds|merge([entry.id])|unique %}
  {% for block in entry.articlebody.type('rel_article').all %}
    {% set block_rel_article = block.rel_article.all() %}
    {% for rel in block_rel_article | filter( rel => rel.id != thisEntryid ) -%}
      {% set relatedEntryIds = relatedEntryIds|merge([rel.id])|unique %}
    {% endfor %}
  {% endfor %}
{% endfor %}

relatedEntries ループで relatedEntryIds にエントリIDを merge していく。

merge - Documentation - Twig - The flexible, fast, and secure PHP template engine
https://twig.symfony.com/doc/2...

ただ、他のエントリでも同様のエントリを merge していく場合があるかもなので unique フィルタを追加しておく。

Filters | Craft 3 Documentation
https://docs.craftcms.com/v3/d...

エントリの中で関連付けをしているマトリックスのブロック rel_article のみを取り出してループする。

Matrix Block Queries | Craft 3 Documentation
https://docs.craftcms.com/v3/d...

こちらも同様に merge, unique していく。

ループする時に自エントリは入れる必要がないので

{% for rel in block_rel_article | filter( rel => rel.id != thisEntryid ) -%}

filter を入れて処理する。

filter - Documentation - Twig - The flexible, fast, and secure PHP template engine
https://twig.symfony.com/doc/2...

色々と @tinybeans @BUN に教えてもらいながら完成。

これで対象となる id が取り出せたのであとは id をループしてエントリを表示する。

西山さんが考えてた関連付けという意味ではちょっと違うけどとりあえずということで。

LiteSpeed Cache 動いてるからその辺更新されないと記事には反映されない気もする。

テンプレート書かないとすぐ忘れるのでちょこちょこ書いてないとだなー。