Craft CMS のテンプレートでパラメータを取得する方法をまとめてみました。
Craft CMS では、Twig のテンプレートで GET や POST のパラメータを取得することができます。その方法を簡単にまとめてみました。
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()
を利用します。
上記のコードの getParam()
を getQueryParam()
に変えれば、GET リクエストのパラメータのみ取得するようになります。初期値もセットできます。
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()
を利用します。
上記のコードの getQueryParam()
を getBodyParam()
に変えれば、POST リクエストのパラメータのみ取得するようになります。初期値もセットできます
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
以上です。