@denism300

Как в битрикс вывести и отсортировать категории каталога по произвольным полям?

Для элементов каталога созданы пользовательские поля:
  • UF_SHOW_ON_MP - чекбокс
  • UF_SORT_ON_MP - число

пытаюсь выбрать элементы каталога с условием, что чекбокс отмечен и отсортировать их по полю.
Делаю так:
global $arrFilter;
		$arrFilter = array('=UF_SHOW_ON_MP' => '1');
		$APPLICATION->IncludeComponent(
			"bitrix:catalog.section.list",
			"category_on_mp",
			array(
				"IBLOCK_TYPE" => "catalog",
				"IBLOCK_ID" => "2",
				"SECTION_ID" => "0",
				"SECTION_CODE" => "",
				"COUNT_ELEMENTS" => "N",
				"TOP_DEPTH" => "5",
				"SECTION_FIELDS" => array("ID", "NAME", "PICTURE",),
				"SECTION_USER_FIELDS" => array("UF_SHOW_ON_MP","UF_SORT_ON_MP",),
				"VIEW_MODE" => "TEXT",
				"SHOW_PARENT_NAME" => "Y",
				"SECTION_URL" => "",
				"CACHE_TYPE" => "A",
				"CACHE_TIME" => "36000000",
				"CACHE_GROUPS" => "Y",
				"ADD_SECTIONS_CHAIN" => "Y",
				"FILTER_NAME" => "arrFilter",
				'ELEMENT_SORT_FIELD' => 'PROPERTY_UF_SORT_ON_MP',
				'ELEMENT_SORT_ORDER' => 'ASC',
				"COMPONENT_TEMPLATE" => "category_on_mp",
				"COUNT_ELEMENTS_FILTER" => "CNT_ACTIVE",
				"ADDITIONAL_COUNT_ELEMENTS_FILTER" => "additionalCountFilter",
				"HIDE_SECTIONS_WITH_ZERO_COUNT_ELEMENTS" => "N",
				"CACHE_FILTER" => "N",
			),
			false
		);

в итоге получаю только категории первого уровня и они не отсортированы.
с выводом всех уровней разобрался, осталась проблема с сортировкой
  • Вопрос задан
  • 280 просмотров
Решения вопроса 1
@koder_1
Битрикс программист
В компонент catalog.section.list добавили параметр CUSTOM_SECTION_SORT - кастомная сортировка по произвольному числу параметров.
Так более правильно, чем в result_modifier.php
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@denism300 Автор вопроса
В общем, не знаю, насколько правильно с точки зрения разработки на Битрикс, но сделал сортировку так.
В файл result_modifier.php скопированного в шаблон сайта компонента catalog.section.list добавил функцию сортировки массива
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();

$sort_field = $arParams['ELEMENT_SORT_FIELD'];
$sort_order = $arParams['ELEMENT_SORT_ORDER'];

function sortByFieldsDesc($field, $order)
{
	return function ($a, $b) use ($field, $order) {
		$result = $b[$field] - $a[$field];
		return (mb_strtolower($order) === 'asc') ? $result : -$result;
	};
}

usort($arResult['SECTIONS'], sortByFieldsDesc($sort_field, $sort_order));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы