427 lines
16 KiB
PHP
427 lines
16 KiB
PHP
<?php
|
|
|
|
use KupShop\CatalogBundle\Section\SectionFinder;
|
|
use KupShop\KupShopBundle\Util\Compat\ServiceContainer;
|
|
|
|
class Import_XMLfeed extends Window
|
|
{
|
|
use DatabaseCommunication;
|
|
|
|
public $listProducer;
|
|
protected $template = 'window/import.xml_feed.tpl';
|
|
|
|
public function handle()
|
|
{
|
|
if (getVal('Submit') && isset($_REQUEST['type']) && $_REQUEST['type'] == 'xmlFeed') {
|
|
global $cfg;
|
|
$noErrors = 0;
|
|
$type = 'XML Feed';
|
|
$listVAT = [];
|
|
$listLabel = [];
|
|
|
|
$query = sqlQuery('SELECT id, vat FROM '.getTableName('vats'));
|
|
while ($row = sqlFetchArray($query)) {
|
|
$listVAT[$row['id']] = $row['vat'];
|
|
}
|
|
|
|
$query = sqlQuery('SELECT id, name FROM '.getTableName('producers'));
|
|
while ($row = sqlFetchArray($query)) {
|
|
$this->listProducer[$row['id']] = strtolower($row['name']);
|
|
}
|
|
|
|
$query = sqlQuery('SELECT id, label FROM '.getTableName('products_variations_choices_labels'));
|
|
while ($row = sqlFetchArray($query)) {
|
|
$listLabel[$row['id']] = $row['label'];
|
|
}
|
|
|
|
$xml = simplexml_load_file($_REQUEST['feedUrl']);
|
|
|
|
if ($xml === false) {
|
|
$ErrStr = 'Chyba stahovani XML souboru.';
|
|
redirect('launch.php?s=board.php&type=import&what='.$type.'&ErrStr='.urlencode($ErrStr));
|
|
}
|
|
|
|
if (!empty($_FILES['xsltFile']['size'])) {
|
|
// die(print_r($_FILES['xsltFile']));
|
|
$xslt = new XSLTProcessor();
|
|
$xslt->importStylesheet(simplexml_load_file($_FILES['xsltFile']['tmp_name']));
|
|
$xml = simplexml_load_string($xslt->transformToXml($xml));
|
|
if ($xml === false) {
|
|
$ErrStr = 'Chyba aplikovani XSLT transformace';
|
|
redirect('launch.php?s=board.php&type=import&what='.$type.'&ErrStr='.urlencode($ErrStr));
|
|
}
|
|
}
|
|
|
|
$sectionFinder = ServiceContainer::getService(SectionFinder::class);
|
|
|
|
sqlStartTransaction();
|
|
|
|
if ($_REQUEST['dbSave'] == 'delete_and_insert_new') {
|
|
sqlQuery('TRUNCATE '.getTableName('products'));
|
|
sqlQuery('TRUNCATE '.$cfg['DbTable']['photos-products']);
|
|
sqlQuery('TRUNCATE '.getTableName('photos'));
|
|
}
|
|
|
|
clearCache('categories-menu');
|
|
|
|
$category_separator = '/';
|
|
$codes = [];
|
|
$imageCache = [];
|
|
|
|
foreach ($xml->SHOPITEM as $item) {
|
|
if (!empty($item->PRODUCT)) {
|
|
$title = $item->PRODUCT;
|
|
} elseif (!empty($item->PRODUCTNAME)) {
|
|
$title = $item->PRODUCTNAME;
|
|
}
|
|
|
|
// Get Code
|
|
$code = null;
|
|
if (!empty($item->CODE)) {
|
|
$code = strval($item->CODE);
|
|
} elseif (!empty($item->PRODUCTNO)) {
|
|
$code = strval($item->PRODUCTNO);
|
|
} elseif (!empty($item->ITEM_ID)) {
|
|
$code = strval($item->ITEM_ID);
|
|
} elseif (!empty($_REQUEST['codePattern'])) {
|
|
if (preg_match("@{$_REQUEST['codePattern']}@", $item->URL, $matches) >= 1) {
|
|
$code = $matches[1];
|
|
} else {
|
|
echo "Error matching '{$item->URL}' to '{$_REQUEST['codePattern']}'";
|
|
}
|
|
}
|
|
|
|
if (empty($code)) {
|
|
exit("Empty code for product '{$title}'".print_r($item, true));
|
|
}
|
|
|
|
if (isset($codes[$code])) {
|
|
continue;
|
|
}
|
|
|
|
$codes[$code] = true;
|
|
|
|
if (!empty($item->SHORT_DESCRIPTION)) {
|
|
$short_descr = strval($item->SHORT_DESCRIPTION->asXML());
|
|
}
|
|
|
|
if (!empty($item->EAN)) {
|
|
$ean = strval($item->EAN);
|
|
}
|
|
|
|
if (!empty($item->DESCRIPTION)) {
|
|
$long_descr = strval($item->DESCRIPTION->children()->asXML());
|
|
}
|
|
if (empty($long_descr)) {
|
|
unset($long_descr);
|
|
}
|
|
|
|
// Get Prices
|
|
$price = floatval(strtr($item->PRICE, ',', '.'));
|
|
$price_vat = floatval(strtr($item->PRICE_VAT, ',', '.'));
|
|
|
|
if (!empty($item->VAT)) {
|
|
$vat = floatval(strtr($item->VAT, ',', '.')) * 100;
|
|
} elseif (!empty($price) && !empty($price_vat)) {
|
|
$vat = round((($price_vat / $price) - 1) * 100);
|
|
} else {
|
|
$vat = $listVAT[1];
|
|
} // Fall-back to default VAT
|
|
|
|
if (empty($price) && !empty($price_vat)) {
|
|
$price = $price_vat / (1 + $vat / 100.);
|
|
}
|
|
|
|
if (!empty($item->DISCOUNT)) {
|
|
$price_common = $price * (1 + $vat / 100.);
|
|
$price = $price * (1 - floatval(strtr($item->DISCOUNT, ',', '.')));
|
|
}
|
|
|
|
$vat = $this->findVAT($vat, $listVAT);
|
|
|
|
// Get Others
|
|
if (!empty($item->PRODUCER)) {
|
|
$producer = $this->findProducer($item->PRODUCER);
|
|
} elseif (!empty($item->MANUFACTURER)) {
|
|
$producer = $this->findProducer($item->MANUFACTURER);
|
|
}
|
|
$in_store = intval($item->IN_STORE);
|
|
$delivery_time = round($item->AVAILABILITY / 24);
|
|
if ($delivery_time <= 0) {
|
|
$delivery_time = -1;
|
|
}
|
|
|
|
// Get Category
|
|
$category = '';
|
|
if (!empty($item->CATEGORYTEXT)) {
|
|
$category .= strval($item->CATEGORYTEXT);
|
|
} elseif (!empty($item->CATEGORY)) {
|
|
$category .= strval($item->CATEGORY);
|
|
}
|
|
|
|
// Check if already exists
|
|
$product_id = null;
|
|
if ($_REQUEST['dbSave'] == 'update') {
|
|
$product_id = returnSQLResult('SELECT id FROM '.getTableName('products')." WHERE code='".sqlFormatInput($code)."'");
|
|
}
|
|
|
|
$exists = $product_id > 0;
|
|
$updateFields = ['title', 'code', 'ean', 'short_descr', 'long_descr', 'price', 'price_common', 'vat', 'producer', 'in_store', 'delivery_time', 'discount'];
|
|
|
|
$fields = [];
|
|
foreach ($updateFields as $key) {
|
|
if (isset($$key)) {
|
|
$fields[$key] = $$key;
|
|
}
|
|
}
|
|
|
|
// Insert into DB
|
|
if (!$exists) {
|
|
if (!$this->insertSQL('products', $fields)) {// sqlQuery("INSERT INTO ".getTableName("products")." SET $fields"))
|
|
$noErrors++;
|
|
}
|
|
$product_id = sqlInsertId();
|
|
} elseif (!$this->updateSQL('products', $fields, ['id' => $product_id])) {// sqlQuery("UPDATE ".getTableName("products")." SET $fields WHERE id=$product_id"))
|
|
$noErrors++;
|
|
}
|
|
|
|
// Insert category into DB
|
|
if (!$exists && !empty($category)) {
|
|
static $separator_guesed = false;
|
|
if (!$separator_guesed) {
|
|
if (substr_count($category, '|') > substr_count($category, '/')) {
|
|
$category_separator = '|';
|
|
}
|
|
$separator_guesed = true;
|
|
}
|
|
|
|
$parts = explode($category_separator, $category);
|
|
$category = $sectionFinder->findSection($parts);
|
|
|
|
sqlQuery('INSERT INTO '.getTableName('products_in_sections')."
|
|
(id_product, id_section) VALUES
|
|
({$product_id}, {$category})
|
|
ON DUPLICATE KEY UPDATE id_product=id_product");
|
|
}
|
|
|
|
// Download images
|
|
$imagesCount = returnSQLResult('SELECT COUNT(*) FROM '.getTableName('photos_products_relation')." WHERE id_product='{$product_id}'");
|
|
if ((!$exists || $imagesCount == 0) && getVal('downloadImages') == 'yes') {
|
|
$filename = $cfg['Path']['photos'].'import.jpg';
|
|
|
|
$images = [];
|
|
|
|
// Temporary hack - get image from detail url
|
|
/*
|
|
if(!empty($item->URL) && !isset($imageCache[strval($item->IMGURL)]))
|
|
{
|
|
$content = file_get_contents(strval($item->URL));
|
|
if (preg_match("@http://obchod.pumpa.cz/images/sklady/[^\']+@", $content, $matches))
|
|
$images[] = $matches[0];
|
|
elseif (preg_match("@/images/sklady/[^\"']+@", $content, $matches))
|
|
$images[] = "http://eshop.cerpadlavrchlabi.cz".$matches[0];
|
|
}
|
|
*/
|
|
|
|
if (empty($images)) {
|
|
$images = [];
|
|
if (!empty($item->IMGURL)) {
|
|
$images[] = strval($item->IMGURL);
|
|
}
|
|
|
|
if (!empty($item->IMAGES)) {
|
|
foreach ($item->IMAGES->IMGURL as $image) {
|
|
$images[] = strval($image);
|
|
}
|
|
}
|
|
}
|
|
|
|
$first = true;
|
|
foreach ($images as $imageUrl) {
|
|
if (isset($imageCache[$imageUrl])) {
|
|
$photo_id = $imageCache[$imageUrl];
|
|
} else {
|
|
if (!$this->stream_copy($imageUrl, $filename)) {
|
|
continue;
|
|
}
|
|
|
|
$path_parts = pathinfo($imageUrl);
|
|
|
|
if (empty($path_parts['extension'])) {
|
|
$path_parts['basename'] .= '.jpg';
|
|
$path_parts['extension'] = 'jpg';
|
|
}
|
|
$_FILES['picture']['name'] = $path_parts['basename'];
|
|
$_FILES['picture']['type'] = strtolower($path_parts['extension']);
|
|
$_FILES['picture']['tmp_name'] = $filename;
|
|
$img = new Photos('product');
|
|
$img->newImage();
|
|
$img->uploadImage($_FILES['picture'], false);
|
|
|
|
// ulozit do Databaze
|
|
$img->insertImageIntoDB($path_parts['basename'], '', '');
|
|
$photo_id = $img->getID();
|
|
$imageCache[$imageUrl] = $photo_id;
|
|
}
|
|
|
|
if (!sqlQuery('INSERT INTO '.$cfg['DbTable']['photos-products']." (id_photo, id_product, show_in_lead, active) VALUES ({$photo_id}, {$product_id}, '".($first ? 'Y' : 'N')."', 'Y')")) {
|
|
$noErrors++;
|
|
}
|
|
$first = false;
|
|
}
|
|
}
|
|
|
|
// Import variants
|
|
if (!empty($item->VARIATIONS)) {
|
|
$product = new Product($product_id);
|
|
|
|
foreach ($item->VARIATIONS->VARIATION as $variation) {
|
|
$labels = [];
|
|
foreach ($variation->LABEL as $label) {
|
|
$labels[$this->findLabel(strval($label['name']), $listLabel)] = strval($label);
|
|
}
|
|
|
|
$variation_id = \Variations::createProductVariation($product_id, $labels);
|
|
|
|
$in_store = ($variation->AVAILABILITY != 0) ? 1 : 0;
|
|
$title = $variation->TITLE;
|
|
|
|
$fields = ['in_store' => $in_store, 'title' => $title]; // queryCreate(array("in_store", "title"));
|
|
|
|
$this->updateSQL('products_variations', $fields, ['id' => $variation_id]);
|
|
// sqlQuery("UPDATE ".getTableName("products_variations")." SET $fields WHERE id=$variation_id");
|
|
}
|
|
|
|
$product->updateInStore();
|
|
$product->updateDeliveryTime();
|
|
}
|
|
/*
|
|
if(!empty($item->VARIANT))
|
|
{
|
|
$product = new Product($product_id);
|
|
|
|
foreach ($item->VARIANT as $variation)
|
|
{
|
|
$parts = preg_split("/ - /", strval($variation->PRODUCTNAME));
|
|
if (count($parts) != 3)
|
|
{
|
|
echo "Error parsing variation: '{$title}'";
|
|
continue;
|
|
}
|
|
$partLabels = explode("||", $parts[1]);
|
|
$partValues = explode("||", $parts[2]);
|
|
$labels = array();
|
|
foreach($partLabels as $index => $label)
|
|
$labels[$this->findLabel(strval($label), $listLabel)] = strval($partValues[$index]);
|
|
|
|
$variation_id = $product->createVariation($labels);
|
|
|
|
$price = $variation->PRICE_VAT / ((100 + $vat) / 100);
|
|
|
|
//$fields = queryCreate(array("price"));
|
|
|
|
$fields = ["price" => $price];
|
|
|
|
$this->updateSQL("products_variations", $fields, ["id" => $variation_id]);
|
|
|
|
//sqlQuery("UPDATE ".getTableName("products_variations")." SET $fields WHERE id=$variation_id");
|
|
}
|
|
|
|
$product->updateInStore();
|
|
$product->updateDeliveryTime();
|
|
}
|
|
*/
|
|
foreach ($updateFields as $field) {
|
|
unset($$field);
|
|
}
|
|
}
|
|
|
|
// if($_REQUEST['downloadImages'] == "yes")
|
|
// if (isset($filename))
|
|
// unlink($filename);
|
|
|
|
clearCache('categories-menu');
|
|
|
|
sqlFinishTransaction();
|
|
|
|
if ($noErrors == 0) {
|
|
$ErrStr = 'Import proběhl úspěšně.';
|
|
redirect('launch.php?s=import.xml_feed.php&ErrStr='.urlencode($ErrStr));
|
|
} else {
|
|
$ErrStr = 'Vyskytly se chyby při importu. Počet chyb: '.(string) $noErrors;
|
|
redirect('launch.php?s=import.xml_feed.php&ErrStr='.urlencode($ErrStr));
|
|
}
|
|
}
|
|
}
|
|
|
|
public function findVAT($percent, $listVAT)
|
|
{
|
|
if ($index = array_search($percent, $listVAT)) {
|
|
return $index;
|
|
}
|
|
|
|
sqlQuery('INSERT INTO '.getTableName('vats')." (descr, vat) VALUES ('Daň {$percent}%', {$percent})");
|
|
$index = sqlInsertId();
|
|
|
|
$listVAT[$index] = $percent;
|
|
|
|
return $index;
|
|
}
|
|
|
|
public function findProducer($name)
|
|
{
|
|
$name = trim($name);
|
|
if ($name == '') {
|
|
return 0;
|
|
}
|
|
|
|
if (($index = array_search(strtolower($name), $this->listProducer)) !== false) {
|
|
return $index;
|
|
}
|
|
|
|
$this->insertSQL('producers', ['name' => $name]);
|
|
$index = sqlInsertId();
|
|
|
|
$this->listProducer[$index] = strtolower($name);
|
|
|
|
return $index;
|
|
}
|
|
|
|
public function findLabel($name, $listLabel)
|
|
{
|
|
if ($name == '') {
|
|
return 0;
|
|
}
|
|
|
|
if (($index = array_search($name, $listLabel)) !== false) {
|
|
return $index;
|
|
}
|
|
|
|
sqlQuery('INSERT INTO '.getTableName('products_variations_choices_labels')." (label) VALUES ('{$name}')");
|
|
$index = sqlInsertId();
|
|
|
|
$listLabel[$index] = $name;
|
|
|
|
return $index;
|
|
}
|
|
|
|
public function stream_copy($src, $dest)
|
|
{
|
|
$fsrc = fopen($src, 'r');
|
|
|
|
if (!$fsrc) {
|
|
return 0;
|
|
}
|
|
|
|
$fdest = fopen($dest, 'w+');
|
|
$len = stream_copy_to_stream($fsrc, $fdest);
|
|
fclose($fsrc);
|
|
fclose($fdest);
|
|
|
|
return $len;
|
|
}
|
|
}
|
|
|
|
$importxmlfeed = new Import_XMLfeed();
|
|
$importxmlfeed->run();
|