Можно ли как-то сделать, чтобы постраничная навигация с этим работала корректно? Проблема в том, что разбиение на страницы остается как для исходных данных. Т.е. например было 10 страниц по 30 элементов, а после выборки должно было бы остаться 3, а отображается всеравно 10.
Александр Kyдин пишет: фильтровать тебе нужно в компоненте... что у тебя конкретно тут if( что-то ) ?
Ох, у меня там до фига всего. Есть шесть свойств у товаров типа привязка к элементам. Нужно сделать так, чтобы можно было отбирать товары с заданными свойствами + в заданном диапазоне цен. Причем каждое свойство может иметь несколько значений - или то, или это. Прилагаю картинку, чтобы было понятней.
Бренд, Тип, Топливо и т.п. - это всё те самые свойства.
Подозреваю, что возможно это реализовать через фильтр, установленный типа в корневом разделе (чтобы происходиа выборка из всех элементов) но пока не понимаю как ему скармливать сразу несколько значений одного свойства. Или проще все-таки модифицировать компонент?
Для установки в фильтр нескольких свойств следует до вызова компонента инициализировать глобальную переменную arrFilter массивом с условиями фильтрации. Можно использовать сложную логику (см. "Фильтр со сложной логикой"). Следует также убедиться, что в компонент в параметре "FILTER_NAME" передается строка "arrFilter".
Как правило, решение модифицировать компонент или использовать фильтр является наиболее правильным. Однако, организовать постраничную навигацию альтернативным способом тоже возможно. Основная проблема заключается в том, что компонент каталога выбирает лишь те элементы, которые должны выводиться на текущей странице. Таким образом, для создания новой постраничной навигации сначала потребуется заставить компонент выбрать все элементы данного каталога, что не так уж и здорово.
Из этого следует, что применять описанный ниже метод следует с осторожностью и только в случаях, когда:
необходимо обязательно сохранить оригинальный компонент (прицел на обновления);
требуется срочное временное решение, которое можно будет переработать в более спокойное время.
Кроме того, если количество элементов в каждом конкретном каталоге измеряется тысячами, то решение получается слишком дорогим в плане ресурсов и очевидно не подходит.
Итак, если задача все-таки соответствует перечисленным условиям и требованиям, следует выполнить следующие действия:
Установить параметр "PAGE_ELEMENT_COUNT" в компоненте каталога значением 0. Это заставит компонент выбирать все товары в данном каталоге.
Определить в файле .parameters.php шаблона компонента новый параметр CUSTOM_PAGE_ELEMENT_COUNT, который будет устанавливать количество выводимых товаров на странице. Напомню, использовать стандартный PAGE_ELEMENT_COUNT уже не получится (см. п.1).
Установить значение добавленного в предыдущем пункте параметра подходящим числом.
В result_modifier.php добавить код следующего вида:
Код
$GLOBALS['NavNum']--; // Эта строка гарантирует корректную работу кеша
$rsItems = new CDBResult();
$rsItems->InitFromArray($arResult['ITEMS']);
$rsItems->NavStart($arParams['CUSTOM_PAGE_ELEMENT_COUNT']);
$arResult['CUSTOM_NAV_STRING'] = $rsItems->GetPageNavS tring("", $arParams['PAGER_TEMPLATE']);
$arResult['ITEMS'] = array();
while (is_object($rsItems) && $arItem = $rsItems->GetNext()) {
$arResult['ITEMS'][] = $arItem;
}
Код следует располагать в самом низу файла, после всех необходимых манипуляций с $arResult['ITEMS']. Стоит отметить, что если в шаблоне компонента планируется использовать массив, отличный от $arResult['ITEMS'], то это стоит учесть при внедрении приведенного выше кода.
В шаблоне компонента произвести замену вхождения $arResult['NAV_STRING'] на $arResult['CUSTOM_NAV_STRING'].
Иван Большое спасибо, элементов у меня действительно несколько тысяч, попробую ещё помучить фильтр. Но решение с навигацией, думаю, ещё может понадобиться.