-
Для начала создаем пользовательское поле с типом "Строка"
Называем строку "UF_FILTER_SECTION" - В init.php вписываем наш класс к событию редактирования раздела и заливаем класс в путь указанный нами
-
В result_modifier (SITE_TEMPLATE_PATH/components/bitrix/catalog.smart.filter/ВАШ_ШАБЛОН/result_modifier.php) добавляем код для отбора и сортировки значений.
- Важно! По дефолту в фильтре будет только цена. Меняйте result_modifier, если нужны по дефолту настройки инфоблока
Last active
February 24, 2023 10:14
-
-
Save Isa3v/369dbdae3a95709f0cbae0400464d194 to your computer and use it in GitHub Desktop.
Сортировка и назначение свойств фильтра для каждого раздела (Bitrix)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
//Фильтр событие редактирования раздела | |
\Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnAdminIBlockSectionEdit", array("orFilterTab", "onInit")); | |
require $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/orwo.orfiltertab.php"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
class orFilterTab { | |
public static $namePOST = 'orFilter'; //Название переменной по которой передается POST запрос | |
public static $nameUF = 'UF_FILTER_SECTION'; // Название пользовательского поля | |
public static function onInit() { | |
return array( | |
"TABSET" => __CLASS__, | |
"GetTabs" => array(__CLASS__, "getTab"), | |
"ShowTab" => array(__CLASS__, "showTab"), | |
"Action" => array(__CLASS__, "setAction"), | |
); | |
} | |
public static function getTab($arArgs) { | |
return array( | |
array( | |
"DIV" => __CLASS__, | |
"TAB" => "Умный фильтр раздела", | |
"TITLE" => "ORWO: Расширенные настройки фильтра данного раздела" | |
) | |
); | |
} | |
public static function showTab($divName, $arArgs, $bVarsFromForm) { | |
//Контент таба | |
//Делаем класс данной таблицы (для польз. полей) и далее запрос на выборку. | |
$arSection = CIBlockSection::GetList(array() ,array("IBLOCK_ID" => $arArgs['IBLOCK']['ID'], "ID" => $arArgs['ID'], "!=".self::$nameUF => ""), false, array(self::$nameUF)); | |
while ($section = $arSection->fetch()){ | |
// Если у данного инфоблока нет польз поля | |
if (!array_key_exists(self::$nameUF, $section)) { | |
return false; | |
} | |
// Переводим поле в массив | |
$arJsonUF = json_decode($section[self::$nameUF], JSON_OBJECT_AS_ARRAY); | |
} | |
//Получаем все свойства инфоблока | |
$rsProperty = \Bitrix\Iblock\PropertyTable::getList(array( | |
'filter' => array('IBLOCK_ID' => $arArgs['IBLOCK']['ID'], 'ACTIVE' => 'Y', 'PROPERTY_TYPE' => array('S','N','L')), | |
)); | |
while ($arProperty = $rsProperty->fetch()) { | |
//Обьединяем массив сортировки инфоблока и нашей сортировки | |
foreach ($arJsonUF as $sKey => $sValue) { | |
if ($arProperty['ID'] == $sKey) { | |
if(!empty($sValue['SORT'])){ | |
$arProperty['SORT'] = $sValue['SORT']; | |
$arProperty['CUSTOM_SORT'] = 'Y'; | |
} | |
if(!empty($sValue['ACTIVE_FILTER'])){ | |
$arProperty['ACTIVE_FILTER'] = $sValue['ACTIVE_FILTER']; | |
} | |
$arProperty['CUSTOM'] = 'Y'; | |
} | |
} | |
//Создаем массив | |
$arProps[] = $arProperty; | |
} | |
//Сортируем массив | |
if(!empty($arProps)){ | |
uasort($arProps, function ($a, $b) { | |
return ($a['SORT'] - $b['SORT']); | |
}); | |
} | |
?> | |
<tr> | |
<input type="submit" onclick="BX.findChild(BX('<?=__CLASS__?>'), {class: 'sort__property'}, true, true).forEach(function(element){ element.value = '';});" name="apply" value="Вернуть сортировку инфоблока"> | |
</tr> | |
<tr> | |
<td> | |
<table class="internal" id="<?=__CLASS__?>" width="100%"> | |
<tbody> | |
<tr class="heading" mode="tree"> | |
<td class="internal-left">Название (символьный код)</td> | |
<td>Показать в умном фильтре</td> | |
<td>Сортировка</td> | |
</tr> | |
<?foreach ($arProps as $arProperty) {?> | |
<tr id="PROP_<?=$arProperty['ID']?>"> | |
<td align="left" class="internal-left"><?=$arProperty['NAME']?> <small>(<?=$arProperty['CODE']?>)</small></td> | |
<td align="center" class="internal-left"><input type="checkbox" value="1" name="<?=self::$namePOST?>[<?=$arProperty['ID']?>][ACTIVE_FILTER]" <?=($arProperty['ACTIVE_FILTER'] ? 'checked' : '')?> ></td> | |
<td align="left" class="internal-left adm-detail-content-cell-r"> | |
<?if ($arProperty['CUSTOM_SORT']) {?> | |
<input class="adm-input sort__property" type="number" name="<?=self::$namePOST?>[<?=$arProperty['ID']?>][SORT]" value="<?=$arProperty['SORT']?>"> | |
<?} else {?> | |
<input class="adm-input" type="number" name="<?=self::$namePOST?>[<?=$arProperty['ID']?>][SORT]" value="" placeholder="<?=$arProperty['SORT']?>" > | |
<?}?> | |
<?if ($arProperty['CUSTOM']) {?> | |
<img style="width: 1em; padding-left: .5em;" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMSA5Ij4gIDxwYXRoIGZpbGw9IiM3RUQzMjEiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTguOTY4MjU5OTgsNS43NzY1MzIyNiBMOC45NjgyNTk5OCwyLjQ3MTY0OTkxIEw3LjA4NDk2OTUxLDIuNDcxNjQ5OTEgTDcuMDg0OTY5NTEsNy42Njk1MzE2IEw4Ljk2ODI1OTk4LDcuNjY5NTMxNiBMOC45NjgyNTk5OCw3LjY1OTgyMjczIEwxNi4xMjQ3NjM3LDcuNjU5ODIyNzMgTDE2LjEyNDc2MzcsNS43NzY1MzIyNiBMOC45NjgyNTk5OCw1Ljc3NjUzMjI2IFoiIHRyYW5zZm9ybT0icm90YXRlKC00NSA2LjE5IDExLjMxMykiLz48L3N2Zz4="> | |
<?}?> | |
</td> | |
</tr> | |
<?}?> | |
</tbody> | |
</table> | |
</td> | |
</tr> | |
<? | |
} | |
// Действие после сохранения | |
public static function setAction($arArgs) { | |
if (!empty($_POST[self::$namePOST])) { | |
// Разбираем полученный массив | |
foreach ($_POST[self::$namePOST] as $ID => $value) { | |
if(!empty($value['ACTIVE_FILTER'])){ | |
$fulterUpdate[$ID]['ACTIVE_FILTER'] = $value['ACTIVE_FILTER']; | |
} | |
if(!empty($value['SORT'])){ | |
$fulterUpdate[$ID]['SORT'] = $value['SORT']; | |
} | |
} | |
if(!empty($fulterUpdate)){ | |
// Сортируем массив | |
uasort($fulterUpdate, function ($a, $b) { | |
return ($a['SORT'] - $b['SORT']); | |
}); | |
} | |
// Переводим в JSON для хранения | |
$fulterUpdate = json_encode($fulterUpdate, JSON_UNESCAPED_UNICODE); | |
// Записываем в поле после сохранения | |
$arSection = \Bitrix\Iblock\Model\Section::compileEntityByIblock($arArgs['IBLOCK']['ID'])::update($arArgs['ID'], array(self::$nameUF => $fulterUpdate)); | |
} | |
// Действие после сохранения заказа. Возвращаем true / false | |
return true; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
// start ORWO:SORT FILTER | |
// Получаем польз. поле UF_FILTER_SECTION | |
$resFilter = CIBlockSection::GetList(array() ,array("IBLOCK_ID" => $arResult['SECTION']['IBLOCK_ID'], "ID" => $arResult['SECTION']['ID'], "!=UF_FILTER_SECTION"), false, array("UF_FILTER_SECTION")); | |
while ($filter = $resFilter->fetch()) { | |
if(!empty($filter['UF_FILTER_SECTION'])){ | |
// Получаем наше поле и переводим json в массив | |
$arParamFilter = json_decode($filter['UF_FILTER_SECTION'], JSON_UNESCAPED_UNICODE); | |
} | |
} | |
// Оставляем цену | |
$activeFilter["ITEMS"][] = $arResult["ITEMS"]['BASE']; | |
if(!empty($arParamFilter)){ | |
// Выбираем только те ключи, которые пришли из настроек | |
foreach ($arParamFilter as $keyF => $valueF) { | |
// Ключи уже должны быть отсортированны, | |
// потому нам нужно только включить нужные | |
if($arResult["ITEMS"][$keyF] && $valueF['ACTIVE_FILTER'] == true){ | |
$activeFilter["ITEMS"][] = $arResult["ITEMS"][$keyF]; | |
} | |
} | |
} | |
// Отдаем обратно только полученные элементы | |
$arResult["ITEMS"] = $activeFilter["ITEMS"]; | |
// end. ORWO:SORT FILTER | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment