линия

Главная

суббота, 31 октября 2020 г.

Bitrix : добавление данных из XML в Инфоблок


На днях,  дорабатывая очередной проект, столкнулся со странным явлением -  раз в сутки  некоторые свойства инфоблока магическим образом обнулялись. Сначала  решил что менеджер проекта все стер. Но нет,  это не был он, его алиби были железные и мне пришлось искать виновника самому.
Вскоре гаденыш был найден по пути /local/php_interface/cron/update.php . Скрипт запускался раз в сутки и весело обновлял данные. Нынешние доработки требовали дополнительные свойства в инофблоке, которые  решительно очищались в момент запуска скрипта. Опытные битриксоиды знают, что подобный код очищает необъявленные свойства. 

---

1
2
<?
$el->Update($ar_res['ID'], $arLoadProductArray);	

---

Сие безобразие решается быстро. Нужно лишь при обновлении использовать вот такую конструкцию.


1
2
<?
	CIBlockElement::SetPropertyValuesEx($ar_res['ID'], false, $arLoadProductArray['PROPERTY_VALUES']);

Далее полный  листинг скрипта, чтоб самому не набирать . Копипаст - ебпта!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?
	
	/*
		*
		*  Обвновляет Инфоблок 
		*  
	*/
	
	set_time_limit(4555550);
	require($_SERVER["DOCUMENT_ROOT"]. "/bitrix/modules/main/include/prolog_before.php");
	
	define("XML_FILE_LINK","https://bitrix.внешний_сайт.ru/local/php_interface/lib/Export/files/some_file.xml");
	define("IMPORT_IBLOCK_ID" , 15);//инфоблок куда добавляем данные
	
	CModule::IncludeModule("iblock");
	
	$elements = new SimpleXMLElement(file_get_contents(XML_FILE_LINK));
	
	$logNew = 0;
	$logUpdate = 0;
	foreach ($elements->offer as $offer) {	
		//Обьект преобразуем в массив.
		$offerArray = (array)$offer;
         //идентификатор данных в выгрузке
		$id = $offerArray['internal-id'];
		
		$el = new CIBlockElement;
		//тут береи данные из обьекта. Как пример.
		$apartment = (string)$offer->location->appartment;
		//В задаче требовалось убирать дефис.
		$apartment = str_replace("-","",$apartment);
		
		$arrProp = Array();
		
		$arrProp['TYPE']			= $offerArray['type'];
		$arrProp['CATEGORY']			= $offerArray['category'];
		//оставляем только цифры
		$arrProp['BUILDING_SECTION']			=   preg_replace("/[^0-9]/", '',$offerArray['building-section']);
		$arrProp['IMAGE_LINK']			= $offerArray['flat-image'];		
		$arrProp['PRICE']			= (float)$offerArray['price']->value;
		$arrProp['RENOVATION']			=  $offerArray['renovation'];	
		$arrProp['AREA']				= (float)$offer->area->value;
		$arrProp['FLOOR']				= $offerArray['floor']; 
		$arrProp['APARTMENT']				= $apartment;
		//оставляем только цифры
		$arrProp['CORPUS_NUMBER']				=  preg_replace("/[^0-9]/", '',$offerArray['corpus-name']);
		
		
        $name = $offerArray['corpus-name'].' - '.$apartment;
		$arLoadProductArray = Array(
		"IBLOCK_ID"      		=> IMPORT_IBLOCK_ID,
		"NAME"           		=> $name,
		"ACTIVE"         		=> 'Y',  
		"CODE"				=> $id,
		"PROPERTY_VALUES"		=> $arrProp,
		);

		

		$res = CIBlockElement::GetList([ ],["IBLOCK_ID" => IMPORT_IBLOCK_ID, "CODE" => $id], false);
		//если есть такая запись в инфоблоке, то обновляем
		if ($ar_res = $res->GetNext()) {
		$logUpdate++;
		// обновялем только нужные свойства
			CIBlockElement::SetPropertyValuesEx($ar_res['ID'], false, $arLoadProductArray['PROPERTY_VALUES']);
			//Очищаем массив свойств. Иначе все данные которые не обьявлены в массиве 
			//$arLoadProductArray['PROPERTY_VALUES'] удаляется.
			$arLoadProductArray['PROPERTY_VALUES'] = false;
			//обновляем поля.
			$el->Update($ar_res['ID'], $arLoadProductArray);	
			
		}
		// если нет, то добавляем
		else {
		$logNew++;
			$el->Add($arLoadProductArray);
		}
	}
	
	
	echo '<p>Добавлено: '.$logNew;
	echo '<p>Обновлено: '.$logUpdate;
	
//BXClearCache(true, '/');		


Ну, и несколько своих шуточек для полноты контента





1 комментарий:

  1. ll▷ Limso Casino Online ᐈ Get 50 FREE Spins 바카라사이트 바카라사이트 ラッキーニッキー ラッキーニッキー 397Video slot aztec - goldcasino.in

    ОтветитьУдалить