Импорт новостей из файла .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;
}