Skip to content

Instantly share code, notes, and snippets.

@qwertik17
Last active June 17, 2020 07:04
Show Gist options
  • Save qwertik17/c9b620a0be11a4c749fa3d882995bc51 to your computer and use it in GitHub Desktop.
Save qwertik17/c9b620a0be11a4c749fa3d882995bc51 to your computer and use it in GitHub Desktop.
Добавляем и обновление товаров с сайта донора
<?php
define(PICTURE_UPLOAD_PATH, MODX_ASSETS_PATH . 'images/vhodnye/');
$mes = array();
$bravo = $modx->getService('bravo', 'bravo', MODX_CORE_PATH.'components/bravo/');
$data = $bravo->getImport(); //Весь каталог
$products = $bravo->getProducts($data); //Все товары с Браво
$colors = $bravo->getIdsColors($data); //Все цвета с Браво
$categories = $bravo->getCategoriesIds(); //Список категорий
$siteProducts = $bravo->getSiteProductsBravo([28]); //Все товары входных дверей с сайта
foreach($products as $k=>$product)
{
$new_product = [];
//Проверка существования товара на сайте
if ($siteProducts[$product['id']]) continue; //Товар уже есть на сайте
//Определение категории
if ($parent = $categories['vhod_dveri'][$product['category_id']])
{
$new_product['parent'] = $parent;
$new_product['template'] = 28;
} else {
continue; //Категория не найдена, к следующей итерации
}
//общие параметры
$new_product['class_key'] = 'msProduct';
$new_product['show_in_tree'] = 1;
$new_product['published'] = 1;
$new_product['hidemenu'] = 0;
$new_product['vendor'] = (in_array($product['category_id'], [306, 307])) ? 14 : 13;
$new_product['tv45'] = 'Россия';
$new_product['pagetitle'] = (in_array($product['category_id'], [306, 307])) ? "Groff " . $product['name'] . ' ' . $colors[$product['color_id']] : "Bravo " . $product['name'] . ' ' . $colors[$product['color_id']];
$new_product['uri'] = mb_strtolower($bravo->translate($new_product['pagetitle']));
$new_product['tv66'] = $product['id'];
$new_product['tv67'] = $product['code'];
//Цвет снаружи
$new_product['tv79'] = $colors[$product['color_id']];
//Контент, отделка внутри, толщина стали
$content = '';
foreach ($product['params'] as $param) {
if ($param['name'] == "Отделка внутри")
{
preg_match('/МДФ/', $param['value'], $matches);
if (count($matches)) $new_product['tv84'] = 'МДФ';
}
if ($param['name'] == "Толщина стали полотна (снаружи/внутри) (мм)")
{
preg_match('/^\d{1,2},\d{1,2}/', $param['value'], $matches);
if (count($matches)) $new_product['tv85'] = str_replace(',', '.', $matches[0]);
}
if (($param['name'] == "Толщина стали полотна (снаружи/внутри) (мм)") && $param['value'] == "/0,0")
{
continue;
}
if ($param['name'] == "открывание")
{
continue;
}
if ($param['name'] == "Петли")
{
$content .= "<tr><td>{$param['name']}</td><td>{$param['value']}</td></tr>";
foreach ($product['components'] as $component)
{
$content .= "<tr><td>{$component['name']}</td><td>{$component['value']}</td></tr>";
}
continue;
}
$content .= "<tr><td>{$param['name']}</td><td>{$param['value']}</td></tr>";
}
$new_product['content'] = '<table>' . $content . '</table>';
//Стекло
if ($product['glass'] == 1) $new_product['tv92'] = 'со стеклом';
//Размеры и цены
$sizes = [];
foreach ($product['options'] as $k=>$option)
{
if ($option['order'] == 1) continue;
$size = preg_match_all('/\d{2,3}/', $option['name'], $matches);
$size = $matches[0][1] . 0 .'x'.$matches[0][0] . 0;
foreach($sizes as $s) if ($s['size'] == $size) continue 2; //сразу убираем повторяющиеся размеры
$sizes[] = [
'MIGX_id' => $k + 1,
'size' => $size,
'discount' => $option['discount_rrc'],
'price' => ($option['discount_rrc']) ? round($option['price_rrc'] * (100 - $option['discount_rrc']) / 100) : $option['price_rrc'],
'old_price' => ($option['discount_rrc']) ? $option['price_rrc'] : 0,
];
if($k == 0)
{
if($option['discount_rrc'])
{
$new_product['price'] = round($option['price_rrc'] * (100 - $option['discount_rrc']) / 100);
$new_product['old_price'] = $option['price_rrc'];
}
else
{
$new_product['price'] = $option['price_rrc'];
}
}
}
$new_product['tv78'] = $modx->toJson($sizes);
$mes[] = 'Найден новый товар ' . $new_product['pagetitle'] . ' (' . $product['url'] . ')';
/*print_r($new_product);
print_r($product);
return;*/
$response = $modx->runProcessor('resource/create', $new_product);
if($response->isError()){
$errors = $response->response['errors'];
foreach ($errors as $err) $mes[] = 'Ошибка добавления ' . $new_product['pagetitle'] . ' (' . $product['url'] . ')' . ' ' . $err['id'] . ' (' . $err['msg'] . ')';
continue;
}
//Получаем ID товара, который создали
$newID = $response->response['object']['id'];
//Отправляем письмо, что добавился новый товар
$fenom = $modx->getService('pdoFetch');
$managerEmail = $modx->config['managerEmail'];
$managerMsg = $fenom->getChunk('tpl.newProductVhod', ['product_id' => $newID]);
$emailTo = '[email protected]';
$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_BODY,$managerMsg);
$modx->mail->set(modMail::MAIL_FROM,$modx->config['emailsender']);
$modx->mail->set(modMail::MAIL_FROM_NAME,$modx->config['emailsender']);
$modx->mail->set(modMail::MAIL_SUBJECT,'Загружен новый товар - '.$modx->config['site_name']);
$modx->mail->address('to', $emailTo);
$modx->mail->address('reply-to',$emailTo);
$modx->mail->setHTML(true);
if (!$modx->mail->send()) {
$mes[] = 'Не удалось отправить письмо о создании нового товара';
}
$this->modx->mail->reset();
//Закачиваем фотки
foreach($product['pictures'] as $k => $picture) {
$modx->cacheManager->writeFile(PICTURE_UPLOAD_PATH . $newID . '/'. ($k + 1) . '.jpg', file_get_contents($picture), 'w');
}
//Получаем содержимое папки, куда мы все залили
$imgs = glob(PICTURE_UPLOAD_PATH . $newID . '/' .'*.jpg');
$first_img_info = getimagesize($imgs[0]);
if (($first_img_info[0] / $first_img_info[1]) >= 0.55) //Если первая дверь полуторка
{
foreach ($imgs as $img)
{
$response = $modx->runProcessor('gallery/upload',
array('id' => $newID, 'name' => basename($img), 'file' => $img),
array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
);
}
continue;
}
//Загружаем фото двери в интерьере снаружи
$productObj = $modx->getObject('modResource', $newID);
$productObj->setTVvalue('photo_outside', str_replace(MODX_BASE_PATH, '', $imgs[0]));
$productObj->save();
//Загружаем фото двери в интерьере внутри
if ($imgs[1])
{
$second_img_info = getimagesize($imgs[1]);
if ($first_img_info[1] == $second_img_info[1])
{
$productObj->setTVvalue('photo_in_interier', str_replace(MODX_BASE_PATH, '', $imgs[1]));
$productObj->save();
//Объединяем 2 изображения в одно
mergeImages($imgs[0], $imgs[1], PICTURE_UPLOAD_PATH . $newID . '/'.mb_strtolower($bravo->translate($new_product['pagetitle'])).'.jpg');
$response = $modx->runProcessor('gallery/upload',
array('id' => $newID, 'name' => basename($img), 'file' => PICTURE_UPLOAD_PATH . $newID . '/'.mb_strtolower($bravo->translate($new_product['pagetitle'])).'.jpg'),
array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
);
if (count($imgs) > 2) //Если изображений больше чем 2, то загрузим их, как доп. фотки
{
foreach ($imgs as $k=>$img)
{
if ($k < 3) continue;
$response = $modx->runProcessor('gallery/upload',
array('id' => $newID, 'name' => basename($img), 'file' => $img),
array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
);
}
}
}
continue;
}
//Второго изображения нет или у них разная высота - просто заливаем фотки в галерею
foreach ($imgs as $img)
{
$response = $modx->runProcessor('gallery/upload',
array('id' => $newID, 'name' => basename($img), 'file' => $img),
array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
);
}
}
customlog($mes);
function customlog($mes, $clean=false)
{
global $modx;
if (is_array($mes)) $mes = implode(PHP_EOL, $mes);
if ($clean)
{
$mes = $mes . PHP_EOL;
} else {
$time = "[".date('Y-m-d H:i:s')."]";
$mes = 'Запуск ' . $time . PHP_EOL . $mes . PHP_EOL;
}
$modx->cacheManager->writeFile(MODX_ASSETS_PATH . 'bravo/vhod_dveri/productsCreate/' . date('Y_m').'.log', $mes, 'a');
return;
}
function mergeImages($filename_x, $filename_y, $filename_result) {
list($width_x, $height_x) = getimagesize($filename_x);
list($width_y, $height_y) = getimagesize($filename_y);
$image = imagecreatetruecolor($width_x + $width_y + 20, $height_x);
imagefill($image, 0, 0, 0xFFFFFF);
$image_x = imagecreatefromjpeg($filename_x);
$image_y = imagecreatefromjpeg($filename_y);
imagecopy($image, $image_x, 0, 0, 0, 0, $width_x, $height_x);
imagecopy($image, $image_y, $width_x + 20, 0, 0, 0, $width_y, $height_y);
imagejpeg($image, $filename_result);
imagedestroy($image);
imagedestroy($image_x);
imagedestroy($image_y);
}
<?php
class bravo
{
public $importUrl = 'https://dveri.com/export/v2/?format=json&city=msk';
/**
* @param modX $modx
* @param array $config
*/
function __construct(modX &$modx, array $config = array())
{
$this->modx =& $modx;
}
/**
* Получаем полный массив с данными
* return array()
**/
public function getImport()
{
$curlSession = curl_init();
curl_setopt($curlSession, CURLOPT_URL, $this->importUrl);
curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);
$data = $this->modx->fromJson(curl_exec($curlSession));
curl_close($curlSession);
return $data;
}
/**
* Получаем только товары (отфильтрованные)
* var $indexes - ключи массива являются id товаров
* return array()
**/
public function getProducts($data, $indexes = false)
{
if ($data === null) return;
$products = $data['catalog']['products'];
foreach($products as $k => $product)
{
if ($product['sale'] !== "0" || $product['action'] !== "0" || $product['order'] !== "0" || $product['soon'] !== "0")
unset($products[$k]);
}
if (!$indexes)
{
return array_values($products);
} else {
$output = [];
foreach ($products as $product)
{
$output[$product['id']] = $product;
}
return $output;
}
}
/**
* Получаем только группы комплектов
* return array()
**/
public function getComplectGroups($data)
{
if ($data === null) return;
return $data['catalog']['accessories_groups'];
}
/**
* Получаем только элементы комплекта
* return array()
**/
public function getComplect($data)
{
if ($data === null) return;
return $data['catalog']['accessories'];
}
/**
* Получаем массив с комплектами
* return array()
**/
public function getComplectNameWithBravoId()
{
$docid = 91;
$tv_id = 36;
$res = $this->modx->getObject('modTemplateVarResource', ['tmplvarid'=>$tv_id,'contentid'=>$docid]);
$value = $this->modx->fromJson($res->get('value'));
$output = [];
foreach ($value as $item)
{
if ($item['bravo_id'])
{
$output[$item['bravo_id']] = $item['MIGX_id'];
}
}
return $output;
}
/**
* Получаем migx стекол
* return array()
**/
public function getGlassesBase()
{
$docid = 77;
$tv_id = 23;
$res = $this->modx->getObject('modTemplateVarResource', ['tmplvarid'=>$tv_id,'contentid'=>$docid]);
return $this->modx->fromJson($res->get('value'));
}
/**
* Записываем migx стекол
* return boolean
**/
public function setGlassesBase($migx)
{
$docid = 77;
$tv_id = 23;
$res = $this->modx->getObject('modTemplateVarResource', ['tmplvarid'=>$tv_id,'contentid'=>$docid]);
$res->set('value', $migx);
$result = $res->save();
return $result;
}
/**
* Получаем структурированный массив с комплеками и их содержимым
* return array()
**/
public function getComplectsBuilding($data=null)
{
if ($data === null) return;
$complectGroups = $this->getComplectGroups($data);
$complect = $this->getComplect($data);
$groups_ids = $this->getGroupIds();
$result = [];
$i = 0;
foreach ($complectGroups as $group)
{
$groups = [];
//$result[$i]['MIGX_id'] = $i + 1;
$result[$i]['bravo_id'] = $group['id'];
$result[$i]['title'] = $group['name'];
$ii = 1;
foreach($complect as $item)
{
if ($group['id'] == $item['group_id'])
{
if (strpos($item['name'],'Добор') !== false) $element_group = 'Доборы';
if (strpos($item['name'],'Карниз') !== false) $element_group = 'Капитель';
if (strpos($item['name'],'Притворная планка') !== false) $element_group = 'Притворная планка';
if (strpos($item['name'],'Декоративная накладка') !== false) $element_group = 'Розетка';
if (strpos($item['name'],'Цоколь') !== false) $element_group = 'Цоколь';
if (strpos($item['name'],'Соединительный элемент') !== false) $element_group = 'Соединительный элемент';
if (strpos($item['name'],'Шпонка') !== false) $element_group = 'Шпонка';
if (strpos($item['name'],'Розетка') !== false) $element_group = 'Розетка';
if (strpos($item['name'],'Комплект капителей') !== false) $element_group = 'Капитель';
if (strpos($item['name'],'Опорный элемент') !== false) $element_group = 'Опорный элемент';
if (strpos($item['name'],'Клей') !== false) $element_group = 'Клей';
if (strpos($item['name'],'Притворная планка') !== false) $element_group = 'Притворная планка';
if (strpos($item['name'],'Перекладина') !== false) $element_group = 'Перекладина';
if (strpos($item['name'],'Комплект стоек') !== false) $element_group = 'Стойка';
if (strpos($item['name'],'Стойка') !== false) $element_group = 'Стойка';
if (strpos($item['name'],'Панель') !== false) $element_group = 'Панель';
if (strpos($item['name'],'Клипса') !== false) $element_group = 'Клипса';
$count = 1;
if (strpos($item['name'],'Коробка') !== false)
{
$element_group = 'Коробка';
$count = 3;
}
if (strpos($item['name'],'Наличник') !== false)
{
$element_group = 'Наличники';
$count = 5;
}
if (($element_key = array_search($element_group, $groups)) === false)
{
$groups[] = $element_group;
$element_key = array_search($element_group, $groups);
$groups[$element_group]['count'] = 0;
} else {
$groups[$element_group]['count'] = $groups[$element_group]['count'] + 1;
}
$result[$i]['groups'][$element_key]['MIGX_id'] = $ii;
$result[$i]['groups'][$element_key]['name'] = 'set_group';
$result[$i]['groups'][$element_key]['group'] = $groups_ids[$element_group];
$result[$i]['groups'][$element_key]['elements_list'][$groups[$element_group]['count']]['MIGX_id'] = $groups[$element_group]['count'] + 1;
$result[$i]['groups'][$element_key]['elements_list'][$groups[$element_group]['count']]['name'] = 'set_option';
$result[$i]['groups'][$element_key]['elements_list'][$groups[$element_group]['count']]['element'] = $item['name'];
$result[$i]['groups'][$element_key]['elements_list'][$groups[$element_group]['count']]['count'] = $count;
$result[$i]['groups'][$element_key]['elements_list'][$groups[$element_group]['count']]['defaultElement'] = $item['main'];
if ($item['discount_rrc'] > 0 )
{
$result[$i]['groups'][$element_key]['elements_list'][$groups[$element_group]['count']]['price'] = round($item['price_rrc'] / 100 * (100 - $item['discount_rrc'])); //вычитаем скидку
} else {
$result[$i]['groups'][$element_key]['elements_list'][$groups[$element_group]['count']]['price'] = $item['price_rrc'];
}
}
$ii++;
}
unset($groups);
$i++;
}
return $result;
}
/**
* Получение id групп
* return array()
**/
public function getGroupIds()
{
$docid = 91;
$tv_id = 52;
$res = $this->modx->getObject('modTemplateVarResource', ['tmplvarid'=>$tv_id,'contentid'=>$docid]);
$value = $this->modx->fromJson($res->get('value'));
$output = [];
foreach ($value as $item) {
$output[$item['title']] = $item['MIGX_id'];
}
return $output;
}
/**
* Записать комплекты в тв
* return array()
**/
public function setComplects($migx)
{
$docid = 91;
$tv_id = 36;
$res = $this->modx->getObject('modTemplateVarResource', ['tmplvarid'=>$tv_id,'contentid'=>$docid]);
$res->set('value', $migx);
if ($res->save())
{
return true;
}
return false;
}
/**
* Получаем массив имеющихся комплектов
* return array()
**/
public function getCurrentComplects()
{
$res = $this->modx->getObject('modTemplateVarResource', ['tmplvarid'=>36,'contentid'=>91]);
$arr = $this->modx->fromJson($res->get('value'));
$i = 0;
foreach ($arr as $v) {
$arr[$i]['groups'] = $this->modx->fromJson($v['groups']);
$j = 0;
foreach($arr[$i]['groups'] as $vv)
{
$arr[$i]['groups'][$j]['elements_list'] = $this->modx->fromJson($vv['elements_list']);
$j++;
}
$i++;
}
return $arr;
}
/**
* Получаем массив имеющихся стекол
* return array()
**/
public function getGlassImageByName()
{
$res = $this->modx->getObject('modTemplateVarResource', ['tmplvarid'=>23,'contentid'=>77]);
$arr = $this->modx->fromJson($res->get('value'));
return $arr;
}
/**
* Обратная функция getCurrentComplects
* return string
**/
public function reverceConvertComplects($array)
{
$output = [];
foreach ($array as $k=>$v)
{
$output[$k]['MIGX_id'] = $v['MIGX_id'];
$output[$k]['title'] = $v['title'];
$output[$k]['bravo_id'] = $v['bravo_id'];
$groups = [];
foreach($v['groups'] as $k_groups=>$v_groups)
{
$groups[$k_groups]['MIGX_id'] = $v_groups['MIGX_id'];
$groups[$k_groups]['name'] = $v_groups['name'];
$groups[$k_groups]['group'] = $v_groups['group'];
$groups[$k_groups]['elements_list'] = $this->modx->toJson($v_groups['elements_list']);
//$groups[$k_groups]['renderGroup_ro'] = $v_groups['renderGroup_ro'];
//$groups[$k_groups]['_this.value'] = $v_groups['_this.value'];
//$groups[$k_groups]['renderGroup'] = $v_groups['renderGroup'];
//$groups[$k_groups]['renderElements_ro'] = $v_groups['renderElements_ro'];
//$groups[$k_groups]['renderElements'] = $v_groups['renderElements'];
}
$output[$k]['groups'] = $this->modx->toJson($groups);
}
return $this->modx->toJson($output);
}
/**
* Возвращает массив с сопоставлением категорий
* return array()
**/
public function getCategoriesIds()
{
return [
//id с донора => id на сайте
'doors' => [
//Натуральный шпон
402 => 11346 //Wood Classic
,442 => 11347 //Wood Modern
,420 => 11348 //Wood Flat
,293 => 11349 //Elit
//Шпоном файн-лайн
,7 => 11351 //Серия Standard
,409 => 11352 //Серия Graffiti
,404 => 11353 //Серия Skinny
,9 => 11354 //Серия Euro | на доноре таких товаров нет
,295 => 11401 //Серия Comfort | на доноре таких товаров нет
//Евро Шпон
,405 => 11356 //Серия Classico | на доноре таких товаров нет
,407 => 11357 //Серия Legno
//Эко Шпон
,193 => 11359 //Серия Porta X
,246 => 11360 //Серия Porta Z
,464 => 11402 //Серия Porta C
,332 => 11361 //Серия Classico S
,468 => 11362 //Серия Classico M
,389 => 11363 //Серия Тренд
,394 => 11364 //Серия Legno
,12 => 11365 //Серия Vetro
,395 => 11366 //Серия Simple
,191 => 11367 //Серия Soft
,465 => 11368 //Серия Block
,296 => 11403 //Серия Aqua Dveri
//Из массива
,65 => 11370 //с отделкой
,91 => 11371 //без отделкой
,64 => 11404 //RIF-массив
//С отделкой 3D-Graf
,423 => 11373 //Серия Sweet
,248 => 11374 //Серия Porta X
,250 => 11375 //Серия Trend
,289 => 11376 //Серия Glace
,403 => 11377 //Серия Simple
,288 => 11378 //Серия Master
//С отделкой Эмалью
,422 => 11380 //Серия Skinny
,145 => 11381 //Серия Fix
//С отделкой Эмалитом
,159 => 11407 //Серия Legno | на доноре таких товаров нет
//С отделкой пвх
,290 => 11383 //Серия Skinny
,397 => 11384 //Серия Status | на доноре таких товаров нет
,93 => 11385 //Серия Start
,398 => 11386 //Серия Graffiti
//Ламинированные
,19 => 11388 //Серия 10
,20 => 11405 //Серия 30
,151 => 11389 //Серия ГОСТ
//Стеклянные
,298 => 11391 //Серия Bravo Glass
,299 => 11392 //Серия Sauna
//Раздвижные
,243 => 11394 //Серия Twiggy
//Складные
,234 => 11396 //Серия Porta X
,241 => 11397 //Серия Twiggy
,200 => 11398 //Ламинированные
,270 => 11399 //С отделкой ПВХ (гармошка)
],
'furnitura' => [
313 => 47 //Фурнитура для раздвижных дверей
,314 => 11313 //Фурнитура для складных дверей | Без врезки
,349 => 11333 //Фурнитура для межкомнатных дверей | Петли | Без врезки
,333 => 11320 //Ручки - Ручки Bravo | Защелки
,399 => 11321 //Ручки - Ручки Bravo | Серия 100
,334 => 11322 //Ручки - Ручки Bravo | Серия 200
,335 => 11323 //Ручки - Ручки Bravo | Серия 300
,336 => 11324 //Ручки - Ручки Bravo | Серия 400
,337 => 11325 //Ручки - Ручки Bravo | Серия 600
,338 => 11326 //Ручки - Ручки Bravo | Серия 900
,355 => 11327 //Замки / Замки и защелки Bravo / Цилиндровые замки
,356 => 11328 //Замки / Замки и защелки Bravo / Магнитные защелки
,357 => 11329 //Замки / Замки и защелки Bravo / Защелки с пластиковым язычком
,358 => 11330 //Замки / Замки и защелки Bravo / Магнитные защелки
,327 => 11308 //Фурнитура - Доводчики
,328 => 11309 //Фурнитура - Ограничители
,329 => 11310 //Фурнитура - Цифры
,330 => 11311 //Фурнитура - Другое
,401 => 12478 //Фиксаторы Bravo / Серия 100
,344 => 12461 //Фиксаторы Bravo / Серия 200
,346 => 12464 //Фиксаторы Bravo / Серия 400
,347 => 12218 //Фиксаторы Bravo / Серия 600
,348 => 12473 //Фиксаторы Bravo / Серия 900
,354 => 11332 //Цилиндры Bravo / Для замков ключ/фиксатор
,353 => 11331 //Цилиндры Bravo / Для замков ключ/ключ
,400 => 11314 //Накладки Bravo / Серия 100
,339 => 11315 //Накладки Bravo / Серия 200
,340 => 11316 //Накладки Bravo / Серия 300
,341 => 11317 //Накладки Bravo / Серия 400
,342 => 11318 //Накладки Bravo / Серия 600
,343 => 11319 //Накладки Bravo / Серия 900
,350 => 11334 //Петли - Петли Bravo | Врезные
,351 => 11335 //Петли - Петли Bravo | Пружинные
,352 => 11336 //Петли - Петли Bravo | Скрытые
,326 => 11307 //Финская
,359 => 11337 //Фурнитура для стеклянных дверей / Дверные ручки
,360 => 11338 //Фурнитура для стеклянных дверей / Замки и защелки
,361 => 11339 //Фурнитура для стеклянных дверей / Цилиндры
,362 => 11340 //Фурнитура для стеклянных дверей / Петли
,438 => 11341 //Фурнитура для стеклянных дверей / Комплекты фурнитуры
,363 => 11342 //Фурнитура для стеклянных дверей / Комплектующие для распашной двери
,364 => 11343 //Фурнитура для стеклянных дверей / Комплектующие для раздвижной двери
],
'vhod_dveri' => [
308 => 13043, //Optim D
309 => 13044, //Optim P
421 => 13045, //Thermo
469 => 13046, //Porta S
473 => 13047, //Porta М
307 => 13050, //Groff Т
306 => 13051, //Groff Р
310 => 13048, //Russian Style
311 => 13049, //China Style
]
];
}
/**
* Получение id цветов
* return array()
**/
public function getIdsColors($data)
{
if ($data === null) return;
$output = [];
$colors = $data['catalog']['colors'];
foreach($colors as $color)
{
$output[$color['id']] = $color['title'];
}
return $output;
}
/**
* Получаем только цвета
* return array()
**/
public function getColors($data)
{
if ($data === null) return;
return $data['catalog']['colors'];
}
/**
* Загружаем изображения
* return array
**/
public function downloadImages($data = null, $path = null)
{
if ($data === null || $path === null) return;
$new_images = [];
$count_not_uploaded = 0;
foreach ($data as $k=>$item)
{
if ($image = file_get_contents(trim($item['picture'])))
{
$uploadfile = MODX_ASSETS_PATH . $path . $this->translate($item['title']) . '.' . end(explode(".", $item['picture']));
if (file_exists($uploadfile)) {
continue;
} else {
$new_images[$k]['title'] = $item['title'];
$new_images[$k]['picture'] = basename($uploadfile);
if (copy($item['picture'], $uploadfile)) {
$new_images[$k]['uploaded'] = 'Загружен';
} else {
$new_images[$k]['uploaded'] = '!!!Не загружен!!!';
$count_not_uploaded++;
}
}
}
}
return [
'new' => $new_images,
'count_not_uploaded' => $count_not_uploaded,
];
}
/**
* Транслитерация для названий изображений
* return string
**/
public function translate($string)
{
$ret = $string;
$filePath = MODX_CORE_PATH . 'components/translit/model/modx/translit/tables/russian.php';
if (is_file($filePath)) {
$table = include $filePath;
if (is_array($table) && !empty($table)) {
$ret = strtr($string, $table);
}
}
return $ret;
}
/**
* Получаем id всех товаров BRAVO на сайте
* $templates - массив с id шаблонов товаров на сайте
* $first_from_site - если true, то отдавать id ресурса как ключ
* return array
**/
public function getSiteProductsBravo($templates = [12,23], $first_from_site = false)
{
if (!$this->modx->loadClass('pdofetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) return false;
$pdoFetch = new pdoFetch($this->modx);
$pdoFetch->setConfig([
'where' => [
'TV.value IS NOT NULL',
'template:IN' => $templates
],
'class' => 'msProduct',
'leftJoin' => [
'TV' => [
'class' => 'modTemplateVarResource',
'on' => 'TV.contentid = msProduct.id AND TV.tmplvarid = 66',
]
],
'select' => [
'TV' => $this->modx->getSelectColumns('modTemplateVarResource', 'TV', '', ['contentid','value']),
],
'sortby' => [
'msProduct.editedon' => 'ASC'
],
'decodeJSON' => true,
'limit' => 0,
'return' => 'data',
]);
$site_products_temp = $pdoFetch->run();
$site_products = [];
if (count($site_products_temp))
{
foreach ($site_products_temp as $site_product)
{
($first_from_site)
? $site_products[$site_product['contentid']] = $site_product['value']
: $site_products[$site_product['value']] = $site_product['contentid'];
}
}
return $site_products;
}
/**
* Получаем id всех товаров BRAVO на сайте c шаблонами
* return array
**/
public function getSiteProductsBravoByUpdate()
{
if (!$this->modx->loadClass('pdofetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) return false;
$pdoFetch = new pdoFetch($this->modx);
$pdoFetch->setConfig([
'where' => [
'TV.value IS NOT NULL'
],
'class' => 'msProduct',
'leftJoin' => [
'TV' => [
'class' => 'modTemplateVarResource',
'on' => 'TV.contentid = msProduct.id AND TV.tmplvarid = 66',
]
],
'select' => [
'msProduct' => $this->modx->getSelectColumns('msProduct', 'msProduct', '', ['template', 'alias', 'pagetitle', 'published']),
'TV' => $this->modx->getSelectColumns('modTemplateVarResource', 'TV', '', ['contentid','value']),
],
'sortby' => [
'msProduct.editedon' => 'ASC'
],
'decodeJSON' => true,
'limit' => 0,
'return' => 'data',
]);
$site_products_temp = $pdoFetch->run();
$site_products = [];
foreach ($site_products_temp as $site_product)
{
$site_products[$site_product['value']]['update_id'] = $site_product['contentid'];
$site_products[$site_product['value']]['template'] = $site_product['template'];
$site_products[$site_product['value']]['alias'] = $site_product['alias'];
$site_products[$site_product['value']]['pagetitle'] = $site_product['pagetitle'];
$site_products[$site_product['value']]['published'] = $site_product['published'];
}
return $site_products;
}
}
<?php
$mes = [];
$bravo = $modx->getService('bravo', 'bravo', MODX_CORE_PATH.'components/bravo/');
$data = $bravo->getImport();
$products = $bravo->getProducts($data, true);
$colors = $bravo->getIdsColors($data);
$siteProducts = $bravo->getSiteProductsBravo([28]);
if (!count($products)) return;
$i = 0;
foreach ($siteProducts as $s_k => $siteProduct)
{
if (!isset($products[$s_k])) continue;
$product = $products[$s_k];
$resource_for_update = $modx->getObject('msProduct', $siteProduct);
($product['hit'] == "0")
? $resource_for_update->set('favorite', 0)
: $resource_for_update->set('favorite', 1);
($product['new'] == "0")
? $resource_for_update->set('new', 0)
: $resource_for_update->set('new', 1);
//Цвет снаружи
/*($colors[$product['color_id']])
? $resource_for_update->setTVvalue('color_outside', $colors[$product['color_id']])
: '';*/
//Стекло
($product['glass'] == 1)
? $resource_for_update->setTVvalue('product_features', 'со стеклом')
: $resource_for_update->setTVvalue('product_features', '');
//Контент, отделка внутри, толщина стали
$content = '';
foreach ($product['params'] as $param) {
if ($param['name'] == "Отделка внутри")
{
preg_match('/МДФ/', $param['value'], $matches);
(count($matches)) ? $resource_for_update->setTVvalue('product_inside', 'МДФ') : '';
}
if ($param['name'] == "Толщина стали полотна (снаружи/внутри) (мм)")
{
preg_match('/^\d{1,2},\d{1,2}/', $param['value'], $matches);
(count($matches)) ? $resource_for_update->setTVvalue('product_steel', str_replace(',', '.', $matches[0])) : '';
}
if (($param['name'] == "Толщина стали полотна (снаружи/внутри) (мм)") && $param['value'] == "/0,0")
{
continue;
}
if ($param['name'] == "Открывание")
{
continue;
}
if ($param['name'] == "Петли")
{
$content .= "<tr><td>{$param['name']}</td><td>{$param['value']}</td></tr>";
foreach ($product['components'] as $component)
{
$content .= "<tr><td>{$component['name']}</td><td>{$component['value']}</td></tr>";
}
continue;
}
$content .= "<tr><td>{$param['name']}</td><td>{$param['value']}</td></tr>";
}
$content ? $resource_for_update->set('content', '<table>' . $content . '</table>') : '';
//Размеры и цены
$sizes = [];
foreach ($product['options'] as $k=>$option)
{
if ($option['order'] == 1) continue;
$size = preg_match_all('/\d{2,3}/', $option['name'], $matches);
$size = $matches[0][1] . 0 .'x'.$matches[0][0] . 0;
foreach($sizes as $s) if ($s['size'] == $size) continue 2; //сразу убираем повторяющиеся размеры
$sizes[] = [
'MIGX_id' => $k + 1,
'size' => $size,
'discount' => $option['discount_rrc'],
'price' => ($option['discount_rrc']) ? round($option['price_rrc'] * (100 - $option['discount_rrc']) / 100) : $option['price_rrc'],
'old_price' => ($option['discount_rrc']) ? $option['price_rrc'] : 0,
];
if($k == 0)
{
if($option['discount_rrc'])
{
$resource_for_update->set('price', round($option['price_rrc'] * (100 - $option['discount_rrc']) / 100));
$resource_for_update->set('old_price', $option['price_rrc']);
}
else
{
$resource_for_update->set('price', $option['price_rrc']);
}
}
}
($modx->toJson($sizes)) ? $resource_for_update->setTVvalue('vhod_sizes', $modx->toJson($sizes)) : '';
$resource_for_update->set('editedon', date("Y-m-d H:i:s"));
$resource_for_update->set('published', 1);
if (!$resource_for_update->save())
{
$mes[] = 'Ошибка обновления товара';
}
unset($siteProducts[$s_k]);
$i++;
//if ($i == 1) break;
}
$mes[] = $i . ' товаров успешно обновлено';
if ($count = count($siteProducts))
{
foreach($siteProducts as $siteProduct)
{
$resource_for_update = $modx->getObject('msProduct', $siteProduct);
$resource_for_update->set('published', 0);
$resource_for_update->save();
}
$mes[] = $count . ' товаров сняты с публикации';
}
customlog($mes);
function customlog($mes, $clean=false)
{
global $modx;
if (is_array($mes)) $mes = implode(PHP_EOL, $mes);
if ($clean)
{
$mes = $mes . PHP_EOL;
} else {
$time = "[".date('Y-m-d H:i:s')."]";
$mes = 'Запуск ' . $time . PHP_EOL . $mes . PHP_EOL;
}
$modx->cacheManager->writeFile(MODX_ASSETS_PATH . 'bravo/vhod_dveri/productsUpdate/' . date('Y_m').'.log', $mes, 'a');
return;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment