На днях, дорабатывая очередной проект, столкнулся со странным явлением - раз в сутки некоторые свойства инфоблока магическим образом обнулялись. Сначала решил что менеджер проекта все стер. Но нет, это не был он, его алиби были железные и мне пришлось искать виновника самому. Вскоре гаденыш был найден по пути /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, '/'); |
Ну, и несколько своих шуточек для полноты контента
ll▷ Limso Casino Online ᐈ Get 50 FREE Spins 바카라사이트 바카라사이트 ラッキーニッキー ラッキーニッキー 397Video slot aztec - goldcasino.in
ОтветитьУдалить