-
Для начала создаем пользовательское поле с типом "Строка"
-
Далее нам нужно создать свою вкладку в панели редактирования раздела.
Разработчик Bitrix Framework" -> Кастомизация административной формы заказа - тут довольно хорошо описан процесс создания вкладки. Делаем по аналогии (Смотрим init.php)
После добавления события, появляется вкладка в разделах:
-
В result_modifier (SITE_TEMPLATE_PATH/components/bitrix/catalog.element/ВАШ_ШАБЛОН/result_modifier.php) элемента добавляем код для смешивания значений и сортировки.
Для раздела делаем по аналогии только перемешиваем уже массив с ITEM
Last active
June 28, 2021 13:39
-
-
Save Isa3v/4bfaab410dca643c16974376c17108b7 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("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> | |
<? | |
} | |
} | |
} | |
?> |
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
<?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 ***/ | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Почему-то не сохраняются изменения внесенные на кастомной вкладке и не работает кнопка "Вернуть сортировку инфоблока"