Импорт новостей из файла .xml
Для удобной работы его нужно структурировать.
Например:
<xml version="1.0" encoding="UTF-8"> <Каталог> <Новости> <Новость> <Дата> 27 января 2017 </Дата> <Название> Акция «Переходите на зарплатный проект от «D Bank» и получите карточку VISA Platinum в подарок» </Название> <Описание> Акционерное общество «D Bank» сообщает о запуске акции «Переходите на зарплатный проект от 1 февраля 2017 года по 31 мая 2017 года. </Описание> </Новость> </Новости> </Каталог> </xml>
Обращение к элементу списка:
$classificator = simplexml_load_file($xml_import)->Каталог->Новости->Новость; foreach($classificator as $tov) { $ELEM_DATE = trim((string)$tov->Дата); }
Или:
<xml version="1.0" encoding="utf-8"> <Row> <Cell> <Data>15 марта 2017</Data> </Cell> <Cell> <Data>Информация о корпоративном событии</Data> </Cell> <Cell> <Data>Акционерное общество «D Bank» с местонахождением Республик ареста на денежные средства, находящиеся на банковском счете:</Data> </Cell> </Row> </xml>
Обращение к элементу списка:
$classificator = simplexml_load_file($xml_import)->Row; foreach($classificator as $tov){ $ELEM_DATE = trim((string)$tov->Cell[0]->Data); //импортируем из файла поле с датой }
Не пропустить не одного закрывающего тега!
Задача. Требуется импортировать файл xml формата, перобразовать дату формата 15 марта 2017 в дату поддерживающююся битриксом(для свойства начало активности), а именно 15.03.2017 00:00:00.
И записать полученные значения в инфоблок с генерацией внешнего кода(для связи записей для языковых версий записей).
Файл импорта (import.php):
<? function russian_date($ELEM_DATE){ //функция которая преобразует строковую дату в числовую preg_match("/[0-9]+/iu", $ELEM_DATE, $dd1); preg_match("/[a-zа-яё]+/iu", $ELEM_DATE, $dd2); preg_match("/[0-9]{4}+/iu", $ELEM_DATE, $dd3); if(iconv_strlen($dd1[0],'UTF-8')< 2 ){ $dd1[0] = str_pad($dd1[0], 2, "0", STR_PAD_LEFT); } switch ($dd2[0]){ case 'января': $m = '01'; break; case 'февраля': $m = '02'; break; case 'марта': $m = '03'; break; case 'апреля': $m = '04'; break; case 'май': $m = '05'; break; case 'июня': $m = '06'; break; case 'июля': $m = '07'; break; case 'августа': $m = '08'; break; case 'сентября':$m = '09'; break; case 'октября': $m = '10'; break; case 'ноября': $m = '11'; break; case 'декабря': $m = '12'; break; } $result = $dd1[0].'.'.$m.'.'.$dd3[0].' '.'00:00:00'; return $result; } function section($ELEM_DATE){ //функция которая берет только год(для секций) preg_match("/[0-9]{4}+/iu", $ELEM_DATE, $dd3); $result = $dd3[0]; return $result; } //шапка start define("NO_KEEP_STATISTIC", true); // крон определяет собирать статистику или нет define("NOT_CHECK_PERMISSIONS",true); // не учитывать уровни доступа define("NO_AGENT_CHECK", true); //заставляет агенты запускаться, не давая переопределить константу NO_AGENT_CHECK set_time_limit(0);// Устанавливает время в секундах, в течение которого скрипт может работать $debug = ''; // для логов define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log_imp/log-m4-2017.txt"); //создаем файл с логами require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); //подключаем пролог $START_TIME = date("H:i:s"); // текущее время для логов (Время начала работы скрипта) use Bitrix\Main\Loader, // подключаем для вызова модулей(D7) Bitrix\Main\Diag\Debug; //отладчик для логов(D7) Loader::includeModule('iblock'); // подключаем модуль инфоблока $Log = 'Обработка информации для акционеров и инвесторов:'; $debug .= $Log; echo $Log; // $xml_import = $_SERVER["DOCUMENT_ROOT"].'/export/1cbitrix/iai_ru.xml'; //Ищем нужный файл на сервере //шапка end if (file_exists($xml_import)) //проверяем наличие файла { $Log = "\n<br /> - ".'iai_ru.xml найден'; $debug .= $Log; echo $Log; //все ок $iblock_id = 21; // определяем переменную, задаем инфоблок в который будем импортировать $arResult = array(); // определяем массив $rez = array(); // определяем массив $add = 0; // определяем переменную $deact = 0; // определяем переменную $classificator = simplexml_load_file($xml_import)->Row; //Интерпретируем xml файл в объект и указываем корневой элемент if (is_object($classificator)) // если объект (путь) присутствует { $e = new CIBlockElement; // определяем элемент для инфоблока хзхз $arFilter = Array('IBLOCK_ID'=>$iblock_id); // Задаем фильтр по инфоблоку $db_list = CIBlockSection::GetList(Array(), $arFilter, false, array('ID', 'NAME'));// возвращаем несортированный, фильтрованный по ид инфоблоку, не возвращает количество элементов в разделе, выбираем ид и имя while($ar_result = $db_list->Fetch()) //крутим забираем данные { $arS[$ar_result['NAME']] = $ar_result; //записываем в массив NAME } $Log = "\n<br /> - ".'Разделов в каталоге - '.count($arS); $debug .= $Log; echo $Log;// логируем количество разделов $i=1; //Идентифицируем переменную счетчика, для номера внешнего кода (т.к отчет начинает с 0) foreach($classificator as $tov) // { $arPROP = array();// $ELEM_DATE = trim((string)$tov->Cell[0]->Data); //импортируем из файла поле с датой $ELEM_NAME = trim((string)$tov->Cell[1]->Data);//импортируем из файла название $DESC = (string)$tov->Cell[2]->Data;//импортируем из файла описание $REZ_DATE = russian_date($ELEM_DATE); //конвертированная дата $XML_ID = 'iai'.$i++;// генерируем внешний код $REZ_YEAR = section($ELEM_DATE);// берем только год, т.к секции являются годом (2012) $name = $ELEM_NAME; //перевод в английский код название $arParams = array("replace_space"=>"-","replace_other"=>"-");//вставляем символ тире $trans = Cutil::translit($name,"ru",$arParams); // заменяем русские символы на английские $arCode[] = $trans; // записываем в массив название if(in_array($trans, $arCode)) // проверка на существование такого значения { $trans = $trans.randString(3);// если совпадает добавляем рандомное трехзначное число $arCode[] = $trans; //записываем в массив название } $arPROP['DATA_s1'] = $ELEM_DATE;//добавляем в массив дату $arPROP['NAME_s1'] = $ELEM_NAME;//добавляем в массив имя $arPROP['DESCRIPTION_s1'] = $DESC;//добавляем в массив описание $arFields = Array( //массив полей 'XML_ID' => $XML_ID, //добавляем внешний код 'IBLOCK_ID'=>$iblock_id,// ид инфоблока 'ACTIVE_FROM' => $REZ_DATE,// активную дату 'NAME' => $ELEM_NAME,// имя 'ACTIVE' => 'Y',// активность 'IBLOCK_SECTION_ID' => $arS[$REZ_YEAR]['ID'],//определяем секцию и ид 'PROPERTY_VALUES' => $arPROP,// свойства инфоблока 'CODE'=>$trans//код транслит ); if($idElement = $e->Add($arFields)) //добавляем поля в инфоблок $add++; //счетчик добавленных записей else//вывод ошибки { echo "Error: ".$e->LAST_ERROR; echo $trans.'- '.$ELEM_NAME; } } //подвал $Log = "\n<br /> ---------------------------------------"; $debug .= $Log; echo $Log;//логи проверяещие работу иморта записей $Log = "\n<br /> - ".'Добавлено новостей - '.$add; $debug .= $Log; echo $Log; $Log = "\n<br /> ---------------------------------------"; $debug .= $Log; echo $Log; $Log = "\n<br /> - ".'Занятая память - '.memory_get_usage(); $debug .= $Log; echo $Log; } else { $Log = "\n<br /> - ".'Ошибка xml'; $debug .= $Log; echo $Log;//если файл не найден } } $Log = "\n<br /> ---------------------------------------"; $debug .= $Log; echo $Log;//логи проверяющие работу скрипта $Log = "\n<br /> - ".'Время начала - '.$START_TIME; $debug .= $Log; echo $Log; $Log = "\n<br /> - ".'Время завершения - '.date('H:i:s'); $debug .= $Log; echo $Log; Debug::dumpToFile($debug, 'import_iai:', '/import_iai.txt'); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");//подключение эпилога
Задача импортировать в существующие элементы инфоблока по внешнему ключу новости другого языка.
Копируем шапку и подвал предыдущего скрипта. Указываем нужный файл.
if (file_exists($xml_import)) { $Log = "\n<br /> - ".'iai_kz.xml найден'; $debug .= $Log; echo $Log; $iblock_id = 21; $arResult = array(); $rez = array(); $add = 0; $deact = 0; $classificator = simplexml_load_file($xml_import)->Row; if (is_object($classificator)) { $e = new CIBlockElement; $arFilter = Array('IBLOCK_ID'=>$iblock_id); $db_list = CIBlockElement::GetList(Array(), $arFilter, false, false, array('XML_ID', 'ID'));//выбираем у элементов их ид и внешний код while($ar_result = $db_list->Fetch()) { $arE[$ar_result['XML_ID']] = $ar_result; //создаем массив с внешним кодом } $Log = "\n<br /> - ".'Элементов в каталоге - '.count($arE); $debug .= $Log; echo $Log; $i=1; foreach($classificator as $tov) { $arPROP = array();//инициализируем массив свойств $ELEM_DATE = trim((string)$tov->Cell[0]->Data); //импортируем из файла поле с датой $ELEM_NAME = trim((string)$tov->Cell[1]->Data); //импортируем из файла поле с названием $DESC = (string)$tov->Cell[2]->Data; //импортируем из файла поле с описанием $XML_ID = 'iai'.$i++; //формируем внешний код для записи $arPROP['DATA_kz'] = $ELEM_DATE; $arPROP['NAME_kz'] = $ELEM_NAME; $arPROP['DESCRIPTION_kz'] = $DESC; CIBlockElement::SetPropertyValuesEx($arE[$XML_ID]['ID'], $iblock_id, $arPROP); //записываем массив свойств в инфоблок по внешнему ключу $add++; } $Log = "\n<br /> ---------------------------------------"; $debug .= $Log; echo $Log; $Log = "\n<br /> - ".'Добавлено записей - '.$add; $debug .= $Log; echo $Log; $Log = "\n<br /> ---------------------------------------"; $debug .= $Log; echo $Log; $Log = "\n<br /> - ".'Занятая память - '.memory_get_usage(); $debug .= $Log; echo $Log; } else { $Log = "\n<br /> - ".'Ошибка xml'; $debug .= $Log; echo $Log; } } else { $Log = "\n<br /> - ".'import_iai_kz.xml отсутсвует'; $debug .= $Log; echo $Log; }