Last active
August 27, 2016 18:27
-
-
Save vgrish/2ff83ba18af9bda2cb12 to your computer and use it in GitHub Desktop.
пример импорта для msop2 (не проверялся)
This file contains hidden or 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 | |
define('MODX_API_MODE', true); | |
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/config/config.inc.php'; | |
require_once MODX_BASE_PATH . 'index.php'; | |
if (XPDO_CLI_MODE) { | |
$file = @$argv[1]; | |
$fields = @$argv[2]; | |
$update = (bool) !empty($argv[3]); | |
$key = @$argv[4]; | |
$is_debug = (bool) !empty($argv[5]); | |
$delimeter = @$argv[6]; | |
} | |
else { | |
$file = @$_REQUEST['file']; | |
$fields = @$_REQUEST['fields']; | |
$update = (bool) !empty($_REQUEST['update']); | |
$key = @$_REQUEST['key']; | |
$is_debug = (bool) !empty($_REQUEST['debug']); | |
$delimeter = @$_REQUEST['delimeter']; | |
} | |
// Load main services | |
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML'); | |
$modx->setLogLevel($is_debug ? modX::LOG_LEVEL_INFO : modX::LOG_LEVEL_ERROR); | |
$modx->getService('error','error.modError'); | |
$modx->lexicon->load('minishop2:default'); | |
$modx->lexicon->load('minishop2:manager'); | |
/* msop2 */ | |
$msop2 = $modx->getService('msop2', 'msop2', $modx->getOption('msop2_core_path', null, $modx->getOption('core_path') . 'components/msop2/') . 'model/msop2/'); | |
// Time limit | |
set_time_limit(600); | |
$tmp = 'Trying to set time limit = 600 sec: '; | |
$tmp .= ini_get('max_execution_time') == 600 ? 'done' : 'error'; | |
$modx->log(modX::LOG_LEVEL_INFO, $tmp); | |
// Check required options | |
if (empty($fields)) { | |
$modx->log(modX::LOG_LEVEL_ERROR, 'You must specify the parameter "fields". It needed for parse of your file.'); | |
exit; | |
} | |
if (empty($key)) { | |
$modx->log(modX::LOG_LEVEL_ERROR, 'You must specify the parameter "key". It needed for check for duplicates.'); | |
exit; | |
} | |
$keys = array_map('trim', explode(',', strtolower($fields))); | |
$tv_enabled = false; | |
foreach ($keys as $v) { | |
if (preg_match('/^tv(\d)$/', $v)) { | |
$tv_enabled = true; | |
break; | |
} | |
} | |
if (empty($delimeter)) {$delimeter = ';';} | |
// Check file | |
if (empty($file)) { | |
$error = 'You must specify an file in the '; | |
$error .= XPDO_CLI_MODE ? 'first parameter of console call' : '$_GET["file"] parameter'; | |
$error .= '!'; | |
$modx->log(modX::LOG_LEVEL_ERROR, $error); | |
exit; | |
} | |
elseif (!preg_match('/\.csv$/i', $file)) { | |
$modx->log(modX::LOG_LEVEL_ERROR, 'Wrong file extension. File must be an *.csv.'); | |
exit; | |
} | |
$file = str_replace('//', '/', MODX_BASE_PATH . $file); | |
if (!file_exists($file)) { | |
$modx->log(modX::LOG_LEVEL_ERROR, 'File not found at '.$file.'.'); | |
exit; | |
} | |
// Import! | |
$handle = fopen($file, "r"); | |
$rows = $created = $updated = 0; | |
while (($csv = fgetcsv($handle, 0, $delimeter)) !== false) { | |
$rows ++; | |
$data = $gallery = array(); | |
$modx->error->reset(); | |
$modx->log(modX::LOG_LEVEL_INFO, "Raw data for import: \n".print_r($csv,1)); | |
foreach ($keys as $k => $v) { | |
if (!isset($csv[$k])) { | |
exit('Field "' . $v . '" not exists in file. Please fix import file or parameter "fields".'); | |
} | |
if ($v == 'gallery') { | |
$gallery[] = $csv[$k]; | |
} | |
elseif (isset($data[$v]) && !is_array($data[$v])) { | |
$data[$v] = array($data[$v], $csv[$k]); | |
} | |
elseif (isset($data[$v]) && is_array($data[$v])) { | |
$data[$v][] = $csv[$k]; | |
} | |
else { | |
$data[$v] = $csv[$k]; | |
} | |
} | |
$is_product = false; | |
// Set default values | |
if (empty($data['class_key'])) {$data['class_key'] = 'msProduct';} | |
if (empty($data['context_key'])) { | |
if (isset($data['parent']) && $parent = $modx->getObject('modResource', $data['parent'])) { | |
$data['context_key'] = $parent->get('context_key'); | |
} | |
elseif (isset($modx->resource) && isset($modx->context)) { | |
$data['context_key'] = $modx->context->key; | |
} | |
else { | |
$data['context_key'] = 'web'; | |
} | |
} | |
$data['tvs'] = $tv_enabled; | |
$modx->log(modX::LOG_LEVEL_INFO, "Array with importing data: \n" . print_r($data, 1)); | |
// Duplicate check | |
$q = $modx->newQuery($data['class_key']); | |
$q->select($data['class_key'].'.id'); | |
if (strtolower($data['class_key']) == 'msproduct') { | |
$q->innerJoin('msProductData', 'Data', $data['class_key'].'.id = Data.id'); | |
$is_product = true; | |
} | |
$tmp = $modx->getFields($data['class_key']); | |
if (isset($tmp[$key])) { | |
$q->where(array($key => $data[$key])); | |
} | |
elseif ($is_product) { | |
$q->where(array('Data.'.$key => $data[$key])); | |
} | |
$q->prepare(); | |
$modx->log(modX::LOG_LEVEL_INFO, "SQL query for check for duplicate: \n" . $q->toSql()); | |
/** @var modResource $exists */ | |
if ($exists = $modx->getObject($data['class_key'], $q)) { | |
$modx->log(modX::LOG_LEVEL_INFO, "Key $key = $data[$key] has duplicate."); | |
if (!$update) { | |
$modx->log(modX::LOG_LEVEL_ERROR, "Skipping line with $key = \"$data[$key]\" because update is disabled."); | |
if ($is_debug) { | |
$modx->log(modX::LOG_LEVEL_INFO, 'You in debug mode, so we process only 1 row. Time: '.number_format(microtime(true) - $modx->startTime, 7) . " s"); | |
exit; | |
} | |
else {continue;} | |
} | |
else { | |
$action = 'update'; | |
$data['id'] = $exists->id; | |
} | |
} | |
else { | |
$action = 'create'; | |
} | |
// Create or update resource | |
/** @var modProcessorResponse $response */ | |
$response = $modx->runProcessor('resource/'.$action, $data); | |
if ($response->isError()) { | |
$modx->log(modX::LOG_LEVEL_ERROR, "Error on $action: \n". print_r($response->getAllErrors(), 1)); | |
} | |
else { | |
if ($action == 'update') {$updated ++;} | |
else {$created ++;} | |
$resource = $response->getObject(); | |
$modx->log(modX::LOG_LEVEL_INFO, "Successful $action: \n". print_r($resource, 1)); | |
// Process gallery images, if exists | |
if (!empty($gallery)) { | |
$modx->log(modX::LOG_LEVEL_INFO, "Importing images: \n". print_r($gallery, 1)); | |
foreach ($gallery as $v) { | |
if (empty($v)) {continue;} | |
$image = str_replace('//', '/', MODX_BASE_PATH . $v); | |
if (!file_exists($image)) { | |
$modx->log(modX::LOG_LEVEL_ERROR, "Could not import image \"$v\" to gallery. File \"$image\" not found on server."); | |
} | |
else { | |
$response = $modx->runProcessor('gallery/upload', | |
array('id' => $resource['id'], 'name' => $v, 'file' => $image), | |
array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/') | |
); | |
if ($response->isError()) { | |
$modx->log(modX::LOG_LEVEL_ERROR, "Error on upload \"$v\": \n". print_r($response->getAllErrors(), 1)); | |
} | |
else { | |
$modx->log(modX::LOG_LEVEL_INFO, "Successful upload \"$v\": \n". print_r($response->getObject(), 1)); | |
} | |
} | |
} | |
} | |
} | |
/* msop2 . Создаем цены для size */ | |
if (!empty($data['size'])) { | |
foreach ($data['size'] as $value) { | |
$msopData = array(); | |
$msopData['product_id'] = $resource['id']; // id ресурса | |
$msopData['value'] = $value; // значение размера | |
$msopData['option'] = 1; // id опции в msop2 для size | |
$msopData['operation'] = 1; // id операции (установить) | |
if (!$msopPrice = $modx->getObject('msop2Price', $msopData)) { | |
$msopPrice = $modx->newObject('msop2Price'); | |
$msopPrice->fromArray($msopData); | |
$msopPrice->set('active', 1); | |
} | |
$msopPrice->set('price', $_price); // цена для опции!!! | |
$msopPrice->save(); | |
} | |
} | |
/* msop2 */ | |
if ($is_debug) { | |
$modx->log(modX::LOG_LEVEL_INFO, 'You in debug mode, so we process only 1 row. Time: '.number_format(microtime(true) - $modx->startTime, 7) . " s"); | |
exit; | |
} | |
} | |
fclose($handle); | |
if (!XPDO_CLI_MODE) {echo '<pre>';} | |
echo "\nImport complete in ".number_format(microtime(true) - $modx->startTime, 7) . " s\n"; | |
echo "\nTotal rows: $rows\n"; | |
echo "Created: $created\n"; | |
echo "Updated: $updated\n"; | |
if (!XPDO_CLI_MODE) {echo '</pre>';} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment