Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

[Поддержка] Интеграция с МойСклад


Recommended Posts

Интеграция с МойСклад


Интеграция с МойСклад


Модуль синхронизации товаров из сервиса МойСклад в OpenCart 2.3

 

Доступный функционал:

- Синхронизация категорий

- Синхронизация остатков

- Синхронизация заказов

- Синхронизация модификаций

- Синхронизации статусов заказа из OpenCart в МойСклад (при условии создании в МойСклад таких же статусов как и в OpenCart)

- Приветственное СМС при регистрации в магазине (SMSInt)

- Отправка СМС сообщения пользователям, у которых не было покупок в течении 30 дней

 

Чтобы СМС сообщения работали надо аккаунт на сервисе SMSInt

 

 

Пожелания по улучшению пишите в теме поддержке.


  • Автор
  • долучення
    25.05.18
  • Категорія
  • Системные требования
  • Метод активации
    Без активации
  • Ioncube Loader
    Нет
  • ocStore
    2.3
  • OpenCart.Pro, ocShop
  • Звернення до сервера розробника

 

Надіслати
Поділитися на інших сайтах

  • 3 months later...
  • 4 weeks later...
  • 4 weeks later...
  • 1 month later...
  • 1 month later...

Добрый день, подскажите,

1) авто обновление товаров не работает прописали, как сказано в документации.. и крон ежедневно, выполняет операции

2) После обновления в ручную у товаров не происходит замена наименование старые товары остались с тем же наименованием что и было загружено ранее а новые позиции наименованы правильно 

 

image.png

Надіслати
Поділитися на інших сайтах


  • 5 weeks later...

Для работы модуля сначала нужно удалить лицензию admin\controller\extension\module\ms.php

 

<?php  
class ControllerExtensionModuleMS extends Controller {
	private $error = array();

	public function index() {
		$this->load->language('extension/module/ms'); //подключаем любой языковой файл

		 $request_data = [
		 	'host' => $_SERVER['HTTP_HOST'],
		 	'secret' => 'zerrnoco'
		 ];

		 if (true) {

			$this->document->addScript('view/javascript/ms/ms.js');
			$this->document->addStyle('view/stylesheet/ms/ms.css');

			$this->document->setTitle($this->language->get('heading_title'));

			// регистрируем модуль
			$this->load->model('setting/setting');

			if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
			    $this->model_setting_setting->editSetting('ms', $this->request->post);
			    $this->session->data['success'] = $this->language->get('text_success');
			    $data['success'] = $this->session->data['success'] ;

			    //создаем таблицы в БД
				$this->load->model('extension/module/ms');    		
	    		$this->model_extension_module_ms->createTable();

			    $this->response->redirect($this->url->link('extension/module/ms', 'token=' . $this->session->data['token'] . '&type=module', true));
			}

			if (!empty($this->config->get('ms_name')) && !empty($this->config->get('ms_password'))) {

				$sklad = new Sklad ($this->config->get('ms_name'), $this->config->get('ms_password'));

				$ms_organizations = $sklad->getOrganizations();


				if (isset($ms_organizations['errors'])) {
					foreach ($ms_organizations['errors'] as $error) {
						$data['errors'][] = $error['error'];
					}
				} else {
					foreach ($ms_organizations['rows'] as $row) {
						$data['organizations'][] = [
							'id' => $row['id'],
							'name' => $row['name'],
						];
					}
				}
			}

			$data['ms_name'] = $this->config->get('ms_name');
			$data['ms_pasword'] = $this->config->get('ms_password');

			$data['heading_title'] = $this->language->get('heading_title'); //объявляем переменную heading_title с данными из языкового файла

			$data['entry_status'] = $this->language->get('entry_status'); 
			$data['entry_name'] = $this->language->get('entry_name'); 
			$data['entry_password'] = $this->language->get('entry_password'); 
			$data['entry_organization'] = $this->language->get('entry_organization'); 
			$data['entry_category'] = $this->language->get('entry_category'); 
			$data['entry_stock'] = $this->language->get('entry_stock'); 
			$data['entry_sms'] = $this->language->get('entry_sms'); 
			$data['entry_order'] = $this->language->get('entry_order'); 
			$data['entry_opt'] = $this->language->get('entry_opt'); 
			$data['entry_sms_template'] = $this->language->get('entry_sms_template'); 
			$data['entry_name_sms'] = $this->language->get('entry_name_sms'); 
			$data['entry_password_sms'] = $this->language->get('entry_password_sms'); 
			$data['entry_values'] = $this->language->get('entry_values'); 
			$data['help_ms_sms'] = $this->language->get('help_ms_sms'); 
			$data['help_sms_tpl'] = $this->language->get('help_sms_tpl'); 
			$data['help_sms_tpl_30'] = $this->language->get('help_sms_tpl_30'); 

			$data['button_save'] = $this->language->get('button_save');
			$data['button_cancel'] = $this->language->get('button_cancel');
			$data['text_enabled'] = $this->language->get('text_enabled'); 
			$data['text_disabled'] = $this->language->get('text_disabled'); 
			$data['text_edit'] = $this->language->get('text_edit'); 
			$data['text_sync'] = $this->language->get('text_sync'); 
			$data['text_yes'] = $this->language->get('text_yes'); 
			$data['text_no'] = $this->language->get('text_no');  

			$data['token'] = $this->session->data['token'];
			$data['loader'] = HTTPS_SERVER . 'view/image/ms/loader.gif';

			if (isset($this->error['warning'])) {
			 $data['error_warning'] = $this->error['warning'];
			} else {
			 $data['error_warning'] = '';
			}

			$data['breadcrumbs'] = array();
			 // Добавляем по одной крошке, сначала ссылка на главную страницу
			 $data['breadcrumbs'][] = array(
			  'text' => $this->language->get('text_home'), // text_home по всей видимости доступен отовсюду
			  'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL')
			  );
			// добавляем ссылку на список с модулями, прописано в своем языковом файле
			 $data['breadcrumbs'][] = array(
			  'text' => $this->language->get('text_module'),
			  'href' => $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')
			);

			// кнопки		
			$data['action'] = $this->url->link('extension/module/ms', 'token=' . $this->session->data['token'], 'SSL');
			$data['cancel'] = $this->url->link('extension/extension', 'token=' . $this->session->data['token'], 'SSL');
			
			if (!empty($this->config->get('ms_name')) && !empty($this->config->get('ms_password'))) {
				$data['sync'] = $this->url->link('extension/module/ms/sync', 'token=' . $this->session->data['token'], 'SSL');
			} else {
				$data['sync'] ='';
			}

			if (isset($this->request->post['ms_status'])) {//статус модуля
			 $data['ms_status'] = $this->request->post['ms_status'];
			} else {
			 $data['ms_status'] = $this->config->get('ms_status');
			}

			if ($data['ms_status'] != 1) {//если модуль отключен удалить все данные из него
				$this->model_setting_setting->deleteSetting('ms');
			}

			if (isset($this->request->post['ms_name'])) {
			 $data['ms_name'] = $this->request->post['ms_name'];
			} else {
			 $data['ms_name'] = $this->config->get('ms_name');
			}

			if (isset($this->request->post['ms_password'])) {
			 $data['ms_password'] = $this->request->post['ms_password'];
			} else {
			 $data['ms_password'] = $this->config->get('ms_password');
			}

			if (isset($this->request->post['ms_category'])) {
			 $data['ms_category'] = $this->request->post['ms_category'];
			} else {
			 $data['ms_category'] = $this->config->get('ms_category');
			}

			if (isset($this->request->post['ms_stock'])) {
			 $data['ms_stock'] = $this->request->post['ms_stock'];
			} else {
			 $data['ms_stock'] = $this->config->get('ms_stock');
			}

			if (isset($this->request->post['ms_org'])) {
			 $data['ms_org'] = $this->request->post['ms_org'];
			} else {
			 $data['ms_org'] = $this->config->get('ms_org');
			}

			if (isset($this->request->post['ms_sms'])) {
			 $data['ms_sms'] = $this->request->post['ms_sms'];
			} else {
			 $data['ms_sms'] = $this->config->get('ms_sms');
			}

			if (isset($this->request->post['ms_order'])) {
			 $data['ms_order'] = $this->request->post['ms_order'];
			} else {
			 $data['ms_order'] = $this->config->get('ms_order');
			}

			if (isset($this->request->post['ms_opt'])) {
			 $data['ms_opt'] = $this->request->post['ms_opt'];
			} else {
			 $data['ms_opt'] = $this->config->get('ms_opt');
			}

			if (isset($this->request->post['ms_sms_tpl'])) {
			 $data['ms_sms_tpl'] = $this->request->post['ms_sms_tpl'];
			} else {
			 $data['ms_sms_tpl'] = $this->config->get('ms_sms_tpl');
			}

			if (isset($this->request->post['ms_sms_login'])) {
			 $data['ms_sms_login'] = $this->request->post['ms_sms_login'];
			} else {
			 $data['ms_sms_login'] = $this->config->get('ms_sms_login');
			}

			if (isset($this->request->post['ms_sms_password'])) {
			 $data['ms_sms_password'] = $this->request->post['ms_sms_password'];
			} else {
			 $data['ms_sms_password'] = $this->config->get('ms_sms_password');
			}

			if (isset($this->request->post['ms_sms_tpl_30'])) {
			 $data['ms_sms_tpl_30'] = $this->request->post['ms_sms_tpl_30'];
			} else {
			 $data['ms_sms_tpl_30'] = $this->config->get('ms_sms_tpl_30');
			}


			$data['header'] = $this->load->controller('common/header');
			$data['column_left'] = $this->load->controller('common/column_left');
			$data['footer'] = $this->load->controller('common/footer');

			// передаем данные на отрисовку
			$this->response->setOutput($this->load->view('extension/module/ms.tpl', $data));
		 } else {
		 	// $this->response->setOutput($this->load->view('extension/extension', $data));
//		 	$this->session->data['license_error'] = $this->language->get('license_error');
//		     $data['license_error'] = $this->session->data['license_error'];
		    
		 	$this->response->redirect($this->url->link('extension/extension', '&token=' . $this->session->data['token'], 'SSL'));
		 }
	}

	protected function validate() {
		if (!$this->user->hasPermission('modify', 'extension/module/ms')) {
			$this->error['warning'] = $this->language->get('error_permission');
		}

		return !$this->error;
	}

//	protected function license($request_data) {
//		$url = 'http://www.api.zerrno.com/?apiLicense.validateLicense={"host":"'.$request_data['host'].'","secret":"'.$request_data['secret'].'"}';
//		$process = curl_init($url);
//		curl_setopt($process, CURLOPT_HEADER, false);
//		curl_setopt($process, CURLOPT_TIMEOUT, 30);
//		curl_setopt($process, CURLOPT_RETURNTRANSFER, true);
//		$return = curl_exec($process) or die(curl_error($process));
//		$return = (array)(json_decode($return));
//
//		curl_close($process);
//
//		return $return['response']->license;
//	}


	public function sync() {
		$this->load->language('extension/module/ms');
		set_time_limit(900);

		$request_data = [
			'host' => $_SERVER['HTTP_HOST']
		];

		if (true) {
			$this->load->model('extension/module/ms');
			$this->load->model('catalog/category');
			$this->load->model('catalog/product');
			$this->load->model('catalog/option');

			$json = [];

			if (!empty($this->config->get('ms_name')) && !empty($this->config->get('ms_password'))) {
				$login = $this->config->get('ms_name');
				$password = $this->config->get('ms_password');
			} else {
				return false;
			}

			$sklad = new Sklad($login, $password);
			
			$products = $sklad->getAllProducts();
			$sklad->response = [];

			$stocks = $sklad->getAllStocks();//остаток
			$sklad->response = [];

			$ms_product_ids = $this->model_extension_module_ms->getMSProductIds();
			$ms_category_ids = $this->model_extension_module_ms->getMSCategoryIds();
			
			foreach ($products as $product) {
				if (isset($ms_product_ids) && !empty($ms_product_ids)) {
					for ($i = 0; $i < count((array)$ms_product_ids); $i++) {//находим id товаров которые нужно удалить из опенкарт
						if ($ms_product_ids[$i]['ms_product_id'] == $product['id']) {
							unset($ms_product_ids[$i]);
							sort($ms_product_ids);
						}
					}
				}

				$product_oc = $this->model_catalog_product->getProduct($this->model_extension_module_ms->getProductIdByMSId($product['id']));

				if (!empty($product_oc)) {// если продукт уже существует в опенкарт, нужно обновить его

					if (isset($product['name'])) {
						$name = $product['name'];
					} else {
						$name = '';
					}

					// $name = $product['name'] ?? '';

					if (isset($product['code'])) {
						$model = $product['code'];
					} else {
						$model = '';	
					}

					// $model = $product['code'] ?? '';

					if (isset($product['description'])) {
						$description = $product['description'];
					} else {
						$description = '';	
					}

					// $description = $product['description'] ?? '';

					if (isset($product['article'])) {
						$sku = $product['article'];
					} else {
						$sku = '';
					}

					// $sku = $product['article'] ?? '';

					if (isset($product['image'])) { 
						$image = $sklad->getProductImage($product['image']['meta']['href']);
					} else {
						$image = '';
					}

					// $image = isset($product['image']) ? $sklad->getProductImage($product['image']['meta']['href']) : ''; 

					// if (isset($product['attributes'])) {
					// 	foreach ($product['attributes'] as $field) {
					// 		switch ($field['name']) {
					// 			case 'SEO URL':
					// 				$keyword = $field['value'];
					// 				break;

					// 			case 'Мета-тег Description':
					// 				$meta_desc = $field['value'];
					// 				break;
								
					// 			default:
					// 				$value = '';
					// 				break;
					// 		}
					// 	}
					// }

					if (isset($product['salePrices'])) {
						foreach ($product['salePrices'] as $prices) {
							if ($prices['priceType'] == 'Цена продажи') {
								$price = $prices['value']/100;
							}
						}
					}

					if ($this->config->get('ms_category')) {
						if (isset($product['productFolder']) && $product['pathName'] != '') {//добавляем категорию в опенкарт
							$categories = [];
							$path = explode('/', $product['pathName']);

							$i = 0;
							for ($i = 0; $i < count($path); $i++) {
								$category_info = $this->model_extension_module_ms->getSyncCategory($path[$i]);
								
								$j = 0;
								if (isset($ms_category_ids)) {
									for ($j = 0; $j < count((array)$ms_category_ids); $j++) {
										$ms_category_name = $this->model_extension_module_ms->getSyncCategoryById($ms_category_ids[$j]['category_id']);

										if ($ms_category_name[0]['category_name'] == $path[$i]) {
											unset($ms_category_ids[$j]);
											sort($ms_category_ids);
										}
									}
								}

								if (empty($category_info)) {
									$data_category = [
										'category_description' => [
											'1' => [
												'name' => $path[$i],
												'description' => $path[$i],
												'meta_title' => $path[$i],
												'meta_h1' => $path[$i],
												'meta_description' => $path[$i],
												'meta_keyword' => $path[$i],
											]
										],
										'category_store' => [
											'0' => 0
										],
										'status' => 1,
										'image' => '',
										'top' => 1,
										'column' => 1,
		    							'sort_order' => 0,
		    							'keyword' => '',
		    							'parent_id' => '',
									];

								if (isset($path[$i - 1])) {
									$parent_category_id = $this->model_extension_module_ms->getSyncCategory($path[$i - 1]);
									$data_category['parent_id'] = $parent_category_id[0]['category_id'];
								}
								
									$category_id = $this->model_catalog_category->addCategory($data_category);
									$this->model_extension_module_ms->setSyncCategory($category_id, $path[$i]);
									$categories[] = $category_id;
								} else {
									if (isset($path[$i - 1])) {
										$parent_category_id = $this->model_extension_module_ms->getSyncCategory($path[$i - 1]);
										$edit_category_data = [
											'category_description' => [
												'1' => [
													'name' => $path[$i],
													'description' => $path[$i],
													'meta_title' => $path[$i],
													'meta_h1' => $path[$i],
													'meta_description' => $path[$i],
													'meta_keyword' => $path[$i],
												]
											],
											'category_store' => [
												'0' => 0
											],
											'status' => 1,
											'image' => '',
											'top' => 1,
											'column' => 1,
			    							'sort_order' => 0,
			    							'keyword' => '',
											'parent_id' => $parent_category_id[0]['category_id'],
										];
										$this->model_catalog_category->editCategory($category_info[0]['category_id'], $edit_category_data);	
									}
									$categories[] = $category_info[0]['category_id'];
								}
							}

							// echo '<pre>';
							// print_r($data_category);
							// echo '</pre>';

							$main_category_id = $this->model_extension_module_ms->getSyncCategory(array_pop($path));
						}
					}

					$quantity = 0;
					if ($this->config->get('ms_stock')) {
						if (!empty($stocks) && isset($product['code'])) {//синхронизация остатков
							foreach ($stocks as $stock) {
								if (isset($product['code'])) {
									if ($stock['code'] == $product['code']) {
										$quantity += $stock['quantity'];
									}
								}
							}
						}
					}

					if ($this->config->get('ms_opt')) {
						if ($product['modificationsCount'] > 0) {//добавить модификации в опенкарт
							$variants = $sklad->getVariantsById($product['id']);
							$product_options = [];
							$product_option_values = [];

							if (isset($variants['errors'])) {
								$this->error += $variants['errors'];
							} else {
								foreach ($variants as $variant) {
									foreach ($variant['characteristics'] as $options => $option) {
										$option_oc = $this->model_extension_module_ms->getOptionByName($option['name']);

										$product_options[] = $option['name'];//////////////////////////////////array_unique()собираем в массив опции данного товара
										$product_option_values[] = $option['value'];//////////////////////////////////array_unique() -=- значения опций

										if (empty($option_oc)) {

											$data_option = [
												'option_description' => [
													'1' => [
														'name' => $option['name'],
													],
												],
												'type' => 'select',
											    'sort_order' => '',
											    'option_value' => [
											    	'0' => [
											    		'option_value_id' => '',
			                    						'option_value_description' => [
			                    							'1' => [
			                    								'name' => $option['value'],
			                    							],
			                    						],
			                    						'image' => '',
			                    						'sort_order' => '',
											    	],
											    ],
											];
											$option_id_oc = $this->model_catalog_option->addOption($data_option);
											$this->model_extension_module_ms->setSyncOption($option_id_oc, $option['name']);	
										} else {
											$option_values_oc = $this->model_catalog_option->getOptionValues($option_oc[0]['option_id']);

											$option_value = [];

											$find = false;

											foreach ($option_values_oc as $option_values) {

												$option_value[] = [
													'option_value_id' => $option_values['option_value_id'],
			                						'option_value_description' => [
			                							'1' => [
			                								'name' => $option_values['name'],
			                							],
			                						],
			                						'image' => '',
			                						'sort_order' => '',
												];

												if ($option_values['name'] == $option['value']) {
													$find = true;
												}
											}

											if (!$find) {
												$option_value[] = [
													'option_value_id' => '',
			                						'option_value_description' => [
			                							'1' => [
			                								'name' => $option['value'],
			                							],
			                						],
			                						'image' => '',
			                						'sort_order' => '',
												];
											}

											$edit_option_data = [
												'option_description' => [
													'1' => [
														'name' => $option['name']
													] 
												],
												'type' => 'select',
									    		'sort_order' => '',
									    		'option_value' => isset($option_value) ? $option_value : [],
											];

											$this->model_catalog_option->editOption($option_oc[0]['option_id'], $edit_option_data);
										}
									}
								}
								//

								// echo "<pre>";
								// print_r(array_unique($product_option_values));
								// echo "</pre>";
								// die();
								if (!empty($product_options)) {//добавляем опции к товарам 

									$product_options = array_unique($product_options);//удаляем повторяющиеся эллементы массива с опциями 

									foreach ($product_options as $key => $option_name) {
										$oc_option_id = $this->model_extension_module_ms->getOptionByName($option_name);
										if (!empty($oc_option_id)) {
											$oc_option = $this->model_catalog_option->getOption($oc_option_id[0]['option_id']);


											$product_option = [
												'product_option_id' => '',
							                    'name' => $oc_option['name'],
							                    'option_id' => $oc_option['option_id'],
							                    'type' => $oc_option['type'],
							                    'required' => '1',
											];
										}

										//по аналогии с опциями нужно собрать массив значений опций данного товара
										if (!empty($product_option_values)) {
											
											$product_option_values = array_unique($product_option_values);//удаляем повторяющиеся эллементы массива
											
											foreach ($product_option_values as $value) {//перебираем значения модификации данного товара
												$product_option_values_oc = $this->model_catalog_option->getOptionValues($oc_option_id[0]['option_id']);//получаем значения данной опции из опенкарт
												foreach ($product_option_values_oc as $values) {//перебираем значения опций опенкарт 
													if ($values['name'] == $value) {//если значение опции опенкарт == значению модификации мойсклад -> добавляем значение этой опции к товару
														$product_option['product_option_value'][] = [
															'option_value_id' => $values['option_value_id'],
						                                    'product_option_value_id' => '',
						                                    'quantity' => '',
						                                    'subtract' => 0,
						                                    'price_prefix' => '+',
						                                    'price' => '',
						                                    'points_prefix' => '+',
						                                    'points' => '',
						                                    'weight_prefix' => '+',
						                                    'weight' => '',
														];
													}
												}
											}
										}
										$product_option_arr[] = $product_option; 
									}
								}
							}
							// echo "<pre>";
							// print_r($product_option_arr);	
							// echo "</pre>";
							// print_r("END------------------");
						}
					}
					//


					$product_data = [
						'product_description' => [
							'1' => [
								'name' => $name,
			                    'description' => $description,
			                    'meta_title' => $name,
			                    'meta_h1' => $name,
			                    'meta_description' => $name,
			                    'meta_keyword' => $name,
			                    'tag' => $name
							]
						],
						'model' => $model,
						'sku' => $sku,
					    'upc' => '',
					    'ean' => '',
					    'jan' => '',
					    'isbn' => '',
					    'mpn' => '',
					    'location' => '',
						'image' => $image,
						'keyword' => '',
						'length' => '',
		    			'width'=> '',
		    			'height' => '',
					    'status' => 1,
					    'price' => isset($price) ? $price : 1,
					    'tax_class_id' => 0,
					    'minimum' => 1,
					    'shipping' => 1,
					    'product_store' => [
					    	'0' => 0
					    ],
					    'quantity' => $quantity,
					    'subtract' => 1,
					    'manufacturer_id' => 0,
					    'sort_order' => 1,
					    'weight_class_id' => 1,
					    'weight' => '',
					    'length_class_id' => 1,
					    'location' => '', 
			   		    'product_category' => isset($categories) ? $categories : [],
					    'stock_status_id' => ($quantity == 0) ? 5 : 7,
					    'date_available' => date('Y-m-d', time()),
					    'points' => '',
					    'main_category_id' => isset($main_category_id) ? $main_category_id[0]['category_id'] : '',
					];

					if (isset($product_option_arr)) {
						$product_data['product_option'] = $product_option_arr;
					}

					$product_data['main_category_id'] = isset($main_category_id) ? $main_category_id[0]['category_id'] : '';

					$this->model_catalog_product->editProduct($product_oc['product_id'], $product_data);

					unset($data_category);
					unset($categories);
					unset($main_category_id);
					unset($product_option_arr);

				} else {//иначе добавить новый товар в опенкарт

					if (isset($product['name'])) {//название товара
						$name = $product['name'];
					} else {
						$name = '';
					}

					// $name = $product['name'] ?? '';

					if (isset($product['code'])) {//код(модель товара)
						$model = $product['code'];
					} else {
						$model = '';	
					}

					// $model = $product['code'] ?? '';

					if (isset($product['description'])) {//описание товара
						$description = $product['description'];
					} else {
						$description = '';	
					}

					// $description = $product['description'] ?? '';

					if (isset($product['article'])) {//артикул товара
						$sku = $product['article'];
					} else {
						$sku = '';
					}

					// $sku = $product['article'] ?? '';

					if (isset($product['image'])) { //изображение товара
						$image = $sklad->getProductImage($product['image']['meta']['href']);
					} else {
						$image = '';
					}

					// $image = isset($product['image']) ? $sklad->getProductImage($product['image']['meta']['href']) : '';

					// if (isset($product['attributes'])) {//дополнительные поля
					// 	foreach ($product['attributes'] as $field) {
					// 		switch ($field['name']) {
					// 			case 'SEO URL':
					// 				$keyword = $field['value'];
					// 				break;

					// 			case 'Мета-тег Description':
					// 				$meta_desc = $field['value'];
					// 				break;
								
					// 			default:
					// 				$value = '';
					// 				break;
					// 		}
					// 	}
					// }

					if (isset($product['salePrices'])) {//цена продажи
						foreach ($product['salePrices'] as $prices) {
							if ($prices['priceType'] == 'Цена продажи') {
								$price = $prices['value']/100;
							}
						}
					}

					if ($this->config->get('ms_category')) {
						if (isset($product['productFolder']) && $product['pathName'] != '') {//добавляем категорию в опенкарт
							$categories = [];
							$path = explode('/', $product['pathName']);
							$i = 0;
							for ($i = 0; $i < count($path); $i++) {
								$category_info = $this->model_extension_module_ms->getSyncCategory($path[$i]);

								$j = 0;
								if (isset($ms_category_ids)) {
									for ($j = 0; $j < count((array)$ms_category_ids); $j++) {
										$ms_category_name = $this->model_extension_module_ms->getSyncCategoryById($ms_category_ids[$j]['category_id']);
										if ($ms_category_name[0]['category_name'] == $path[$i]) {
											unset($ms_category_ids[$j]);
											sort($ms_category_ids);
										}
									}
								}

								if (empty($category_info)) {
									$data_category = [
										'category_description' => [
											'1' => [
												'name' => $path[$i],
												'description' => $path[$i],
												'meta_title' => $path[$i],
												'meta_h1' => $path[$i],
												'meta_description' => $path[$i],
												'meta_keyword' => $path[$i],
											]
										],
										'category_store' => [
											'0' => 0
										],
										'status' => 1,
										'image' => '',
										'top' => 1,
										'column' => 1,
		    							'sort_order' => 0,
		    							'keyword' => '',
		    							'parent_id' => '',
									];

								if (isset($path[$i - 1])) {
									$parent_category_id = $this->model_extension_module_ms->getSyncCategory($path[$i - 1]);
									$data_category['parent_id'] = $parent_category_id[0]['category_id'];
								}

									$category_id = $this->model_catalog_category->addCategory($data_category);
									$this->model_extension_module_ms->setSyncCategory($category_id, $path[$i]);
									$categories[] = $category_id;
								} else {
									if (isset($path[$i - 1])) {
										$parent_category_id = $this->model_extension_module_ms->getSyncCategory($path[$i - 1]);
										$edit_category_data = [
										'category_description' => [
											'1' => [
												'name' => $path[$i],
												'description' => $path[$i],
												'meta_title' => $path[$i],
												'meta_h1' => $path[$i],
												'meta_description' => $path[$i],
												'meta_keyword' => $path[$i],
											]
										],
										'category_store' => [
											'0' => 0
										],
										'status' => 1,
										'image' => '',
										'top' => 1,
										'column' => 1,
		    							'sort_order' => 0,
		    							'keyword' => '',
										'parent_id' => $parent_category_id[0]['category_id'],
										];
										$this->model_catalog_category->editCategory($category_info[0]['category_id'], $edit_category_data);	
									}
									$categories[] = $category_info[0]['category_id'];
								}
							}

							// echo '<pre>';
							// print_r($data_category);
							// echo '</pre>';

							$main_category_id = $this->model_extension_module_ms->getSyncCategory(array_pop($path));
						}
					}

					$quantity = 0;
					if ($this->config->get('ms_stock')) {	
						if (!empty($stocks) && isset($product['code'])) {//синхронизация остатков
							foreach ($stocks as $stock) {
								if (isset($product['code'])) {
									if ($stock['code'] == $product['code']) {
										$quantity += $stock['quantity'];
									}
								}
							}
						}
					}
					// 
					if ($this->config->get('ms_opt')) {
						if ($product['modificationsCount'] > 0) {//добавить модификации в опенкарт
							$variants = $sklad->getVariantsById($product['id']);
							$product_options = [];
							$product_option_values = [];

							if (isset($variants['errors'])) {
								$this->error += $variants['errors'];
							} else {
								foreach ($variants as $variant) {
									foreach ($variant['characteristics'] as $options => $option) {
										$option_oc = $this->model_extension_module_ms->getOptionByName($option['name']);

										$product_options[] = $option['name'];//////////////////////////////////array_unique()собираем в массив опции данного товара
										$product_option_values[] = $option['value'];//////////////////////////////////array_unique() -=- значения опций

										if (empty($option_oc)) {

											$data_option = [
												'option_description' => [
													'1' => [
														'name' => $option['name'],
													],
												],
												'type' => 'select',
											    'sort_order' => '',
											    'option_value' => [
											    	'0' => [
											    		'option_value_id' => '',
			                    						'option_value_description' => [
			                    							'1' => [
			                    								'name' => $option['value'],
			                    							],
			                    						],
			                    						'image' => '',
			                    						'sort_order' => '',
											    	],
											    ],
											];
											$option_id_oc = $this->model_catalog_option->addOption($data_option);
											$this->model_extension_module_ms->setSyncOption($option_id_oc, $option['name']);	
										} else {
											$option_values_oc = $this->model_catalog_option->getOptionValues($option_oc[0]['option_id']);
											$option_value = [];

											$find = false;

											foreach ($option_values_oc as $option_values) {

												$option_value[] = [
													'option_value_id' => $option_values['option_value_id'],
			                						'option_value_description' => [
			                							'1' => [
			                								'name' => $option_values['name'],
			                							],
			                						],
			                						'image' => '',
			                						'sort_order' => '',
												];

												if ($option_values['name'] == $option['value']) {
													$find = true;
												}
											}

											if (!$find) {
												$option_value[] = [
													'option_value_id' => '',
			                						'option_value_description' => [
			                							'1' => [
			                								'name' => $option['value'],
			                							],
			                						],
			                						'image' => '',
			                						'sort_order' => '',
												];
											}

											$edit_option_data = [
												'option_description' => [
													'1' => [
														'name' => $option['name']
													] 
												],
												'type' => 'select',
									    		'sort_order' => '',
									    		'option_value' => isset($option_value) ? $option_value : [],
											];

											$this->model_catalog_option->editOption($option_oc[0]['option_id'], $edit_option_data);
										}
									}
								}
								//

								// echo "<pre>";
								// print_r(array_unique($product_option_values));
								// echo "</pre>";
								// die();
								if (!empty($product_options)) {//добавляем опции к товарам 

									$product_options = array_unique($product_options);//удаляем повторяющиеся эллементы массива с опциями 

									foreach ($product_options as $key => $option_name) {
										$oc_option_id = $this->model_extension_module_ms->getOptionByName($option_name);
										$oc_option = $this->model_catalog_option->getOption($oc_option_id[0]['option_id']);


										$product_option = [
											'product_option_id' => '',
						                    'name' => $oc_option['name'],
						                    'option_id' => $oc_option['option_id'],
						                    'type' => $oc_option['type'],
						                    'required' => '1',
										];

										//по аналогии с опциями нужно собрать массив значений опций данного товара
										if (!empty($product_option_values)) {
											
											$product_option_values = array_unique($product_option_values);//удаляем повторяющиеся эллементы массива
											
											foreach ($product_option_values as $value) {//перебираем значения модификации данного товара
												$product_option_values_oc = $this->model_catalog_option->getOptionValues($oc_option_id[0]['option_id']);//получаем значения данной опции из опенкарт
												foreach ($product_option_values_oc as $values) {//перебираем значения опций опенкарт 
													if ($values['name'] == $value) {//если значение опции опенкарт == значению модификации мойсклад -> добавляем значение этой опции к товару
														$product_option['product_option_value'][] = [
															'option_value_id' => $values['option_value_id'],
						                                    'product_option_value_id' => '',
						                                    'quantity' => '',
						                                    'subtract' => 0,
						                                    'price_prefix' => '+',
						                                    'price' => '',
						                                    'points_prefix' => '+',
						                                    'points' => '',
						                                    'weight_prefix' => '+',
						                                    'weight' => '',
														];
													}
												}
											}
										}
										$product_option_arr[] = $product_option; 
									}
								}
							}
							// echo "<pre>";
							// print_r($product_option_arr);	
							// echo "</pre>";
							// print_r("END------------------");
						}
					}
					//

					$product_data = [
						'product_description' => [
							'1' => [
								'name' => $name,
			                    'description' => $description,
			                    'meta_title' => $name,
			                    'meta_h1' => $name,
			                    'meta_description' => $name,
			                    'meta_keyword' => $name,
			                    'tag' => $name
							]
						],
						'model' => $model,
						'sku' => $sku,
						'upc' => '',
					    'ean' => '',
					    'jan' => '',
					    'isbn' => '',
					    'mpn' => '',
						'image' => $image,
						'keyword' => '',
						'length' => '',
		    			'width'=> '',
		    			'height' => '',
					    'status' => 1,
					    'price' => isset($price) ? $price : 1,
					    'tax_class_id' => 0,
					    'minimum' => 1,
					    'shipping' => 1,
					    'product_store' => [
					    	'0' => 0
					    ],
					    'quantity' => $quantity,
					    'subtract' => 1,
					    'manufacturer_id' => 0,
					    'sort_order' => 1,
					    'weight_class_id' => 1,
					    'weight' => '',
					    'length_class_id' => 1,
					    'location' => '',
			   		    'product_category' => isset($categories) ? $categories : [],
					    'stock_status_id' => ($quantity == 0) ? 5 : 7,
					    'date_available' => date('Y-m-d', time()),
					    'points' => '',
					    'main_category_id' => isset($main_category_id) ? $main_category_id[0]['category_id'] : '',
					];

					if (isset($product_option_arr)) {
						$product_data['product_option'] = $product_option_arr;
					}

					$product_id = $this->model_catalog_product->addProduct($product_data);

					unset($data_category);
					unset($categories);
					unset($main_category_id);
					unset($product_option_arr);

					$this->model_extension_module_ms->syncProducts($product_id, $product['id']);
				}

			}


			//удалить товары 
			if (!empty($ms_product_ids)) {
				foreach ($ms_product_ids as $id) {
					$product_oc_id = $this->model_extension_module_ms->getProductIdByMSId($id['ms_product_id']);
					$this->model_catalog_product->deleteProduct($product_oc_id);
					// $this->model_extension_module_ms->deleteProductId($product_oc_id);

				}
			}
			//удалить категории
			if (!empty($ms_category_ids)) {
				foreach ($ms_category_ids as $cat_id) {
					$this->model_catalog_category->deleteCategory($cat_id['category_id']);
					// $this->model_extension_module_ms->deleteCategoryId($cat_id['category_id']);

				}
			}

			if ($this->error) {//return json errors
				$json['errors'] = $this->error;
			}
			
			// sleep(10); 
			$this->response->addHeader('Content-Type: application/json');
			$this->response->setOutput(json_encode($json));
			// $this->response->redirect($this->url->link('catalog/product','&token=' . $this->session->data['token'], 'SSL'));
		} else {

//			$this->session->data['license_error'] = $this->language->get('license_error');
//		    $data['license_error'] = $this->session->data['license_error'];
		    
			$this->response->redirect($this->url->link('extension/extension', '&token=' . $this->session->data['token'], 'SSL'));
		}
	}

	//function for send SMS customers who didn`t have orders last 30 days 
	public function sendSMS() {
		$this->load->language('extension/module/ms');
		$request_data = [
			'host' => $_SERVER['HTTP_HOST'],
			'secret' => 'zerrnoco'
		];

		if (true) {
			$this->load->model('extension/module/ms');
			$this->load->model('customer/customer');

			$customers_id = $this->model_extension_module_ms->getCustomerIds();


			if (!empty($customers_id)) {
				//send msg SMSint
				$sms_login = $this->config->get('ms_sms_login');
				$sms_password = $this->config->get('ms_sms_password');

				$smsint = new Transport($sms_login, $sms_password);
				
				foreach ($customers_id as $customer) {
					$customer_info = $this->model_customer_customer->getCustomer($customer['customer_id']);
					// echo '<pre>';
					// print_r($customer_info);
					// echo '</pre>';
					// die();
					if (!empty($customer_info)) {
						if ($customer_info['sms_status'] == 0) {
							$sms_text = $this->config->get('ms_sms_tpl_30');
							
							$customer_telephone = str_replace(array('+', ' ', '(' , ')', '-'), '', $customer_info['telephone']);
							$customer_email = $customer_info['email'];
							//replace values
							$replace = [
								'{$name}' => isset($customer_name) ? $customer_name : '',
								'{$email}' => isset($customer_email) ? $customer_email : '',
							];
							// 

							$sms_text = strtr($sms_text, $replace);

							$params = [
								'text' => $sms_text,
								'source' => 'PikFormy',
								'action' => 'check'
							];

							$phones = [strval($customer_telephone)];

							$send = $smsint->send($params, $phones);
							
							echo "<pre>";
							print_r($send);
							echo "</pre>";

							if ($send['code'] == 1) {
								$status = 1;
								$this->model_extension_module_ms->changeSmsStatus($customer['customer_id'], $status);
							} 
						} elseif ($customer_info['sms_status'] == 1) {
							$diff = (time() - strtotime($customer_info['date_update_status'], time()))/(60 * 60 * 24);//(*24)

							if ($diff >= 30) {
								$this->model_extension_module_ms->changeSmsStatus($customer['customer_id'], 0);
							}
						}
					}
				}
			}
		} else {
//			$this->session->data['license_error'] = $this->language->get('license_error');
//		    $data['license_error'] = $this->session->data['license_error'];
		    
			$this->response->redirect($this->url->link('extension/extension', '&token=' . $this->session->data['token'], 'SSL'));
		}
	}
}

 

Надіслати
Поділитися на інших сайтах


  • 3 weeks later...

Приветствую

Модуль установился, но в разделе Дополнения когда нажимаешь Установить вылезает ошибка

Parse error: syntax error, unexpected '$this' (T_VARIABLE) in /var/www/u0554028/data/www/hikari-cosmetics.ru/admin/controller/extension/module/ms.php on line 6

 

Как решить это?

Версия ocStore 2.3.0.2.3

Змінено користувачем mikkymike
Надіслати
Поділитися на інших сайтах


  • 3 weeks later...
  • 1 month later...
  • 1 month later...

Кому интересно, можете почитать вот эту статью:

https://weburoki.pro/opencart-moysklad

она как раз про это, и показываеться как исправить несколько ошибок (которые занимают очень много времени если про них не знать)

Надіслати
Поділитися на інших сайтах


Скажите, а поддерживает ли синхронизацию нескольких складов? 

В мойСкладе сейчас несколько - по разным магазинам. Вот хотим свести в один опенкартовский мультимагазин, или мультирегион с разными складами, соответственно и остатки - цены хотелось бы с соответствующими синхронизировать.

Надіслати
Поділитися на інших сайтах


  • 4 weeks later...
  • 2 weeks later...
  • 2 weeks later...

Модуль рабочий, но чутка глючный при количестве товаров 100+

Пришлось немного переделать (надеюсь, ТС не против)

Добавил кеширование + логику обновления товаров + скачивание картинок не каждый раз, а только при добавлении или смене картинки. + ко всему ведутся все логи, ошибку можно будет моментально отследить

Теперь синхронизация 1000 товаров не зависает намертво, а длится 2-10 секунд

Еще немного улучшу и скоро выложу в открытый доступ. Также бесплатно, но с платной поддержкой. А кому не терпится - пишите в ЛС, платно помогу с синхронизацией

  • +1 1
Надіслати
Поділитися на інших сайтах

  • 9 months later...
  • 1 month later...
В 08.11.2019 в 18:46, netruxa сказал:

Модуль рабочий, но чутка глючный при количестве товаров 100+

Пришлось немного переделать (надеюсь, ТС не против)

Добавил кеширование + логику обновления товаров + скачивание картинок не каждый раз, а только при добавлении или смене картинки. + ко всему ведутся все логи, ошибку можно будет моментально отследить

Теперь синхронизация 1000 товаров не зависает намертво, а длится 2-10 секунд

Еще немного улучшу и скоро выложу в открытый доступ. Также бесплатно, но с платной поддержкой. А кому не терпится - пишите в ЛС, платно помогу с синхронизацией

Еще не выложил?

Надіслати
Поділитися на інших сайтах


  • 3 weeks later...
  • 4 weeks later...
В 08.11.2019 в 14:46, netruxa сказал:

Модуль рабочий, но чутка глючный при количестве товаров 100+

Пришлось немного переделать (надеюсь, ТС не против)

Добавил кеширование + логику обновления товаров + скачивание картинок не каждый раз, а только при добавлении или смене картинки. + ко всему ведутся все логи, ошибку можно будет моментально отследить

Теперь синхронизация 1000 товаров не зависает намертво, а длится 2-10 секунд

Еще немного улучшу и скоро выложу в открытый доступ. Также бесплатно, но с платной поддержкой. А кому не терпится - пишите в ЛС, платно помогу с синхронизацией


Добрый, как с вами связаться? 

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.