Понимаю что это очень специфичная вещь и мало где пригодится, но на форуме несколько раз поднималась тема без каких-либо ответов.
Для начала создаем пользовательское поле с типом "Строка"
Далее нам нужно создать свою вкладку в панели редактирования раздела.
Читаем
И по аналогии делаем вкладку для раздела c выводом свойств текущего инфоблока:
Используем событие "OnAdminIBlockSectionEdit" для вывода:
<? //Добавляем к событию редактирования каталога \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 = \Bitrix\Iblock\Model\Section::compileEntityByIblock($arArgs['IBLOCK']['ID'])::getList( array( "select" => array("UF_PROPSORT", "ID", "NAME"), "filter" => array("ID" => $arArgs['ID'], "IBLOCK_ID" => $arArgs['IBLOCK']['ID']), ) ); while ($section = $arSection->fetch()) { //Поле с сериализированным массивом сортировки $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" oncl ick="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> <? } } } ?> |
Теперь нужно заставить свойства в карточке отображаться с новой сортирвкой:
в SITE_TEMPLATE_PATH/components/bitrix/catalog.element/ВАШ_ШАБЛОН/result_modifier.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 ***/ |