Достаточно распространенная ситуация, когда в битриксе инфоблоку добавляют много свойств. Когда свойств штук 10, то редактировать еще нормально, но когда количество свойств переваливает за несколько десятков, а если еще некоторые свойства множественны, то редактировать контент становится сущим адом.
Если разнести свойства на разные вкладки, то структура страницы редактирования страницы будет простой и логичной, а указательный палец контент менеджера поблагодарит вас за то, что ему больше не прийдется до посинения крутить колесико мышки.
Для начала нам нужно скопировать шаблон админ страницы.
/bitrix/modules/iblock/admin/iblock_element_edit.php
Я предпочитаю хранить подобные шаблоны в папке
/bitrix/php_interface
Но хранить их можно в любом месте.
В скопированном файле нужно удалить все до блока:
////////////////////////////START of the custom form//////////////////////////
и после
///////////////////////////END of the custom form//////////////////////////
В этом файле очень много строк, разобраться в структуре кода не так просто, поэтому поиском ищем строку:
foreach($PROP as $prop_code=>$prop_fields):
Тут идет вывод свойств на вкладку "Элемент". Раз тут обычный цикл foreach, то свойства можно легко отфильтровать! лезем в админку, в редактирование типа инфоблока, на вкладку свойств и переписываем ID свойств, которых хотим венести на отдельную вкладку, формируем из них массив и записываем перед циклом foreach. А внутри цикла проверяем есть ли свойство в массиве, если есть, то не выводим, для итих свойств будет отдельная вкладка. Код будет выглядеть примерно так:
$props = [63, 24, 48]; foreach($PROP as $prop_code=>$prop_fields): if (!in_array($prop_fields["ID"], $props)): ... endif; endforeach;
вместо многоточия должен остаться кусок кода.
Теперь надо добавить вкладку с нашими отфильтрованными свойствами. Я добавил код после всех существующих вкладок, перед кодом:
$bDisabled = ($view=="Y")
Для создания вкладки, надо сначала выяснить ее содержимое. Для этого пройдемся в цикле по отфильтрованным свойствам:
$content = '';foreach($PROP as $prop_code=>$prop_fields): if (in_array($prop_fields["ID"], $props)): $prop_values = $prop_fields["VALUE"]; $tabControl->BeginCustomField("PROPERTY_".$prop_fields["ID"], $prop_fields["NAME"], $prop_fields["IS_REQUIRED"]==="Y"); ob_start(); echo ''; echo ''. $tabControl->GetCustomLabelHTML().':'; echo ''; _ShowPropertyField('PROP['.$prop_fields["ID"].']', $prop_fields, $prop_fields["VALUE"], (($historyId <= 0) && (!$bVarsFromForm) && ($ID<=0)), $bVarsFromForm||$bPropertyAjax, 50000, $tabControl->GetFormName(), $bCopy); echo ''; echo''; $content .= ob_get_clean(); $hidden = ""; if(!is_array($prop_fields["~VALUE"])) $values = Array(); else $values = $prop_fields["~VALUE"]; $start = 1; foreach($values as $key=>$val) { if($bCopy) { $key = "n".$start; $start++; } if(is_array($val) && array_key_exists("VALUE",$val)) { $hidden .= _ShowHiddenValue('PROP['.$prop_fields["ID"].']['.$key.'][VALUE]', $val["VALUE"]); $hidden .= _ShowHiddenValue('PROP['.$prop_fields["ID"].']['.$key.'][DESCRIPTION]', $val["DESCRIPTION"]); } else { $hidden .= _ShowHiddenValue('PROP['.$prop_fields["ID"].']['.$key.'][VALUE]', $val); $hidden .= _ShowHiddenValue('PROP['.$prop_fields["ID"].']['.$key.'][DESCRIPTION]', ""); } } $tabControl->EndCustomField("PROPERTY_".$prop_fields["ID"], $hidden); endif;endforeach;
Половина кода скопирована из штатного вывода. Код вывода свойства завернут в буферизацию т.к. функция _ShowPropertyField() не умеет выводит в переменную. Краткий смысл вышеприведенного кода: пройтись по свойствам и записать в переменную сгенерированный html код содержимого вкладки.
Финальным аккордом выведем на экран вкладку:
$tabControl->tabs[] = array('DIV' => 'ib_props', 'TAB' => 'Свойства', 'TITLE' => 'Свойства элемента', 'CONTENT'=>$content);
Способ конечно не самый красивый, но более прос