Пример скрипта импорта данных из csv файла в инфоблок Битрикс

Пример скрипта импорта данных из csv файла в инфоблок Битрикс

Довольно простая заготовка скрипта импорта данных из csv файла. Представим, что у нас есть некий csv файл c комментариями к товарам: к примеру, такой:

Нужно все эти данные загрузить в инфоблок. Соответствия свойств в файле и инфоблоке следующие:

  • id_com — идентификатор записи. будем их записывать в поле «внешний код» (XML_ID)
  • id_pr — id товара, к которому этот комментарий относится (не станем его импортировать для простоты кода)
  • name_com — ф.и.о. автора комментария (будем его записывать в пользовательское свойство инфоблока типа «строка» с кодом «FIO»)
  • email_com — email автора комментария (будем его записывать в пользовательское свойство инфоблока типа «строка» с кодом «MAIL»)
  • status_com — статус комментария (будем его записывать в пользовательское свойство инфоблока типа «список» с кодом «IS_SHOW»)
  • date_com — дата написания комментария (будем его записывать в пользовательское свойство инфоблока типа «дата/время» с кодом «DATE»)

Сам код импорта:

<?php
require_once $_SERVER['DOCUMENT_ROOT'].
'/bitrix/modules/main/include/prolog_before.php';
?>
<h1>Импорт комментариев к товарам</h1>
<p>
    Источник: data.csv - файл должен располагаться в <b>/dev-import/catalog/items-comments/</b><br>
    Кодировка: UTF-8<br>
    Разделитель ячеек: |<br>
</p>
результат работы...<br>

<?
$handle = fopen($_SERVER['DOCUMENT_ROOT'].'/dev-import/catalog/items-comments/data.csv', 'r');
if ($handle) {
    $counter = 0;
    $keys = array();
    $data = array();
    while (($buffer = fgets($handle)) !== false) {
        $counter++; 
        //удаляем из прочитанной строки все символы переноса
        $buffer = str_replace(array("\r\n", "\r", "\n"), '', $buffer); 
        $str =explode('|', $buffer);
        if ($counter==1){
            $keys = $str;
        }
        else{
            $el = array();
            foreach ($str as $key=>$item){
                $el[$keys[$key]] = $item;
            }
            $data[] = $el;
        }
    }
    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);
    
    CModule::IncludeModule('iblock');
    
    foreach ($data as $key=>$el){
        $bs = new CIBlockElement;
        //значение "не показывать комментарий"
        $status = '1';
        if ($el['status_com']=='On'){
            //значение "показывать комментарий"
            $status = '2';
        }
        $PROP = array();
        $PROP['IS_SHOW'] = $status; 
        $PROP['DATE'] = $el['date_com'];
        $PROP['FIO'] = $el['name_com'];
        $PROP['MAIL'] = $el['email_com'];
        
        $arFields = Array(
        'ACTIVE' => 'Y',
        'IBLOCK_ID' => 4,
        'NAME' => 'cmt_'.$el['id_com'],
        'XML_ID' => 'cmt_'.$el['id_com'],
        'PROPERTY_VALUES'=> $PROP,
        );
        if($PRODUCT_ID = $bs->Add($arFields)){
            echo $key.'.New ID: '.$PRODUCT_ID.'(XML_ID = cmt_'.$el['id_com'].')<br>';
        }
        else{
            echo $key.'.Error: '.$bs->LAST_ERROR.'<br>';
        }
    }
}
?>