Добавление нового сплиттера для импорта данных
В данной статье будет рассказан пример добавления нового сплиттера для импорта данных в модуле "Обмен данными". Исходные данные, которые мы будем импортировать находятся в файле формата CSV:
id;Название;Псевдостатический адрес;Активен;Номер заявки;Контрагент;Состояние заявки ;5076;;1;5076;Иванов А.А.;Документы выданы; ;5313;;1;5313;Петров К.А.;Документы выданы; ;5789;;1;5789;Сидоров В.Л.;Документы выданы;
Аналогично информации описанной в статье Добавление нового формата экспорта данных, добавим новый формат импорта, с названием "Импорт из CSV" и с Идентификатором = csv. Далее в папку /classes/system/subsystems/import/splitters/ добавим файл csvSplitter.php следующего содержания:
<?php
class csvSplitter extends umiImportSplitter {
protected function readDataBlock() {
$xml_start ='<?xml version="1.0" encoding="UTF-8"?>
<umidump xmlns:xlink="http://www.w3.org/TR/xlink" version="2.0">
<meta>
<source-name>csv</source-name>
</meta>
<types>
<type id="root-catalog-object-type" title="Объект каталога" parent-id="root-pages-type" locked="locked">
<base module="catalog" method="object">Объекты каталога</base>
</type>
</types>
<pages>';
$start = ($this->offset) ? $this->offset + 1 : 1;
$end = ($this->offset) ? $start + $this->block_size - 1: $this->block_size;
$handle = fopen($this->file_path, "r");
$xml_begin = "";
$row = 1;
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
if($row == 1) {
$row++;
continue;
}
if($row >= $start and $row <= $end){
// в данном случае, ereg_replace убирает лишние пробелы в значении
$nomer = ereg_replace(" +"," ",iconv("CP1251", "UTF-8//IGNORE", $data[4]));
$kontragent = ereg_replace(" +"," ",iconv("CP1251", "UTF-8//IGNORE", $data[5]));
$sostoyanie = ereg_replace(" +"," ",iconv("CP1251", "UTF-8//IGNORE", $data[6]));
$xml_begin_temp ='<page id="tu_{$row}" is-active="1" parentId="30271" type-id="root-catalog-object-type">
<basetype module="catalog" method="object">Объекты каталога</basetype>
<name>$nomer</name>
<properties>
<group name="common">
<title>Основные параметры</title>
<property name="h1" type="string">
<title>Поле H1</title>
<default-value>$nomer</default-value>
</property>
</group>
<group name="harki_zayavki">
<title>Хар-ки заявки</title>
<property name="nomer_zayavki" type="string">
<title>Номер заявки</title>
<value>$nomer</value>
</property>
<property name="kontragent_zayavki" type="string">
<title>Контрагент заявки</title>
<value>$kontragent</value>
</property>
<property name="sostoyanie_zayavki" type="string">
<title>Состояние заявки</title>
<value>$sostoyanie</value>
</property>
</group>
</properties>
</page>';
$xml_begin .= $xml_begin_temp . "\n";
}
if($row > $end) break;
$row++;
}
fclose($handle);
$xml_end ='</pages></umidump>';
$finish = $xml_start ."\n". $xml_begin ."\n". $xml_end;
$doc = new DomDocument();
$doc->loadXML($finish);
$this->offset += $this->block_size;
if (!$data) $this->complete = true;
return $doc;
}
public function translate(DomDocument $doc) {
// do nothing
}
}
?>
В методе readDataBlock, в переменной $xml_begin_temp прописан id раздела каталога (id=30271) в который мы будем импортировать объекты каталога. Теперь осталось в модуле "Обмен данными" добавить новый сценарий импорта, указав "Формат данных" -> "Импорт из CSV" и CSV-файл с данными.