Встречался. Использую такую заготовки для 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)
пример чего? все зависит от логики, например вы хотите создавать новые страницы определенного типа, то примерно так:
<?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();
}
...
?>
В общем попробовал в итоге получил такой код:
<?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];
Да спасибо отследил, действительно было несколько недоработок! теперь все работает!
Вот готовый код, это если кому пригодится:
<?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!