-
-
Save webinmd/fa8c60f9ed696fc9d280dbd28a5d784f to your computer and use it in GitHub Desktop.
Очередной импортёр товаров из XML файла в интернет-магазин на MODX Revolution v.2.4.4-pl + miniShop2 v.2.2.0-pl2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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