Сужение вариантов в зависимости от другого свойства
Кастомное свойство привязки 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"
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.