Skip to content

Instantly share code, notes, and snippets.

@andronex
Last active December 29, 2019 09:42
Show Gist options
  • Save andronex/f15942c8cd80209b554f8af13ea35680 to your computer and use it in GitHub Desktop.
Save andronex/f15942c8cd80209b554f8af13ea35680 to your computer and use it in GitHub Desktop.
Очередной импортёр товаров из XML файла в интернет-магазин на MODX Revolution v.2.4.4-pl + miniShop2 v.2.2.0-pl2
<?php
$tplProduct = 3; //номер шаблона для карточки товара
$tplParent = 2; //номер шаблона для категорий
$tplChildParent = 2; //номер шаблона для подкатегорий
$idParent = 6; //id каталога товаров
$fileProduct = 'product.xml'; //имя файла с товарами
$xpath_expression['pagetitle'] = '//Товары/Номенклатура'; //DOM структура в XML файле до имени
$xpath_expression['article'] = '//Товары/Артикул'; //DOM структура в XML файле до артикула
$xpath_expression['parents'] = '//Товары/Родитель'; //DOM структура в XML файле до родителей
$xpath_expression['price'] = '//Товары/ЦенаРусс'; //DOM структура в XML файле до цены
// инициализация MODX API
define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/core/config/config.inc.php';
require_once MODX_BASE_PATH . 'index.php';
// Включаем обработку ошибок
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->getService('error','error.modError');
$modx->lexicon->load('minishop2:default');
$modx->lexicon->load('minishop2:manager');
$modx->error->message = null; // Обнуляем переменную
set_time_limit(259200);
$tmp = 'Trying to set time limit = 259200 sec: ';
$tmp .= ini_get('max_execution_time') == 259200 ? 'done' : 'error';
$modx->log(modX::LOG_LEVEL_ERROR, $tmp);
// чтение файла XML
$xml = new DOMDocument();
$xml->load($fileProduct);
$xpath = new DOMXPath($xml);
$pagetitles = $xpath->query($xpath_expression['pagetitle']);
$articles = $xpath->query($xpath_expression['article']);
$parents = $xpath->query($xpath_expression['parents']);
$prices = $xpath->query($xpath_expression['price']);
$count = $pagetitles->length - 1;
function createProduct($data = array()){
global $modx;
$q = 'SELECT MAX(`id`) AS id FROM '.$modx->getTableName('modResource');
$o = $modx->prepare($q);
$o->execute();
$resmaxid = $o->fetch(PDO::FETCH_ASSOC);
$resmaxid = ' id-'.($resmaxid['id'] + 1);
$data['pagetitle'] .= $resmaxid;
//return $data;
$modx->error->message = null;
$response = $modx->runProcessor('resource/create', $data,
array('processors_path' => MODX_CORE_PATH.'model/modx/processors/')
);
if ($response->isError()) {
return $response->getAllErrors();
}
$resource = $response->getObject();
$res = $modx->getObject('msProduct', array('id' => $resource['id']));
$res->set('pagetitle', str_replace($resmaxid, '', $res->get('pagetitle')));
$res->save();
return 'new';
}
for($i = 0;$i <= $count;$i++){
//if($i != 5) {continue;}
$data = $dataCat = $parents_array = $parentstmp = array();
$pagetitle = trim($pagetitles->item($i)->nodeValue);
$article = trim($articles->item($i)->nodeValue);
$parents_array = trim($parents->item($i)->nodeValue);
$price = str_replace(array(" "," ",","), array("","","."), $prices->item($i)->nodeValue);
$parentstmp = explode('/',$parents_array);
unset($parentstmp[0]);
foreach($parentstmp as $parent) {
if($cat = $modx->getObject('msCategory', array('pagetitle' => $parent))) {
$data['parent'] = $cat->id;
continue;
}
$dataCat['pagetitle'] = $parent;
$dataCat['class_key'] = 'msCategory';
$dataCat['context_key'] = 'web';
$dataCat['template'] = $tplParent;
$dataCat['parent'] = ($data['parent']) ? $data['parent'] : $idParent;
$dataCat['published'] = 1;
$modx->error->message = null;
$response = $modx->runProcessor('resource/create', $dataCat,
array('processors_path' => MODX_CORE_PATH.'model/modx/processors/')
);
if ($response->isError()) {
return $response->getAllErrors();
}
$resource = $response->getObject();
$data['parent'] = $resource['id'];
}
$data['pagetitle'] = $pagetitle;
$data['article'] = ($article != '') ? $article : null;
$data['price'] = $price;
$data['class_key'] = 'msProduct';
$data['context_key'] = 'web';
$data['template'] = $tplProduct;
$data['published'] = 1;
$q = $modx->newQuery('msProduct');
$q->select($modx->getSelectColumns('msProduct','msProduct').','.$modx->getSelectColumns('msProductData','Data'));
$q->innerJoin('msProductData', 'Data', 'msProduct.id = Data.id');
if($data['article']) $q->where(array('Data.article' => $data['article']));
else $q->where(array('pagetitle' => $data['pagetitle']));
$q->prepare();
if($res = $modx->getObject('msProduct', $q)) {
$data['editedon'] = date("Y-m-d H:i:s");
$res->set('editedon',$data['editedon']);
$res->set('price', $data['price']);
$res->save();
$new = 'upd';
continue;
}
$new = createProduct($data);
//if($i == 5) {break;}
}
print_r($new);
exit;
<?php
/**
* с корректным пересохранением опций товаров
*/
$tplProduct = 3; //номер шаблона для карточки товара
$tplParent = 2; //номер шаблона для категорий
$tplChildParent = 2; //номер шаблона для подкатегорий
$idParent = 6; //id каталога товаров
$fileProduct = '/home/s5676/www/assets/components/minishop2/import/ExportFile.xml'; //имя файла с товарами
$xpath_expression['pagetitle'] = '//Товары/Номенклатура'; //DOM структура в XML файле до имени
$xpath_expression['article'] = '//Товары/Артикул'; //DOM структура в XML файле до артикула
$xpath_expression['parents'] = '//Товары/Родитель'; //DOM структура в XML файле до родителей
$xpath_expression['ean'] = '//Товары/EAN'; //DOM структура в XML файле до EAN
$xpath_expression['priceru'] = '//Товары/ЦенаРусс'; //DOM структура в XML файле ЦенаРусс
$xpath_expression['price'] = '//Товары/ЦенаУкр'; //DOM структура в XML файле ЦенаУкр
$xpath_expression['kolcz'] = '//Товары/КоличествоЧех'; //DOM структура в XML КоличествоЧех
$xpath_expression['kolru'] = '//Товары/КоличествоРусс'; //DOM структура в XML КоличествоРусс
$xpath_expression['kolukr'] = '//Товары/КоличествоУкр'; //DOM структура в XML КоличествоУкр
// инициализация MODX API
define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/core/config/config.inc.php';
require_once MODX_BASE_PATH . 'index.php';
// Включаем обработку ошибок
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->getService('error','error.modError');
$modx->lexicon->load('minishop2:default');
$modx->lexicon->load('minishop2:manager');
$modx->error->message = null; // Обнуляем переменную
if (XPDO_CLI_MODE) {
set_time_limit(259200);
$tmp = 'Trying to set time limit = 259200 sec: ';
$tmp .= ini_get('max_execution_time') == 259200 ? 'done' : 'error';
$modx->log(modX::LOG_LEVEL_ERROR, $tmp);
// чтение файла XML
$xml = new DOMDocument();
$xml->load($fileProduct);
$xpath = new DOMXPath($xml);
$pagetitles = $xpath->query($xpath_expression['pagetitle']);
$articles = $xpath->query($xpath_expression['article']);
$parents = $xpath->query($xpath_expression['parents']);
$eans = $xpath->query($xpath_expression['ean']);
$pricerus = $xpath->query($xpath_expression['priceru']);
$prices = $xpath->query($xpath_expression['price']);
$kolczs = $xpath->query($xpath_expression['kolcz']);
$kolrus = $xpath->query($xpath_expression['kolru']);
$kolukrs = $xpath->query($xpath_expression['kolukr']);
$count = $pagetitles->length - 1;
function createProduct($data = array()){
global $modx;
$q = 'SELECT MAX(`id`) AS id FROM '.$modx->getTableName('modResource');
$o = $modx->prepare($q);
$o->execute();
$resmaxid = $o->fetch(PDO::FETCH_ASSOC);
$resmaxid = ' id-'.($resmaxid['id'] + 1);
$data['pagetitle'] .= $resmaxid;
//return $data;
$modx->error->message = null;
$response = $modx->runProcessor('resource/create', $data,
array('processors_path' => MODX_CORE_PATH.'model/modx/processors/')
);
if ($response->isError()) {
return $response->getAllErrors();
}
$resource = $response->getObject();
$res = $modx->getObject('msProduct', array('id' => $resource['id']));
$res->set('pagetitle', str_replace($resmaxid, '', $res->get('pagetitle')));
$res->save();
return 'new';
}
for($i = 0;$i <= $count;$i++){
//if($i != 5) {continue;}
$data = $dataCat = $parents_array = $parentstmp = array();
$pagetitle = trim($pagetitles->item($i)->nodeValue);
$article = trim($articles->item($i)->nodeValue);
$parents_array = trim($parents->item($i)->nodeValue);
$price = str_replace(array(" "," ",","), array("","","."), $prices->item($i)->nodeValue);
$ean = trim($eans->item($i)->nodeValue);
$priceru = str_replace(array(" "," ",","), array("","","."), $pricerus->item($i)->nodeValue);
$kolru = trim($kolrus->item($i)->nodeValue);
$kolcz = trim($kolczs->item($i)->nodeValue);
$kolukr = trim($kolukrs->item($i)->nodeValue);
$parentstmp = explode('/',$parents_array);
unset($parentstmp[0]);
foreach($parentstmp as $parent) {
if($cat = $modx->getObject('msCategory', array('pagetitle' => $parent, 'parent' => isset($data['parent']) ? $data['parent'] : $idParent))) {
$data['parent'] = $cat->id;
continue;
}
$dataCat['pagetitle'] = $parent;
$q = 'SELECT MAX(`id`) AS id FROM '.$modx->getTableName('modResource');
$o = $modx->prepare($q);
$o->execute();
$resmaxid = $o->fetch(PDO::FETCH_ASSOC);
$resmaxid = ' id-'.($resmaxid['id'] + 1);
$dataCat['pagetitle'] .= $resmaxid;
$dataCat['class_key'] = 'msCategory';
$dataCat['context_key'] = 'web';
$dataCat['template'] = $tplParent;
$dataCat['parent'] = ($data['parent']) ? $data['parent'] : $idParent;
$dataCat['published'] = 1;
$modx->error->message = null;
$response = $modx->runProcessor('resource/create', $dataCat,
array('processors_path' => MODX_CORE_PATH.'model/modx/processors/')
);
if ($response->isError()) {
return $response->getAllErrors();
}
$resource = $response->getObject();
$data['parent'] = $resource['id'];
$res = $modx->getObject('msCategory', array('id' => $resource['id']));
$res->set('pagetitle', str_replace($resmaxid, '', $res->get('pagetitle')));
$res->save();
}
$data['pagetitle'] = $pagetitle;
$data['article'] = ($article != '') ? $article : null;
$data['price'] = $price;
$data['class_key'] = 'msProduct';
$data['context_key'] = 'web';
$data['template'] = $tplProduct;
$data['published'] = 1;
$data['ean'] = $ean;
$data['priceru'] = $priceru;
$data['kolru'] = $kolru;
$data['kolcz'] = $kolcz;
$data['kolukr'] = $kolukr;
//print_r($data);exit;
$q = $modx->newQuery('msProduct');
$q->select($modx->getSelectColumns('msProduct','msProduct').','.$modx->getSelectColumns('msProductData','Data'));
$q->innerJoin('msProductData', 'Data', 'msProduct.id = Data.id');
if($data['article']) $q->where(array('Data.article' => $data['article']));
else $q->where(array('pagetitle' => $data['pagetitle']));
$q->prepare();
if($res = $modx->getObject('msProduct', $q)) {
$data['editedon'] = date("Y-m-d H:i:s");
//корректное пересохранение опций товара
$optionKeys = $res->getOptionKeys();
$productData = $res->toArray();
$productOption = array();
if(count($optionKeys) > 0) {
$productOption = array();
foreach ($optionKeys as $key) {
if(is_array($productData[$key])) {
foreach ($productData[$key] as $dataOption) {
$productOption[] = '('.$res->get('id').',"'.$key.'","'.$dataOption.'")';
}
}
else if(!empty($productData[$key])) $productOption[] = '('.$res->get('id').',"'.$key.'","'.$productData[$key].'")';
}
}
if (!empty($productOption)) {
$sql = 'INSERT INTO '.$modx->getTableName('msProductOption').' (`product_id`,`key`,`value`) VALUES ' . implode(',', $productOption).';';
$stmt = $modx->prepare($sql);
$stmt->execute();
$stmt->closeCursor();
}
//end
$res->set('editedon',$data['editedon']);
$res->set('price', $data['price']);
$res->set('ean', $data['ean']);
$res->set('priceru', $data['priceru']);
$res->set('kolru', $data['kolru']);
$res->set('kolcz', $data['kolcz']);
$res->set('kolukr', $data['kolukr']);
$res->save();
$new = 'upd';
continue;
}
$new = createProduct($data);
//if($i == 5) {break;}
}
//print_r($new);
$modx->log(modX::LOG_LEVEL_ERROR, 'Все круто!');
}
exit;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment