комбинированный поисковый запрос продукта коммерции craft cms

Я пытаюсь отфильтровать свои продукты, используя ремесленную торговлю.

Есть ли способ сделать craft.commerce.products.search("(field_color:red ORfield_color:blue) (field_size:S ORfield_size:M OR field_size:XXL)")

Или любое другое решение может помочь мне достичь этого фильтра.

Вот мой код:

    {% set productNumber = 12 %}
    {% set priceMin = 0 %}
    {% set priceMax = 1000 %}

    {% set query = "(field_color:red OR field_color:blue) (field_size:S OR           field_size:M OR field_size:XXL)" %}
    {% set product_array = craft.commerce.products({
                type:typeArray|default(""),
                order:sort|default(""),
                defaultPrice: [
                'and',
                '>= ' ~ priceMin,
                '<= ' ~ priceMax,
                ]
                }).search(query) %}

    {% set product_array_limited = product_array.limit(productNumber|default("")) %}
    {% paginate product_array_limited as product_array_pagenated %}

        {% for product in product_array_pagenated %}

        "Here is my product"

        {% endfor %}

    {% endpaginate %}

person Parry Huang    schedule 16.04.2018    source источник


Ответы (1)


Я разобрался сам. Я использую ремесленный фильтр «relatedTo», чтобы присоединиться к поиску контента. В моей системе «цвет» и «размер» сохраняются как категории. В разделе коммерческого продукта «цвет» и «размер» связаны с продуктом с полями «productColor» и «productSize».

Так же, как на следующей картинке:

Пример изображения категории размера и цвета, связанного с разделом продукта

А категория «размер» и «цвет» содержит «название», «слаг».

Размер и цвет в примере изображения категории

И в категории ремесел вы увидите идентификатор этой категории, как показано на следующем рисунке.

Пример изображения идентификатора категории

Вот мой код:

{% set colorArray = ["blue","black"] %}
{% set sizeArray = ["s","28"] %}

{% set colorId = [] %}
{% for color in colorArray %}
   {% set colorId = colorId | merge(craft.categories.slug(color).Ids()) %}
{% endfor %}

{% set sizeId = [] %}
{% for size in sizeArray %}
   {% set sizeId = sizeId | merge(craft.categories.slug(size).Ids()) %}
{% endfor %}

{% set IdMerge = craft.customcode.mergeArrayRemoveRedundancy(colorId,sizeId) %}
{% set productNumber = 12 %}
{% set priceMin = 0 %}
{% set priceMax = 1000 %}

{% set product_array = craft.commerce.products({
                type:typeArray|default(""),
                order:sort|default(""),
                defaultPrice: [
                'and',
                '>= ' ~ priceMin,
                '<= ' ~ priceMax,
                ]
                }).relatedTo(IdMerge) %}
{% for product in product_array_pagenated %}

{# Your product #}

{% endfor %}

Вот PHP-класс функции «mergeArrayRemoveRedundancy» в моем плагине «customcode».

 /**
 * merge array remove redundancy
 * @param $a1 array
 * @param $a2 array
 * @return array
 */
public function mergeArrayRemoveRedundancy($a1,$a2){
    $a1 = (array)$a1;
    $a2 = (array)$a2;
    return array_unique(array_merge($a1,$a2), SORT_REGULAR);
}

Вы можете создать собственный плагин, используя "https://pluginfactory.io/". Просто добавьте класс PHP в /yourPluginFolder/ папка с переменными.

person Parry Huang    schedule 19.04.2018