Craft CMS の Matrix(行列)フィールドでブロックに紐付いているフィールドの値をまとめて取得する

Craft CMS の Matrix(マトリックス、行列)フィールドでブロックに紐付いているフィールドの値をまとめて取得する方法をご紹介します。

Craft CMS Logo

下図のように2つのブロックタイプを用意した行列フィールド(以下「マトリックス」といいます)があります。フィールドハンドルは bpGlobal とします。

このマトリックスは、グローバルの「サイト設定」(ハンドル名は siteConfig )として作ってあるとします。

普通に Twig で取り出す

これを普通に Twig で取り出すと下記のようになると思います。

{% for block in siteConfig.bpGlobal.all() %}
 {% switch (block.type) %}
 {% case 'preferences' %}
 {{ block.containerType }}
 ...
 {% case 'systemPreferences' %}
 {{ block.scriptVersion }}
 ...
 {% endswitch %}
{% endfor %} 

さて、今回はこれを一つずつ取り出すのではなく、いちいちループせずに bpPrf という一つの変数に入れて、下記のように取り出したいと思いました。

{{ bpPrf.containerType }}

一度ループして1階層の連想配列にする

これを実現するには 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 の最大の長所の一つでもあります。

ぜひ使い倒しましょう。

以上です。

Published 2019-11-19
Updated 2019-11-19