Добавление нового сплиттера для импорта данных
Материал из Umicms
В данной статье будет рассказан пример добавления нового сплиттера для импорта данных в модуле "Обмен данными". Исходные данные, которые мы будем импортировать находятся в файле формата 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-файл с данными.
