2022/12/6

リファレンスタグをテンプレートで処理するときは parseRefs フィルターを利用する #craftcms

これは Craft CMS Advent Calendar 2022 6日目の記事です。


先日のエントリでリッチエディタ(Redactor)で共通の値を使い回す話を書いた。

テキストエリアのフィールドで使う場合はどうするか、という話。

ひとまずはこのような感じでリファレンスタグを使えばグローバルの値を参照することができる。

Reference Tags | Craft CMS Documentation | 4.x
https://craftcms.com/docs/4.x/...

まぁ、この {globalset:262:testText1} をどうやって取り出すのかというのはあるが。

定義としては {<Type>:<Identifier>:<Property>} ということらしいので、、、

Identifier についてはグローバルの設定画面で

URLが /admin/settings/globals/262?site=default こんな感じなので 262 ということがわかる。

設定値をこのグローバルに集約しておけば、あとは Property の所をフィールドのハンドルにすることで使うことができる。

テンプレート側で出力するときは

<h2>test textarea 1</h2>
{{ entry.testTextarea1 }}

で出力すると、リファレンスタグがそのままでてしまうので、

テンプレート側に

<h2>test textarea 1</h2>
{{ entry.testTextarea1|parseRefs|raw }}

こんな感じで parseRefs フィルタと raw フィルタを追加することで処理される。

Filters | Craft CMS Documentation | 4.x
https://craftcms.com/docs/4.x/...
raw - Documentation - Twig - The flexible, fast, and secure PHP template engine
https://twig.symfony.com/doc/3...

改行も反映させたいときは nl2br フィルタを付けるかんじで。

<h2>test textarea 1</h2>
{{ entry.testTextarea1|parseRefs|raw|nl2br }}

リファレンスタグを取得するのが若干難しいので、リッチエディタで使った方がよさそうな印象。

GraphQL で利用する場合

テキストエリアに入っている値を GraphQLで取得する場合は parseRefs の directive を利用する。

https://craftcms.com/docs/4.x/...

こんな感じのクエリで @parseRefs を付ける

query{
  entries(section:"testStructure"){
    title
    ... on testStructure_default_Entry{
      testEditor
      testTextarea1 @parseRefs
    }
  }
}

これでちゃんと Reference Tags が展開されて取得できる。


改めてドキュメントを見ていたら、 GraphQL API 部分のディレクティブが増えてるような気がする。

List of available directives
https://craftcms.com/docs/4.x/...

これはありがたい話だ。