category

GraphQL のクエリを Craft CMS のテンプレート(twig)で扱う #craftcms

2020-02-26

Craft CMS のデータをまとめて整理するのに Feed Me をつかってインポート・上書きで綺麗にしたい。そのためになにかいい感じにデータを書き出す方法はないものかなぁと考えてた。

標準のエクスポートはだいぶ良くなったけど、 Feed Me にいれるにはちょっと形式的にいけていなさそうなところがありそうな感じ。

テンプレートでエントリの一覧を出すように普通にかいて JSON 形式にすればいいんだろうけど、それはちょっと(面倒だ)なぁと思いつつ、、、

Element API を使えばできそうだけど、PHP書かないとなー、、、と。 @BUN に使い方教えてもらって少し理解は進んだけど。(これも若干面倒)

そもそも GraphQL があるんだしなんかいい方法ないものかなぁと。

Feed Me は JSON や XML の URL を指定する必要があるので、URLベースで GraphQL のクエリ含めて管理できて、そのURLにアクセスするとレスポンス返してくれるようなものがあればいいなぁ、、、と。

そんなことを思って色々調べてたら、そもそも Craft CMS のテンプレートで GraphQL のクエリが使えるようになっていた。

Running GraphQL Queries in Craft Twig Templates -… | CraftQuest
https://craftquest.io/courses/...
Functions | Craft 3 Documentation
https://docs.craftcms.com/v3/d...

へー!!!知らなかった!!

GraphiQLで確認

管理画面で、とりあえずクエリを試してみたのがこんな感じ。

入力タイプとかマトリックスの補完とかがだいぶ便利になってきた気がする。

テンプレート

テンプレートはこんな感じでクエリをかいて渡すだけ。

{% header "content-type: text/json" %}

{% set articles = gql('{
  entries(section:"article"){
    title
    ... on article_article_Entry
    {
      sampleText
      sampleRadio
      samplerelateion {
        id
      }
      sampleMatrix{
        ... on sampleMatrix_image_text_BlockType {
          heading
          asset {
            id
          }
          body
        }
      }
    }
  }
}') %}

{{ articles|json_encode() |raw }}

これでこんなかんじで JSON が出力できる。
(スキーマ側の設定は必要)

いやー、これは便利だ。

何が便利に感じるかは人それぞれなところはあるけど、これはこれでありがたい。

GraphQL の書き方的には入力タイプ、マトリックスのところの書き方がやはり鬼門にはなると思うけど、そこさえいければどうにかなると思う。


そういう使い方があるかどうかはおいといて、セクションでクエリを管理するようにして、slugを自由に決めれば一意のURLにアクセスしたら、指定したクエリのレスポンスを受け取れるというのが作れるわけかー。

サービスとかであればいいな、というのがサクッとできそうだ。
使いたい人はいなそうだけど(笑

もともとやりたかったデータの整理とかは未着手だけど、 gql を知れたのはよかった。
ちゃんとリリースノートを熟読するようにしよう。