Сужение вариантов в зависимости от другого свойства

33
Алексей,
Сужение вариантов в зависимости от другого свойства
Сужение вариантов в зависимости от другого свойства

Кастомное свойство привязки c небольшим костылём. Сделано для удобного заполнения свойства в админке.

Кастомное свойство привязки c небольшим костылём. Сделано для удобного заполнения свойства в админке.

Логика такая, берем обычное свойство E:EList (привязка к элементам в виде списка), скрываем все "option" и показываем только те, которые нам нужны.

AddEventHandler('iblock', 'OnIBlockPropertyBuildList', 'GetUserBrandListTypeDescription');

function GetUserBrandListTypeDescription() {
	return array(
		"PROPERTY_TYPE" => "E",
		"USER_TYPE" => "ElementListBrandLine",
		"DESCRIPTION" => 'Привязка к линейке продукта',
		"GetPropertyFieldHtml" => "GetPropertyFieldBrandLineHtml",
	);
}

function GetPropertyFieldBrandLineHtml($arProperty, $value, $strHTMLControlName) {

	$settings = \CIBlockPropertyElementList::PrepareSettings($arProperty);
	if($settings["size"] > 1) {$size = ' size="' . $settings["size"] . '"';} else {$size = '';}
	if($settings["width"] > 0) {$width = ' style="width:' . $settings["width"] . 'px"';} else {$width = '';}

	$bWasSelect = false;
	$options = \CIBlockPropertyElementList::GetOptionsHtml($arProperty, array($value["VALUE"]), $bWasSelect);

	// сужаем список линеек до текущего бренда товара
	if ($arBrand = \CIBlockElement::getProperty( // бренд товара
		$arProperty["IBLOCK_ID"],
		$_REQUEST['ID'],
		'sort',
		'asc',
		['CODE' => 'BRAND']
	)->Fetch()) {
		$options = str_replace('value=', 'style="display:none" value=', $options); // прячем все варианты
		$dbBrandLines = \CIBlockElement::GetList( // все линейки данного бренда
			[],
			['IBLOCK_ID' => $arProperty['LINK_IBLOCK_ID'], 'PROPERTY_BRAND' => $arBrand['VALUE']],
			false,
			false,
			['ID']
		);
		while ($arBrandLine = $dbBrandLines->Fetch()) { // показываем только нужные
			$options = str_replace('style="display:none" value="' . $arBrandLine['ID'], 'value="' . $arBrandLine['ID'], $options);
		}
	}

	$html = '<select name="'.$strHTMLControlName["VALUE"].'"'.$size.$width.'>';
	if($arProperty["IS_REQUIRED"] != "Y")
		$html .= '<option value=""'.(!$bWasSelect? ' selected': '').'>(не установлено)</option>';
	$html .= $options;
	$html .= '</select>';
	return  $html;
}

Еще можно было закастомить метод CIBlockPropertyElementList::GetOptionsHtml() и в нём CIBlockPropertyElementList::GetElements поменять на свой запрос с фильтром по бренду. Тогда в "select" будут только нужные варианты без костыля с style="display:none"

Опубликовано 29 апреля 2022
свойства, костыли, админка, инфоблоки, примеры кода
Поделиться
Похожие статьи
Как сделать сложное, многосоставное свойство
Когда нужно заполнить, например, таблицу и при этом лень делать справочник, то можно сделать суперко...
Читать дальше » 0
Алексей,
Как скрыть неактивные инфоблоки в админке
На большом сайте количество инфоблоков быстро растёт, многие из них служебные и не предназначены для...
Читать дальше » 0
Алексей,
Комментарии
Авторизуйтесь чтобы получать уведомления об ответе
Кастомное свойство привязки c небольшим костылём. Сделано для удобного заполнения свойства в админке.