Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Продление демо версии или перенос на новый демо хостинг

Автор rob1nРаздел Установка UMI.CMS

Ответов: 7
Просмотров: 3652
Последний ответ 01 Марта 2016, 11:00:30
от Rodogor
Новая новость или новый товар с пометкой "новинка"

Автор AxiomateriaРаздел Шаблоны XSLT

Ответов: 17
Просмотров: 7593
Последний ответ 17 Сентября 2014, 12:05:14
от tonal
Добавление события в новый метод?

Автор muldyРаздел Макросы UMI.CMS

Ответов: 4
Просмотров: 2179
Последний ответ 05 Августа 2016, 12:06:18
от muldy
JS+AJAX - формат цены без суффикса и префикса

Автор samРаздел JS и AJAX

Ответов: 3
Просмотров: 3488
Последний ответ 20 Октября 2014, 00:45:31
от sam
После импорта дампа базы не отображается структура

Автор EvgenyIvnРаздел Установка UMI.CMS

Ответов: 6
Просмотров: 6814
Последний ответ 10 Января 2013, 09:16:37
от admin

0 Пользователей и 1 Гость просматривают эту тему.

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Новый формат импорта CSV?
« : 02 Октября 2013, 15:07:45 »
Здравствуйте!
Есть готовый файл csv, но он кардинально различается отображением чем у umi, как реализовать подстановку и замену полей на нужные, те те которые принимает система!?
Или проще говоря использовать другой щаблон импорта данных?

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #1 : 03 Октября 2013, 00:36:23 »
Нашел инструкцию здесь:
http://wiki.umisoft.ru/%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%81%D0%BF%D0%BB%D0%B8%D1%82%D1%82%D0%B5%D1%80%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85
Сделал по ней но не работает, пишет: unknown umidump version
Сталкивался ли кто нибудь с такой проблемой?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #2 : 04 Октября 2013, 18:41:56 »
Встречался. Использую такую заготовки для csv_test импорта и её модификации

<?php
class csv_testSplitter extends umiImportSplitter {

protected function readDataBlock() {
// xml-пустышка
$doc = new DOMDocument("1.0", "utf-8");
$doc->formatOutput = XML_FORMAT_OUTPUT;
$rootNode = $doc->createElement("umidump");
$doc->appendChild($rootNode);
$rootNode->setAttribute('version', '2.0');
// текущее смещение
$index = ($this->offset) ? $this->offset : 0;
//Какие-то действия, в зависимости от текущего смещения
$start = ($this->offset) ? $this->offset + 1 : 1;
$end = ($this->offset) ? $start + $this->block_size - 1: $this->block_size;
$handle = fopen($this->file_path, "r");


$row = 1;
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
if($row == 1) {
$row++;
continue;
}

if($row >= $start and $row <= $end){
// строка разбита в массив по колонкам
// например $data[0] это значение первой колонки в вашем сым текущей строки
}
if($row > $end) break;
$row++; 
}
fclose($handle);
$this->offset += $this->block_size;

// условие для остановки цикла, которое необходимо настроить
if (!$data) $this->complete = true;

//тестовый лог
//file_put_contents(CURRENT_WORKING_DIR .'/traceajax.txt', $index.';', FILE_APPEND);

return $doc;
}

public function translate(DomDocument $doc) {
return $doc->saveXML();
}
}
?>


Есть 2 особенности:
1. такой импорт не отдает результат в виде статуса, сколько страниц создано, изменено и т.д. так как все происходит без участия umidump формата.
2. иногда из-за необходимости обработки русских символов или текста в кавычках работаю не с fgetcsv, а с fgets функцией чтения строки нашего файла. Плюс, иногда навешиваю обработку строки для борьбы с проблемами разных кодировок (обычно, csv приходят от клиента в win-1251 формате, а в системе используется utf8)

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #3 : 06 Октября 2013, 16:54:19 »
А где именно происходит обработка столбцов?
Файл csv имеет абсолютно другой вид, отличный от вида umi, и кстати попробывал ваш вариант, не работает(!
« Последнее редактирование: 06 Октября 2013, 21:48:10 от muldy »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #4 : 06 Октября 2013, 21:48:47 »
А где именно происходит обработка столбцов?

в моем пример, есть комментарий где показано как обратиться к первому столбцу
Цитировать
// например $data[0] это значение первой колонки в вашем сым текущей строки

или вы о чем-то другом спрашиваете?

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #5 : 06 Октября 2013, 22:46:24 »
Да с этим разобрался, ваш пример я так понимаю не рабочий? Правильно те это не готовый метод?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #6 : 06 Октября 2013, 23:10:12 »
Цитировать
Правильно те это не готовый метод?

Этот вопрос не понял.

Код вырезан из рабочего кода, но вырезался прямо сюда в форум, так что за работоспособность не могу поручиться.

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #7 : 06 Октября 2013, 23:41:42 »
Да я имею ввиду что, этот код напрямую не будет работать?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #8 : 07 Октября 2013, 03:34:45 »
ну... должен быть рабочим или близким к этому. Понятно, что в нем нет "начинки", то есть там где у вас будет обработка строк из csv файла (после строчки if($row >= $start and $row <= $end){) нужно вставить создание новых товаров или что-то еще, в зависимости от того что у вас в csv и по какой логике он должен импортироваться в систему.

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #9 : 07 Октября 2013, 11:13:38 »
А можете пример показать, как это будет описано например есть столбцы, у меня: 1 - Vendor, 2 - Name
Ну хотя бы на этих примерах?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #10 : 08 Октября 2013, 17:19:08 »
пример чего? все зависит от логики, например вы хотите создавать новые страницы определенного типа, то примерно так:

<?php
...
if($row >= $start and $row <= $end){
$parent_id = 99; //id раздела куда будут создаваться товары
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId();
$hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($hierarchy_type_id);
$object_type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt());
        $perm = permissionsCollection::getInstance();
        $guestId= $perm->getGuestId(); // получаем id гостя
        $permLevel=1; // ставим права на просмотр всем пользователям


$vendor = data[0];
$name = data[1];

//Creating page...
$page_id = $hierarchy->addElement($parent_id, $hierarchy_type_id, $name, $name, $object_type_id);
$perm->setElementPermissions($guestId,$page_id,$permLevel);
 
$page = $hierarchy->getElement($page_id, true);

$page->setIsActive(true);
$page->h1 = $name;
$page->vendor = $vendor; // записываем производителя в поле с именем "vendor"

$page->commit();
}
...
?>




*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #11 : 08 Октября 2013, 20:45:42 »
Круто, СПАСИБО, как раз то что и надо было показать в примере, взял себе!!!

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #12 : 08 Октября 2013, 22:29:06 »
В общем попробовал в итоге получил такой код:

<?php
class csv_testSplitter extends umiImportSplitter {

  protected function readDataBlock() {
    // xml-пустышка
    $doc = new DOMDocument("1.0", "utf-8");
    $doc->formatOutput = XML_FORMAT_OUTPUT;
    $rootNode = $doc->createElement("umidump");
    $doc->appendChild($rootNode);
    $rootNode->setAttribute('version', '2.0');
    // текущее смещение
    $index = ($this->offset) ? $this->offset : 0;
    //Какие-то действия, в зависимости от текущего смещения
    $start = ($this->offset) ? $this->offset + 1 : 1;
    $end = ($this->offset) ? $start + $this->block_size - 1: $this->block_size;
    $handle = fopen($this->file_path, "r");
   
   
    $row = 1;
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
      if($row == 1) {
        $row++;
        continue;
      }
     
      if($row >= $start and $row <= $end){

        $parent_id = 187; //id раздела куда будут создаваться товары
        $hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId();
        $hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($hierarchy_type_id);
        $object_type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt());
        $perm = permissionsCollection::getInstance();
        $guestId= $perm->getGuestId(); // получаем id гостя
        $permLevel=1; // ставим права на просмотр всем пользователям
         
        $vendor = data[0];
        $name = data[1];
         
          //Creating page...

        $page_id = $hierarchy->addElement($parent_id, $hierarchy_type_id, $name, $name, $object_type_id);
        $perm->setElementPermissions($guestId,$page_id,$permLevel);
           
        $page = $hierarchy->getElement($page_id, true);
       
        $page->setIsActive(true);
        $page->h1 = $name;
        $page->vendor = $vendor; // записываем производителя в поле с именем "vendor"
       
        $page->commit();

      }
      if($row > $end) break;
      $row++; 
    }
    fclose($handle);
    $this->offset += $this->block_size;

    // условие для остановки цикла, которое необходимо настроить
    if (!$data) $this->complete = true;
   
    //тестовый лог
    //file_put_contents(CURRENT_WORKING_DIR .'/traceajax.txt', $index.';', FILE_APPEND);

    return $doc;
  }

  public function translate(DomDocument $doc) {
    return $doc->saveXML();
  }
}
?>

В результате при импорте система пише ошибка разбора данных!
В чем проблема не пойму?
Есть предположение что вот в этой строке:

        $vendor = data[0];
        $name = data[1];

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #13 : 08 Октября 2013, 23:11:17 »
если где-то косяк, то скорее всего в коде (начиная с банального синтаксиса).

при импорте через модуль обмен данных, включи firebug (или его аналог) и там будут отображаться ajax запросы. Как увидишь ошибку, рассмотри внимательно последний ajax запрос (или открой его в новом окне) , не забывая при этом включить debug в config.ini. Скорее всего, ошибка сразу же станет явной.

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Новый формат импорта CSV?
« Ответ #14 : 08 Октября 2013, 23:33:30 »
Да спасибо отследил, действительно было несколько недоработок! теперь все работает!
Вот готовый код, это если кому пригодится:

<?php
class csv_testSplitter extends umiImportSplitter {

  protected function readDataBlock() {
    // xml-пустышка
    $doc = new DOMDocument("1.0", "utf-8");
    $doc->formatOutput = XML_FORMAT_OUTPUT;
    $rootNode = $doc->createElement("umidump");
    $doc->appendChild($rootNode);
    $rootNode->setAttribute('version', '2.0');
    // текущее смещение
    $index = ($this->offset) ? $this->offset : 0;
    //Какие-то действия, в зависимости от текущего смещения
    $start = ($this->offset) ? $this->offset + 1 : 1;
    $end = ($this->offset) ? $start + $this->block_size - 1: $this->block_size;
    $handle = fopen($this->file_path, "r");
   
   
    $row = 1;
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
      if($row == 1) {
        $row++;
        continue;
      }
     
     if($row >= $start and $row <= $end){
     
  $parent_id = 187; //id раздела куда будут создаваться товары
  $hierarchy = umiHierarchy::getInstance();
  $hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId();
  $hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($hierarchy_type_id);
  $object_type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt());
        $perm = permissionsCollection::getInstance();
        $guestId= $perm->getGuestId(); // получаем id гостя
        $permLevel=1; // ставим права на просмотр всем пользователям
 
 
  $vendor = $data[0];
  $name = $data[1];

  $page_id = $hierarchy->addElement($parent_id, $hierarchy_type_id, $name, $vendor, $object_type_id);
  $perm->setElementPermissions($guestId,$page_id,$permLevel);
   
  $page = $hierarchy->getElement($page_id, true);
 
  $page->setIsActive(true);
  $page->h1 = $name;
  $page->description = $vendor; // записываем производителя в поле с именем "vendor"
 
  $page->commit();
}
      if($row > $end) break;
      $row++; 
    }
    fclose($handle);
    $this->offset += $this->block_size;

    // условие для остановки цикла, которое необходимо настроить
    if (!$data) $this->complete = true;
   
    //тестовый лог
    //file_put_contents(CURRENT_WORKING_DIR .'/traceajax.txt', $index.';', FILE_APPEND);

    return $doc;
  }

  public function translate(DomDocument $doc) {
    return $doc->saveXML();
  }
}
?>
Спасибо Admin!