Каждые 24 часа обновляю элементы инфоблока. Данные получаю от API эндпоинта (REST).
Разработал добавление новых элементов и обновление существующий таким образом:
- получаю от API эндпоинта json-объекты и сохраняю в переменную контрольную сумму (crc32) каждого объекта;
- получаю методом
getList();
элементы инфоблока. В поле XML_ID храню внешний ID. В поле TMP_ID храню контрольную сумму;
- если TMP_ID существующего элемента равен контрольной сумме внешнего элемента, то проверяю следующее условие. Если XML_ID элемента инфоблока равен ID внешнего элемента, то складываю в массив 'UPDATE'. В обратном случае складываю в массив 'ADD';
- Добавляю или обновляю элементы в зависимости от того, в каком массиве они находятся.
Насколько рационален мой подход? Я не уверен в своем решении. Если все нормально, то дайте, пожалуйста, тоже соответствующий ответ.
Ниже привожу урезанный код в процедурном стиле:
$itemArray = [
'items' =>
[
'id' => 1,
'name' => 'name'
]
]; // массив с объектами полученными от API
$idArray = []; // массив с существующими элементами инфоблока
$resultObj = ElementTable::getList([
'select' => ['ID', 'XML_ID', 'TMP_ID'],
'filter' => ['IBLOCK_ID' => 1, 'XML_ID' => array_column($itemArray, 'id')]
]);
while ($resultArray = $resultObj->fetch()) {
$idArray[$resultArray['XML_ID']] = $resultArray;
}
$i = 0;
foreach ($itemArray['items'] as $item) {
$crc32 = hash('crc32', serialize($item));
// сохраняю в переменную контрольную сумму каждого объекта
if ($idArray[$item['id']]['TMP_ID'] === $crc32)
continue;
$type = array_key_exists($item['id'], $idArray) ? 'UPDATE' : 'ADD';
$index = $idArray[$item['id']]['ID'] ?? $i++;
$outputArray[$type][$index] = [
'IBLOCK_ID' => $ID,
'NAME' => $name,
'XML_ID' => $item['id'], // сохраняю внешний ID
'TMP_ID' => $crc32 // сохраняю контрольную сумму
];
}
$el = new CIBlockElement;
if (count($outputArray['ADD']) > 0) {
foreach ($outputArray as $output) {
$resultArray = $el->Add($output, false, false);
}
}
if (count($outputArray['UPDATE']) > 0) {
foreach ($outputArray as $id => $output) {
$resultArray = $el->update($id, $output, false, false);
}
}