[mFilter2] Как выводить сначала товары с определённым свойством?

Добрый день.
Подскажите, как можно с помощью mFilter2 выводить в результатах сортировки сначала товары с определённым свойством (например, какого-то конкретного производителя), а затем — все остальные? При фильтрации и сортировке сверху должны оставаться товары с указанным свойством (если они есть), ниже — остальные товары, т.е. товары с указанным свойством всегда должны оставаться выше остальных.
Спасибо за подсказку
Giant Dad
19 декабря 2021, 16:48
modx.pro
2
762
0

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

Тодор
20 декабря 2021, 15:03
+1
'sortby' => 'CASE `Data`.`vendor` WHEN __VENDOR__ID__ THEN 1 ELSE 0 END ASC, msProduct.id',
    Giant Dad
    20 декабря 2021, 16:19
    0
    Вместо __VENDOR__ID__ же нужно подставить id из таблицы modx_ms2_vendors? Если да, то не помогает
      Тодор
      20 декабря 2021, 16:24
      0
      Что именно не помогоает? Єто общий принцип как именно можна ето сделать. Дальше все зависит от того, к какому снипету ето надо прикрутить и поддержывает ли етот снипет такие параметры
        Giant Dad
        20 декабря 2021, 16:28
        0
        Сниппет mFilter2, вот такой вызов
        {'!mFilter2' | snippet : [
                        'element'=>'msProducts',
                        'class'=>'msProduct',
                        'tplOuter'=>'tpl_mfilter_outer.tpl',
                        'tpl'=>'tpl.product.row.custom2',
                        'limit'=>'12',
                        'sort'=>'resource|menuindex:asc',
                        'showEmptyFilters'=>'false',
                        'filters'=>'
                				msoption|dlina:number,
                				msoption|karmany:number,
                				msoption|razmer:default,
                                msoption|sezon:default'
                	    'aliases'=>'
                				msoption|dlina==dlina,
                				msoption|karmany==karmany,
                				msoption|razmer==razmer,
                                msoption|sezon==sezon',
                        'parents'=>$_modx->resource.id,
                        'tplPageWrapper'=>'@INLINE <ul id="mse2_pagination" class="pagination">{$first}{$prev}{$pages}{$next}{$last}</ul>',
                        'tplPageActive'      => '@INLINE <li class="active"><a href="{$href}">{$pageNo}</a></li>',
                        'tplPageFirst'	    => '@INLINE <li class="control"><a href="{$href}">«</a></li>',
                        'tplPageLast'	    => '@INLINE <li class="control"><a href="{$href}">»</a></li>',
                        'tplPagePrev'	    => '@INLINE <li class="control"><a href="{$href}">‹</a></li>',
                        'tplPageNext'	    => '@INLINE <li class="control"><a href="{$href}">›</a></li>',
                        'tplPageSkip'	    => '@INLINE <li class="disabled"><span>...</span></li>',
                        'tplPageFirstEmpty'	=> '@INLINE <li class="control"><span>«</span></li>',
                        'tplPageLastEmpty'	=> '@INLINE <li class="control"><span>»</span></li>',
                        'tplPagePrevEmpty'	=> '@INLINE <li class="disabled"><span>‹</span></li>',
                        'tplPageNextEmpty'	=> '@INLINE <li class="disabled"><span>›</span></li>',
                        'includeTVs'=>'catalog_hide',
                        'where'=>'{"catalog_hide:IS": null}'
                        'sortby' => 'CASE `Data`.`vendor` WHEN 7 THEN 1 ELSE 0 END ASC, msProduct.id',
                    ]}
        Я не очень хорошо разбираюсь в сортировке. Если можно, подскажите хотя бы куда смотреть, что читать. Какие-то примеры…
          Тодор
          20 декабря 2021, 18:49
          4
          +3
          Убери
          'sort'=>'resource|menuindex:asc',
          оставь только
          'sortby' => 'CASE `Data`.`vendor` WHEN 7 THEN 1 ELSE 0 END ASC, msProduct.id',
            Giant Dad
            21 декабря 2021, 12:53
            0
            Спасибо. Это помогло. А можно ещё как-то сделать так, чтобы при сортировке, положим, по цене, сначала тоже выводились товары с указанным свойством с сортировкой по цене, а потом — остальные тоже с сортировкой. Например, сначала товары производителя «Х» от самого дорогого до самого дешёвого, а потом товары всех остальных производителей, тоже от дорогого до дешёвого? В одном списке.
              Тодор
              21 декабря 2021, 18:23
              1
              +2
              Здесь немного сложнее, нужно расширить класс mse2FiltersHandler по этой инсрукции и отредактировать метод getSortFields, перед return нужно добавить еще пару строк
              if(!empty($this->config['sortby'])){
                  //если хочеш использовать те параметри что были при инициализации mFilter2
                  $sortby = explode(",", $this->config['sortby']);
                  array_unshift($data,  $sortby[0]); 
                  //можно и напрямую заново определить sortby
                  //array_unshift($data, "CASE `Data`.`vendor` WHEN 7 THEN 1 ELSE 0 END ASC"); 
              }
              Николай Савин
              21 декабря 2021, 12:56
              1
              +2
              Это очень интересный кейс. @Тодор а чего бы тебе не написать чуть более расширенную заметку на эту тему. Что-то вроде «Сортировка с использованием операторов БД».
              Не припоминаю, чтобы я тут такое встречал.
                Тодор
                21 декабря 2021, 18:26
                +2
                я не самый опытный в этом вопросе, но посмотрю может как-нибудь соберу вместе свои примеры по этому вопросу и опубликую
                  Николай Савин
                  21 декабря 2021, 20:12
                  +3
                  Ой да кто тут опытный, это же MODX. Тут если знают что такое PHP — это уже опытные.
                  А если умеют компоненты делать — так вообще полубоги.
                    Giant Dad
                    22 декабря 2021, 12:30
                    0
                    было бы очень здорово
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        11