Craft CMS のテンプレートでパラメータを取得する方法のまとめ

Craft CMS のテンプレートでパラメータを取得する方法をまとめてみました。

Craft CMS Logo

Craft CMS では、Twig のテンプレートで GET や POST のパラメータを取得することができます。その方法を簡単にまとめてみました。

GET でも POST でもパラメータを取得する

craft.app.request.getParam()

GET でも POST でも、とにかくパラメータを取得したいときには craft.app.request.getParam を利用します。

例えば、/testという URL のページに下記のようなテンプレートがあったとします。

{% set param = craft.app.request.getParam('foo') %}
getParam('foo') => {{ param }}

このときの /testにアクセスすると{{ param }}には何も表示されません。

次に/test?foo=1という URL にして、GET リクエストの foo の値に 1 をセットしてみます。すると、出力結果は下記のようになり、 foo の値が取得できます。

getParam('foo') => 1

初期値をセットする

craft.app.request.getParam() には、第2パラメータに初期値をセットすることができます。

{% set param = craft.app.request.getParam('foo', 'Hello Craft 3') %}
getParam('foo', 'Hello Craft 3') => {{ param }}

つまり、上記の場合は、 foo がない状態の/testという URL にアクセスするとHellosCrafts3と表示されます。

getParam('foo', 'GET: Hello Craft 3') => Hello Craft 3

なお、ここでいう foo がない状態というのは、foo パラメータが定義されていない状態であって、空の状態であっても URL に foo パラメータが存在していたり、空文字が POST 送信された場合は初期値は表示されません。

この craft.app.request.getParam() メソッドは、POST リクエストでもまったく同様に値を取得できます。

GET と POST が重なった場合

GET と POST、ともに foo というパラメータが含まれる場合は GET、つまり URL リクエストの値が優先されます。

GET リクエスト限定のパラメータを取得する

craft.app.request.getQueryParam()

GET リクエスト限定でパラメータを取得したいときは、 craft.app.request.getQueryParam() を利用します。

上記のコードの getParam()getQueryParam() に変えれば、GET リクエストのパラメータのみ取得するようになります。初期値もセットできます。

craft.app.request.getQueryParams()

GET リクエスト限定でパラメータをまとめて取得したいときは、 craft.app.request.getQueryParams() を利用します。

craft.app.request.getQueryParams() は、パラメータをまとめて取得して連想配列として返しますので、下記のようなテンプレートで扱います。

{% set params = craft.app.request.getQueryParams() %}
{% for key, value in params %}
 {{ key }}: {{ value }}
{% endfor %}

このテンプレートに/test?foo=1&bar=2という URL でアクセスすると下記のように出力されます。

p: test
foo: 1
bar: 2

この出力結果をみて分かる通り、getQueryParams()では、ページの URL 部分である /testp パラメータとして連想配列に含まれるので注意が必要です。

POST リクエスト限定のパラメータを取得する

craft.app.request.getBodyParam()

POST リクエスト限定でパラメータを取得したいときは、 craft.app.request.getBodyParam() を利用します。

上記のコードの getQueryParam()getBodyParam() に変えれば、POST リクエストのパラメータのみ取得するようになります。初期値もセットできます

craft.app.request.getBodyParams()

POST リクエスト限定でパラメータをまとめて取得したいときは、 craft.app.request.getBodyParams() を利用します。

craft.app.request.getBodyParams() は、パラメータをまとめて取得して連想配列として返しますので、下記のようなテンプレートで扱います。

{% set params = craft.app.request.getBodyParams() %}
{% for key, value in params %}
 {{ key }}: {{ value }}
{% endfor %}

このテンプレートに/testという URL で foo1bar2 という値をセットして POST 送信すると下記のように出力されます。

CRAFT_CSRF_TOKEN: 文字列(略)
foo: 1
bar: 2

この出力結果をみて分かる通り、getBodyParams()getQueryParams() とは違い、ページの URL 部分である /testp パラメータは含まれませんが、通常 Craft CMS への POST には {{ csrfInput() }} というファンクションで書き出した CRAFT_CSRF_TOKEN が必要になりますので、それも含まれることになります。

参考

craft\web\Request | Craft 3 Class Reference

以上です。

Published 2019-08-23
Updated 2019-08-23