0

I'm building a property search form and searching by different types of fields in Craft.

Here are my questions:

  1. How can I get a list of the unique cities in the entries section to declare my form options?

  2. I'm stuck on searching by square feet. (see # sf # section in my code) My plan is to let the user select from a few different ranges of square footage. What I was trying to accomplish below is if my search parameter is "sf=1", the field buildingSQFT is searched for numbers in between 10000 and 20000. I would then set up different ranges based on the parameter.

I'm not sure if this is a good way to do this. Your input has to how to best accomplish this is appreciated.

{% if not craft.request.isAjax %}
{# set base params #}

{% set params = {
    section: 'propertiesSection',
    limit: null
} %}

{% set relatedParams = ['and'] %}

{# status #}
    {% if craft.request.getParam('status') %}
        {% set status = craft.categories.group('propertyStatus').slug(craft.request.getParam('status')) %}
        {% set relatedParams = relatedParams|merge([{ targetElement:status }]) %}
    {% endif %}


{# city #}
    {% set city = craft.request.getParam('city') %}
    {% if city %}
        {% set params = params|merge({'city':city}) %}
    {% endif %}

{# sf #}
    {% set sf = craft.request.getParam('sf') %}
    {% if sf == "1" %}
        {% set params = params|merge({'buildingSQFT':range(10000,20000)}) %}
    {% endif %}

    {# add relatedParams to params #}
    {% if relatedParams|length > 1 %}
        {% set params = params|merge({'relatedTo':relatedParams}) %}
    {% endif %}                

    {% set entries = craft.entries(params).search() %}

    {% if entries|length %}

2 Answers 2

1

Remember: all parameters in your Query are set to null by default. They won't be parsed into an SQL statement until they have a valid value (not "", not NULL not 0) so you can just pass null values.

{% set range = null %}
{% switch craft.request.getParam('sf') %}
    {% case '1' %}
        {% range = ['and', '>=10000', '<=20000'] %}
    {% case '2' %}
        {% range = ['and', '>=20000', '<=30000'] %}
{% endswitch %}

{% set query = craft.entries
    .city(craft.request.getParam('city')) // <-- if city is null, nothing happens
    .buildingSQFT(range)
    .section('propertiesSection')
%}

Keep in mind query is currently only a Query and not an array of entries. You can still attach your parameters

{% if craft.request.getParam('status') %}
    {% set status = craft.categories.group('propertyStatus').slug(craft.request.getParam('status').one()) %}

    {% do query.relatedTo(['and', {targetElement: status.id}]) %}
{% endif %}


{% set entries = query.all() %}
4
  • This is the code that ended up working for my search based on your answer. How can I check a field called LSFAOffice OR LSFAOther for matches in the range? {% set range = null %} {% switch craft.request.getParam('sf-lease') %} {% case '1' %} {% set range = ['and', '>=1', '<=2500'] %} {% endswitch %} {% set params = params|merge({'LSFAOffice':range}) %} Commented May 3, 2018 at 21:20
  • Please see this craftcms.stackexchange.com/questions/25986/… Commented May 3, 2018 at 22:58
  • So this is not possible in twig? Commented May 4, 2018 at 11:00
  • Not without custom functions or filters Commented May 4, 2018 at 11:01
0

Try using

{% set params = params|merge({'buildingSQFT': '>= 10000 and <= 20000'}) %}
2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.