Сортировка по результатам поиска в 1С-Битрикс

Рейтинг: 1Ответов: 1Опубликовано: 16.03.2015

Доброго времени суток, знатоки, еще раз!

Снова возникла проблема с работой битрикса. У меня настроен поиск товаров с помощью sphinx. Сейчас стоит задача настроить сортировку найденных товаров по пользовательским полям. Казалось бы не сложно. Но если я правильно понял документацию, то сортировку результатов поиска можно производить только по полям rank и date. Пробовал пойти тем же путем, что и для CIBlockElement, но тщетно. Может, кто сталкивался с подобным? И еще мне предстоит после этого еще и фильтрацию производить по результатам поиска. Если кто подскажет и на этот счет, буду благодарен!

Ответы

▲ 2

Если кому интересно, то я нашел способ обойти этот промах битрикса. Но сразу оговорюсь, что у него есть и серьезный минус - если вы используете пагинацию на сайте, то при этом способе фильтрация и сортировка будут работать только на той странице, которой вы находитесь.

Спасает нас result_modifier и функция PHP - usort. Для начала создадим в init.php класс:

class CCabinet_SortObject {

function __cmp_ValueOf($a, $b, $name, $order) {
    if(is_set($a[$name]) && is_set($b[$name])) {
        if($order == 'ASC')
            return ($a[$name]<$b[$name])?true:false;
        elseif($order == 'DESC')return ($b[$name]>$a[$name])?false:true;
    }
}

function cmp_ВАШ_ПАРМЕТР_ВАШ_ПОРЯДОК($a, $b) {
    return CCabinet_SortObject::__cmp_ValueOf($a, $b, "ПАРАМЕТР_СОРТИРОВКИ", "ПОРЯДОК_СОРТИРОВКИ");
}
function cmp_ВАШ_ПАРМЕТР_ВАШ_ПОРЯДОК($a, $b) {
    return CCabinet_SortObject::__cmp_ValueOf($a, $b, "ПАРАМЕТР_СОРТИРОВКИ", "ПОРЯДОК_СОРТИРОВКИ");
}

Он позволит нам сортировать готовый массив после поиска. Вызывать мы его будем в result_modifier таким способом:

if(isset($_GET["by"]) && isset($_GET["order"]))
{
          usort($arResult['МАССИВ'],array("CCabinet_SortObject","cmp_".$_GET["by"]."_".$_GET["order"]));
 }

То есть мы указываем наш массив, который надо отсортировать, и потом by - по какому полю сортировать, order - порядок сортировки. Собственно это все. Фильтрацию, думаю, особого смысла нет расписывать - там все просто. Надо только отловить наш параметр и по нему фильтровать.