Craft CMS のテンプレートでパラメータを取得する方法のまとめ
目次
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 部分である /test も p パラメータとして連想配列に含まれるので注意が必要です。
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 で foo に 1、bar に 2 という値をセットして POST 送信すると下記のように出力されます。
CRAFT_CSRF_TOKEN: 文字列(略) foo: 1 bar: 2
この出力結果をみて分かる通り、getBodyParams()は getQueryParams() とは違い、ページの URL 部分である /test の p パラメータは含まれませんが、通常 Craft CMS への POST には {{ csrfInput() }} というファンクションで書き出した CRAFT_CSRF_TOKEN が必要になりますので、それも含まれることになります。
参考
craft\web\Request | Craft 3 Class Reference
以上です。