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 %}
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() %}
| improve this answer | |
  • 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}) %} – triplethreat23 May 3 '18 at 21:20
  • Please see this craftcms.stackexchange.com/questions/25986/… – Robin Schambach May 3 '18 at 22:58
  • So this is not possible in twig? – triplethreat23 May 4 '18 at 11:00
  • Not without custom functions or filters – Robin Schambach May 4 '18 at 11:01
0

Try using

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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