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

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

Кастомное свойство привязки 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 небольшим костылём. Сделано для удобного заполнения свойства в админке.