Сортировка по цене. Товары с ценой 0 в конце

Здравствуйте.
У меня кнопка сортировки написана так:
<a href="#" data-sort="ms|price" data-dir="[[+mse2_sort:is=`ms|price:desc`:then=`desc`]]" data-default="desc" class="sort">По цене <span></span></a>
Но нужно, что бы товары с ценой 0 отображались в конце списка, даже если мы сортируем по возрастанию цены.
Подскажите как сделать? Спасибо
Ivan
03 июня 2022, 12:00
modx.pro
990
0

Комментарии: 5

Артур Шевченко
03 июня 2022, 14:24
0
Мне кажется теми средствами, что есть в mFilter2 из коробки никак. Нужно писать свою сортировку.
    Наумов Алексей
    03 июня 2022, 14:34
    +1
    Помимо поля price нужно добавить еще одно поле, отражающее, например, возможность купить товар can_buy.
    И обновлять его по логике can_buy = (price > 0)

    Теперь в mFilter можно прописать сортировку сначала по can_buy, а затем уже по цене. Тогда товары с нулевой ценой будут всегда в конце.
      Ivan
      06 июня 2022, 12:22
      0
      В
        Ivan
        06 июня 2022, 14:50
        1
        0
        В общем решение не самое красивое, но рабочее.
        1) Копируем файл
        /assets/components/msearch2/js/web/default.js
        и называем его
        /assets/components/msearch2/js/web/custom.js
        .
        2) В этом файле везде
        mse2Config['actionUrl']
        заменяем на
        '/assets/components/msearch2/actionCustom.php'
        3) Копируем файл
        /assets/components/msearch2/action.php
        и называем его
        /assets/components/msearch2/actionCustom.php
        4) В html коде сортировки указываем
        <a href="#" data-sort="ms|price" data-dir="[[+mse2_sort:is=`ms|price:desc`:then=`desc`]]" data-default="desc" class="sort">По цене <span></span></a>
        5) В файле
        actionCustom.php
        на 76 строчке меняем
        $paginatorProperties['sortby'] = !empty($sort)
                    ? $mSearch2->getSortFields($sort)
                    : '';
        на
        $sorting = '';
                    if (!empty($sort)) {
                    $sorting = $mSearch2->getSortFields($sort);
                    if ($sorting == '`Data`.`price` desc') {
                        $sorting = 'IF (`Data`.`price` > 0, 1, 0) desc, `Data`.`price` desc';
                    } elseif ($sorting == '`Data`.`price` asc') {
                        $sorting = 'IF (`Data`.`price` > 0, 1, 0) desc, `Data`.`price` asc';
                    }
                }
                $paginatorProperties['sortby'] = $sorting;
        Радуемся
          Ivan
          06 июня 2022, 15:05
          0
          Так же нужно скопировать mFilter2 и назвать его mFilter2Custom.
          В этом файле на 289 строке заменить
          if (!empty($sort)) {
              $paginatorProperties['sortby'] = $mSearch2->getSortFields($sort);
              $paginatorProperties['sortdir'] = '';
          }
          на
          if (!empty($sort)) {
              $sorting = $mSearch2->getSortFields($sort);
              if ($sorting == '`Data`.`price` desc') {
                  $sorting = 'IF (`Data`.`price` > 0, 1, 0) desc, `Data`.`price` desc';
              } elseif ($sorting == '`Data`.`price` asc') {
                  $sorting = 'IF (`Data`.`price` > 0, 1, 0) desc, `Data`.`price` asc';
              }
              $paginatorProperties['sortby'] = $sorting;
              $paginatorProperties['sortdir'] = '';
          }
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            5