複数のパラメータでcraft.entriesを検索するにはどうすればよいですか?

私は、複数のパラメータを持つ検索バーに基づいてエントリをフィルタリングしています。それらを基にエントリフィルタを構築しています。
1つ以上の.search関数を持つ以外はすべて素晴らしいです。

{% set req = craft.request %}

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

{% set params = ['location', 'min-price', 'max-price', 'status'] %}
{% set query = {} %}

{% for param in params %}
  {% set key = param | camel %}
  {% set value = req.getParam(param) %}
  {% set query = query | merge({ (key):(value) }) %}
{% endfor %}

{% if query.location %}
  {% set results = results.search(query.location) %}
{% endif %}

{% if query.minPrice or query.maxPrice %}
  {% set min = query.minPrice ? query.minPrice : '' %}
  {% set max = query.maxPrice ? query.maxPrice : '' %}
  {% set results = results.search("price:" ~ '500000') %}
{% endif %}

{% if query.status %}
  {% set results = results.search('statusCategory:' ~ query.status) %}
{% endif %}

{% for entry in results %}
...

私は物事を簡素化するためにmin/max部分全体を削除しましたが、場所と最小/最大価格パラメータの両方がある場合、いずれかが最後に最初のものを上書きするように見えます。どのようにこれらの検索パラメータを組み合わせることができますか?

ベストアンサー

100%はテストされていませんが、このようなことを試してください。

基本的にはすべての search 条件の配列を作成し、最後に
.search()呼び出しをスペースで区切られた文字列として結合します。これは、Craftがデフォルトで複数の用語で検索を行うためです。

{% set req = craft.request %}

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

{% set params = ['location', 'min-price', 'max-price', 'status'] %}
{% set query = {} %}
{% set search = [] %}

{% for param in params %}
    {% set key = param | camel %}
    {% set value = req.getParam(param) %}
    {% set query = query | merge({ (key):(value) }) %}
{% endfor %}

{% if query.location %}
    {% set search = search|merge([query.location]) %}
{% endif %}

{% if query.minPrice or query.maxPrice %}
    {% set min = query.minPrice ? query.minPrice : '' %}
    {% set max = query.maxPrice ? query.maxPrice : '' %}
    {% set search = search|merge(["price:" ~ '500000']) %}
{% endif %}

{% if query.status %}
    {% set search = search|merge(['statusCategory:' ~ query.status]) %}
{% endif %}

{% if search|length %}
    {% set results = results.search(search|join(' ') %}
{% endif %}

{% for entry in results %}
    ...

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です