<?php
require_once('../../api/Simpla.php');
class ImportAjax extends Simpla
{
{
if(!$this->managers->access('import'))
return false;
// Для корректной работы установим локаль UTF-8
setlocale(LC_ALL, 'ru_RU.UTF-8');
$result = new stdClass;
// Определяем колонки из первой строки файла
$f = fopen($this->import_files_dir.$this->import_file, 'r');
$this->columns = fgetcsv($f, null, $this->column_delimiter);
// Заменяем имена колонок из файла на внутренние имена колонок
foreach($this->columns as &$column)
{
if($internal_name = $this->internal_column_name($column))
{
$this->internal_columns_names[$column] = $internal_name;
$column = $internal_name;
}
}
// Если нет названия товара - не будем импортировать
if(!in_array('name', $this->columns) && !in_array('sku', $this->columns))
return false;
// Переходим на заданную позицию, если импортируем не сначала
if($from = $this->request->get('from'))
fseek($f, $from);
// Массив импортированных товаров
$imported_items = array();
// Проходимся по строкам, пока не конец файла
// или пока не импортировано достаточно строк для одного запроса
for($k=0; !feof($f) && $k<$this->products_count; $k++)
{
// Читаем строку
$line = fgetcsv($f, 0, $this->column_delimiter);
$product = null;
if(is_array($line))
// Проходимся по колонкам строки
foreach($this->columns as $i=>$col)
{
// Создаем массив item[название_колонки]=значение
if(isset($line[$i]) && !empty($line) && !empty($col))
$product[$col] = $line[$i];
}
// Импортируем этот товар
if($imported_item = $this->import_item($product))
$imported_items[] = $imported_item;
}
// Запоминаем на каком месте закончили импорт
$from = ftell($f);
// И закончили ли полностью весь файл
$result->end = feof($f);
fclose($f);
$size = filesize($this->import_files_dir.$this->import_file);
// Создаем объект результата
$result->from = $from; // На каком месте остановились
$result->totalsize = $size; // Размер всего файла
$result->items = $imported_items; // Импортированные товары
return $result;
}
// Импорт одного товара $item[column_name] = value;
private function import_item($item)
{
$imported_item = new stdClass;
// Проверим не пустое ли название и артинкул (должно быть хоть что-то из них)
if(empty($item['name']) && empty($item['sku']))
return false;
// Подготовим товар для добавления в базу
$product = array();
if(isset($item['name']))
$product['name'] = trim($item['name']);
if(isset($item['meta_title']))
$product['meta_title'] = trim($item['meta_title']);
if(isset($item['meta_keywords']))
$product['meta_keywords'] = trim($item['meta_keywords']);
if(isset($item['meta_description']))
$product['meta_description'] = trim($item['meta_description']);
if(isset($item['annotation']))
$product['annotation'] = trim($item['annotation']);
if(isset($item['description']))
$product['body'] = trim($item['description']);
if(isset($item['visible']))
$product['visible'] = intval($item['visible']);
if(isset($item['featured']))
$product['featured'] = intval($item['featured']);
if(!empty($item['url']))
$product['url'] = trim($item['url']);
elseif(!empty($item['name']))
$product['url'] = $this->translit($item['name']);
// Подготовим вариант товара
$variant = array();
if(isset($item['variant']))
$variant['name'] = trim($item['variant']);
if(isset($item['price']))
$variant['price'] = str_replace(',', '.', str_replace(' ', '', trim($item['price'])));
if(isset($item['compare_price']))
$variant['compare_price'] = trim($item['compare_price']);
if(isset($item['stock']))
if($item['stock'] == '')
$variant['stock'] = null;
else
$variant['stock'] = trim($item['stock']);
if(isset($item['sku']))
$variant['sku'] = trim($item['sku']);
// Если задан артикул варианта, найдем этот вариант и соответствующий товар
if(!empty($variant['sku']))
{
$this->db->query('SELECT v.id as variant_id, v.product_id FROM __variants v, __products p WHERE v.sku=? AND v.product_id = p.id LIMIT 1', $variant['sku']);
$result = $this->db->result();
if($result)
{
// и обновим товар
if(!empty($product))
$this->products->update_product($result->product_id, $product);
// и вариант
if(!empty($variant))
$this->variants->update_variant($result->variant_id, $variant);
$product_id = $result->product_id;
$variant_id = $result->variant_id;
// Обновлен
$imported_item->status = 'updated';
}
}
// Если на прошлом шаге товар не нашелся, и задано хотя бы название товара
if((empty($product_id) || empty($variant_id)) && isset($item['name']))
{
if(!empty($variant['sku']) && empty($variant['name']))
$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id WHERE v.sku=? LIMIT 1', $variant['sku']);
elseif(isset($item['variant']))
$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id AND v.name=? WHERE p.name=? LIMIT 1', $item['variant'], $item['name']);
else
$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id WHERE p.name=? LIMIT 1', $item['name']);
$r = $this->db->result();
if($r)
{
$product_id = $r->product_id;
$variant_id = $r->variant_id;
}
// Если вариант найден - обновляем,
if(!empty($variant_id))
{
$this->variants->update_variant($variant_id, $variant);
$this->products->update_product($product_id, $product);
$imported_item->status = 'updated';
}
// Иначе - добавляем
elseif(empty($variant_id))
{
if(empty($product_id))
$product_id = $this->products->add_product($product);
$this->db->query('SELECT max(v.position) as pos FROM __variants v WHERE v.product_id=? LIMIT 1', $product_id);
$pos = $this->db->result('pos');
$variant['position'] = $pos+1;
$variant['product_id'] = $product_id;
$variant_id = $this->variants->add_variant($variant);
$imported_item->status = 'added';
}
}
if(!empty($variant_id) && !empty($product_id))
{
// Нужно вернуть обновленный товар
$imported_item->variant = $this->variants->get_variant(intval($variant_id));
$imported_item->product = $this->products->get_product(intval($product_id));
// Добавляем категории к товару
if(!empty($categories_ids))
foreach($categories_ids as $c_id)
$this->categories->add_product_category($product_id, $c_id);
// Изображения товаров
if(isset($item['images']))
{
// Изображений может быть несколько, через запятую
$images = explode(',', $item['images']);
foreach($images as $image)
{
$image = trim($image);
if(!empty($image))
{
// Имя файла
$image_filename = pathinfo($image, PATHINFO_BASENAME);
// Добавляем изображение только если такого еще нет в этом товаре
$this->db->query('SELECT filename FROM __images WHERE product_id=? AND (filename=? OR filename=?) LIMIT 1', $product_id, $image_filename, $image);
if(!$this->db->result('filename'))
{
$this->products->add_image($product_id, $image);
}
}
}
}
return $imported_item;
}
}
}