Skip to content

Instantly share code, notes, and snippets.

@Isa3v
Last active February 24, 2023 10:14
Show Gist options
  • Save Isa3v/369dbdae3a95709f0cbae0400464d194 to your computer and use it in GitHub Desktop.
Save Isa3v/369dbdae3a95709f0cbae0400464d194 to your computer and use it in GitHub Desktop.
Сортировка и назначение свойств фильтра для каждого раздела (Bitrix)

Сортировка и назначение свойств фильтра для каждого раздела (Bitrix)

  • Для начала создаем пользовательское поле с типом "Строка"


    Называем строку "UF_FILTER_SECTION"
  • В init.php вписываем наш класс к событию редактирования раздела и заливаем класс в путь указанный нами
  • В result_modifier (SITE_TEMPLATE_PATH/components/bitrix/catalog.smart.filter/ВАШ_ШАБЛОН/result_modifier.php) добавляем код для отбора и сортировки значений.

  • Важно! По дефолту в фильтре будет только цена. Меняйте result_modifier, если нужны по дефолту настройки инфоблока
<?
//Фильтр событие редактирования раздела
\Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnAdminIBlockSectionEdit", array("orFilterTab", "onInit"));
require $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/orwo.orfiltertab.php";
<?
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;
}
}
<?
// 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