Учимся забирать данные из хайлоад блоков, используя фильтр.
Как вытащить информацию из highloadblock справочника, если известно только имя бренда, имя цвета?
Всё очень похоже на старое апи, но есть один нюанс :). Посмотрите на этот код (для примера выбор идет из 2 справочников):
if (CModule::IncludeModule('highloadblock')) { // manuf $arHLBlock = Bitrix\Highloadblock\HighloadBlockTable::getById(2)->fetch(); $obEntity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($arHLBlock); $strEntityDataClass = $obEntity->getDataClass(); $resData = $strEntityDataClass::getList(array( 'select' => array('ID', 'UF_XML_ID'), 'filter' => array('UF_NAME' => $brand), 'order' => array('ID' => 'ASC'), 'limit' => 1, )); if ($arItem = $resData->Fetch()) { echo $brandID = $arItem['UF_XML_ID']; } // colors $arHLBlock = Bitrix\Highloadblock\HighloadBlockTable::getById(1)->fetch(); $obEntity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($arHLBlock); $strEntityDataClass = $obEntity->getDataClass(); $resData = $strEntityDataClass::getList(array( 'select' => array('ID', 'UF_NAME', 'UF_XML_ID'), 'filter' => array('UF_NAME' => [$color, $next_color, $module]), 'order' => array('ID' => 'ASC'), 'limit' => 3, )); while ($arItem = $resData->Fetch()) { if ($arItem['UF_NAME'] == $color) $color_1 = $arItem['UF_XML_ID']; if ($arItem['UF_NAME'] == $next_color) $color_2 = $arItem['UF_XML_ID']; if ($arItem['UF_NAME'] == $module) $color_3 = $arItem['UF_XML_ID']; } }
В первом случае мы получаем информацию из списка брендов. Во втором – смотрим в справочников цветов. Разница лишь в том, что мы передаем сразу массив значений, чтобы не городить одинаковый код под каждое значение – инфоблок то один 🙂 .
Из интересного, при создании нового элемента и привязки используется именно UF_XML_ID:
$PROP['COLOR'] = $color_1; $PROP['NEXT_COLOR'] = $color_2; $PROP['MODULE'] = $color_3;
По данной теме была другая статья, рекомендую ее прочесть:
https://forwww.com/bitrix-highload-block/