Skip to content

Instantly share code, notes, and snippets.

@Isa3v
Last active June 28, 2021 13:39
Show Gist options
  • Save Isa3v/4bfaab410dca643c16974376c17108b7 to your computer and use it in GitHub Desktop.
Save Isa3v/4bfaab410dca643c16974376c17108b7 to your computer and use it in GitHub Desktop.
Сортировка свойств инфоблока для определенного раздела (Bitrix)

Сортировка свойств инфоблока для определенного раздела

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

  • Далее нам нужно создать свою вкладку в панели редактирования раздела.

    Разработчик Bitrix Framework" -> Кастомизация административной формы заказа - тут довольно хорошо описан процесс создания вкладки. Делаем по аналогии (Смотрим init.php)

    После добавления события, появляется вкладка в разделах:

  • В result_modifier (SITE_TEMPLATE_PATH/components/bitrix/catalog.element/ВАШ_ШАБЛОН/result_modifier.php) элемента добавляем код для смешивания значений и сортировки.

    Для раздела делаем по аналогии только перемешиваем уже массив с ITEM

Данная инструкция на сайте битрикса
<?
//Добавляем к событию редактирования каталога
\Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnAdminIBlockSectionEdit", array("orPropTab", "onInit"));
class orPropTab {
public static function onInit() {
return array(
"TABSET" => "orPropTab",
"GetTabs" => array("orPropTab", "orPropTabgetTabs"),
"ShowTab" => array("orPropTab", "orPropTabShowTab"),
"Action" => array("orPropTab", "orPropTabAction"),
"Check" => array("orPropTab", "orPropTabCheck"),
);
}
public static function orPropTabAction($arArgs) {
if ($_POST['orPostSort'] && !empty($_POST['orPostSort'])) {
if (is_array($_POST['orPostSort'])) {
foreach ($_POST['orPostSort'] as $sKey => $sValue) {
if (!empty($sValue)) {
$sortComplite[$sKey] = $sValue;
}
}
} else {
//Если только 1 значение, то не массив
$sortComplite = $_POST['orPostSort'];
}
$sortComplite = serialize($sortComplite);
$arSection = \Bitrix\Iblock\Model\Section::compileEntityByIblock($arArgs['IBLOCK']['ID'])::update($arArgs['ID'], array("UF_PROPSORT" => $sortComplite));
}
// Действие после сохранения заказа. Возвращаем true / false
// Сообщение $GLOBALS["APPLICATION"]->ThrowException("Ошибка!!!", "ERROR");
return true;
}
public static function orPropTabCheck($arArgs) {
// действия перед сохранением. Возвращаем true / false
// наше поле после сохранение записываем т.к оно отдельно летит
return true;
}
public static function orPropTabgetTabs($arArgs) {
//Инфо о табе
return array(
array(
"DIV" => "sortSectionTab",
"TAB" => "ORWO: Сортировка свойств данного раздела",
"TITLE" => "Кастомая сортировка свойств",
),
);
}
public static function orPropTabShowTab($divName, $arArgs, $bVarsFromForm) {
// UF_PROPSORT - пользовательское поле для записи сортировки.
//Контент таба
if ($divName == "sortSectionTab") {
//Делаем класс данной таблицы (для польз. полей) и далее запрос на выборку.
$arSection = CIBlockSection::GetList(array() ,["IBLOCK_ID" => $arArgs['IBLOCK']['ID'], "ID" => $arArgs['ID'], "!=UF_PROPSORT" => ""], false, ["UF_PROPSORT"]);
while ($section = $arSection->fetch()){
//Проверка наличия поля в инфоблоке
if (!array_key_exists('UF_PROPSORT', $section)) {
return false;
}
//Поле с сериализированным массивом сортировки
$propToSort = unserialize($section['UF_PROPSORT']);
}
//Получаем все свойства инфоблока
$rsProperty = \Bitrix\Iblock\PropertyTable::getList(array(
'filter' => array('IBLOCK_ID' => $arArgs['IBLOCK']['ID'], 'ACTIVE' => 'Y'),
));
while ($prop = $rsProperty->fetch()) {
//Обьединяем массив сортировки инфоблока и нашей сортировки
foreach ($propToSort as $sKey => $sValue) {
if ($prop['ID'] == $sKey) {
$prop['SORT'] = $sValue;
$prop['CUSTOM'] = 'Y';
}
}
//Создаем массив
$arProps[] = $prop;
}
//Сортируем массив
usort($arProps, function ($a, $b) {
return ($a['SORT'] - $b['SORT']);
});
?>
<tr>
<input type="submit" onclick="BX.findChild(BX('custom_sort'), {class: 'custom_sort__item'}, true, true).forEach(function(element){ element.value = '';});" name="apply" value="Вернуть сортировку инфоблока">
</tr>
<tr>
<td>
<table class="internal" id="custom_sort" width="100%">
<tbody>
<tr class="heading" mode="tree">
<td class="internal-left">Название</td>
<td>Символьный код</td>
<td>Сортировка</td>
</tr>
<?foreach ($arProps as $prop) {?>
<tr id="PROP_<?=$prop['ID']?>">
<td align="left" class="internal-left"><?=$prop['NAME']?></td>
<td align="left" class="internal-left"><?=$prop['CODE']?></td>
<td align="left" class="internal-left adm-detail-content-cell-r">
<?if ($prop['CUSTOM']) {?>
<input class="adm-input custom_sort__item" type="number" name="orPostSort[<?=$prop['ID']?>]" value="<?=$prop['SORT']?>">
<span style="font-size: 1.5em; line-height: 0; padding-left: .2em; font-weight: bold; color: green;">✓</span>
<?} else {?>
<input class="adm-input" type="number" name="orPostSort[<?=$prop['ID']?>]" placeholder="<?=$prop['SORT']?>">
<?}?>
</td>
</tr>
<?}?>
</tbody>
</table>
</td>
</tr>
<?
}
}
}
?>
<?php
/*** start CUSTOM SORT ***/
//Получаем родительские разделы в виде древа
$nav = CIBlockSection::GetNavChain(false,$arResult['SECTION']['ID']);
while($arSectionPath = $nav->GetNext()){
$sectionParent[] = $arSectionPath['ID'];
}
//Запрашиваем данное поле для выбранных разделов
$arSection = \Bitrix\Iblock\Model\Section::compileEntityByIblock($arResult['IBLOCK_ID'])::getList(
array(
"select" => array("UF_PROPSORT", "NAME"),
"filter" => array("ID" =>$sectionParent, "IBLOCK_ID" => $arResult['IBLOCK_ID']),
)
);
while ($section = $arSection->fetch()) {
if(!empty(unserialize($section['UF_PROPSORT']))){
//Так мы оставляем только последнее заполненное значение
// $propToSort['NAME'] = $section['NAME']; <- на случай определить откуда сортировка тянется
$propToSort['SORT'] = unserialize($section['UF_PROPSORT']);
}
}
foreach ($arResult['DISPLAY_PROPERTIES'] as $propKey => $prop){
foreach ($propToSort['SORT'] as $customPropKey => $customProp){
if($prop['ID'] == $customPropKey){
$arResult['DISPLAY_PROPERTIES'][$propKey]['SORT'] = $customProp;
}
}
}
//Сортируем по значению сортировки
usort($arResult['DISPLAY_PROPERTIES'], function($a,$b){
return ($a['SORT']-$b['SORT']);
});
/*** end CUSTOM SORT ***/
?>
@konqueror7
Copy link

Почему-то не сохраняются изменения внесенные на кастомной вкладке и не работает кнопка "Вернуть сортировку инфоблока"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment