Craft CMS の Matrix(マトリックス、行列)フィールドでブロックに紐付いているフィールドの値をまとめて取得する方法をご紹介します。
下図のように2つのブロックタイプを用意した行列フィールド(以下「マトリックス」といいます)があります。フィールドハンドルは bpGlobal
とします。
このマトリックスは、グローバルの「サイト設定」(ハンドル名は siteConfig
)として作ってあるとします。
これを普通に Twig で取り出すと下記のようになると思います。
{% for block in siteConfig.bpGlobal.all() %} {% switch (block.type) %} {% case 'preferences' %} {{ block.containerType }} ... {% case 'systemPreferences' %} {{ block.scriptVersion }} ... {% endswitch %} {% endfor %}
さて、今回はこれを一つずつ取り出すのではなく、いちいちループせずに bpPrf という一つの変数に入れて、下記のように取り出したいと思いました。
{{ bpPrf.containerType }}
これを実現するには getSerializedFieldValues() を利用して下記のようにすればOKです。
{% for block in siteConfig.bpGlobal.all() %} {% set bpPrf = bpPrf|merge(block.getSerializedFieldValues()) %} {% endfor %}
ただし、上記のとおり使えるのは各ブロックが1つずつ、そしてブロック内のフィールドハンドルがユニークである必要がありますのでご注意ください。
この bpPrf 変数を {{ dump(bpPrf) }} でダンプしてみると下記のようになります(NULL 部分にはまだ値が入っていません)。
array(10) { ["containerType"]=> string(14) "container-wide" ["twitter"]=> string(32) "https://twitter.com/bit_part_net" ["facebook"]=> string(38) "https://www.facebook.com/bit.part.net/" ["instagram"]=> NULL ["youtube"]=> NULL ["scriptVersion"]=> string(5) "1.0.0" ["prependHead"]=> NULL ["appendHead"]=> NULL ["prependBody"]=> NULL ["appendBody"]=> NULL }
このように一度セットした変数を下記のようにすればループで取り出せます。
<ul> {% for key, value in bpPrf %} <li>{{ key }}: {{ value }}</li> {% endfor %} </ul>
また、一度 bpPrf にせっとしなくても下記のようにすればその場でまとめて出力することもできます。
<ul> {% for block in siteConfig.bpGlobal.all() %} {% for key, value in block.getSerializedFieldValues() %} <li>{{ key }}: {{ value }}</li> {% endfor %} {% endfor %} </ul>
マトリックスフィールドは Craft CMS の最大の長所の一つでもあります。
ぜひ使い倒しましょう。
以上です。