Свойства инфоблока битрикса на отдельной вкладке

Достаточно распространенная ситуация, когда в битриксе инфоблоку добавляют много свойств. Когда свойств штук 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);

 Способ конечно не самый красивый, но более прос

Теги:

bitrix