Last active
June 17, 2020 07:04
-
-
Save qwertik17/c9b620a0be11a4c749fa3d882995bc51 to your computer and use it in GitHub Desktop.
Добавляем и обновление товаров с сайта донора
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 | |
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); | |
} |
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 | |
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; | |
} | |
} |
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 | |
$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