Добавление нового сплиттера для импорта данных

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 2.9.6

Задача: Добавить новый сплиттер для импорта данных

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