初のCraftCMS案件を振り返る その5

この記事はCraft CMS Advent Calendar 2020 - Adventarに乗り遅れた記事です。

前回の初のCraftCMS案件を振り返る その4 \| Blog \| riatw.meの続編です。

今回はCraftCMSを使ってみて実際に感じた良いところのうちの一つ、「エレメントクエリの柔軟性」を取り上げてみようと思います。

制作した案件の中で複数の条件からなる店舗検索を作る必要がありました。 検索条件は以下のとおりです。

  • エリア
  • カテゴリ
  • フリーワード

このような検索を作りたいとなった場合、みなさんはどのような方法で作成されていますか? 私は案件の性質上「FlexibleSearch」を使うことが多いのですが、今回はCraftCMSのエレメントクエリを使用してテンプレートだけで実装を行ってみました。

エレメントクエリとは

エレメントクエリとはCraftCMSで管理されている情報を取得するための記法です。 先の記事で触れた、craft.entries などがそれに当たります。

エレメントクエリ \| Craft CMS ドキュメント \| 3.x

一般的には以下のような形でセクションを指定してエントリを取得することが多いのですが、 ここにさらに条件を追加していくことで条件に合致するエントリのみを取得することが可能です。

{% set entries = craft.entries.section("...").all() %}

検索結果画面の場合

エントリクエリでカテゴリA(id: 123)に該当するエントリで絞り込む場合は以下のような書き方になります。

 {% set category_id = 123 %}
{% set entries = craft.entries.section("...").shopcategory(category_id).all() %}

動的な検索画面を作る場合はこのidの部分が固定値ではないと思うので、 別途フォーム画面からポストされたデータを取得し、そちらでクエリを組み立てます。 craft.app.request.getParam() を使うことでGETまたはPOSTされたデータを取得可能です。

{% set category_id = craft.app.request.getParam("category_id") %}
{% set entries = craft.entries.section("...").shopcategory(category_id).all() %}

craft.entries に渡す条件を増やすほどに絞り込まれていくため、複数条件の場合でも対応可能です。

参考サイト

Craft CMS で POST でフィールドごとの検索(絞り込み)を実装してみる #craftcms \| mersy note


今回は「エレメントクエリの柔軟性」について触れてみました。 検索機能を作ると聞くとシステム開発が必要なイメージがありますが、 CraftCMSのエレメントクエリを使用すればテンプレート記法の延長で検索機能を作成することが出来ます。 色々と応用が効く例だと思いますのでぜひお試しください。

それではまた次回!