Для таких как я, для которых с первого взгляда не очевидно, как реализована связка элементов хайлоад-инфоблока и свойства инфоблока типа "Справочник". Сразу уточню, что данный пост предназначен для тех, кто пишет свой механизм для заполнения справочников, а не пользуется штатными средствами
Связка осуществляется не по ID элемента хайлоад-инфоблока, а по значению поля UF_XML_ID. Ну а сюда можно вписать что угодно:). Например, для того, чтобы сюда вписать ID текущего элемента справочника, можно прописать такой обработчик в init.php
<? $eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler("", "SegmentsOnAfterUpdate", "OnAfterSegmentAddUpdateHandler");
$eventManager->addEventHandler("", "SegmentsOnAfterAdd", "OnAfterSegmentAddUpdateHandler");
function OnAfterSegmentAddUpdateHandler(\Bitrix\Main\Entity\Event $event)
{
static $bHandlerStop;
if($bHandlerStop===true)
return;
$ID = $event->getParameter("id");
if(is_array($ID))
$ID = $ID["ID"];
if(!$ID)
return;
$arParameters = $event->getParameters();
$bHandlerStop = true;
$event->setParameters($arParameters);
$arFields = $event->getParameter("fields");
if(strlen($arFields['UF_XML_ID'])>0){
return;
} else {
$rsData = \Bitrix\Highloadblock\HighloadBlockTable::getList(array('filter'=>array('NAME'=>'LANG')));
if ( !($arData = $rsData->fetch()) ){
echo 'Инфоблок не найден';
}
$Entity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($arData);
$DataClass = $Entity->getDataClass();
$result = $DataClass::update($ID, Array("UF_XML_ID"=>$ID));
if(!$result->isSuccess()){ //произошла ошибка
return $result->getErrorMessages(); //выведем ошибку
}
}
$bHandlerStop = false;
}
В коде присутсвует:
Segments
Это - название сущности
P.S. Данный код написан "на коленке" и пока не оттестирован. В случае, если вы обнаружили ошибку - напишите мне в обратной связи. Чуть позже выделю время - оттестирую
