From 817c606e8f4e0e38d32e5ce9f7153809f513e1f4 Mon Sep 17 00:00:00 2001 From: Sergey Date: Tue, 23 Apr 2019 14:15:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=83=D1=81=D0=BB=D1=83=D0=B3=20=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MoySkladICMLParser.php | 98 ++++++++++++++++++++++-------------------- README.md | 13 +++--- 2 files changed, 59 insertions(+), 52 deletions(-) diff --git a/MoySkladICMLParser.php b/MoySkladICMLParser.php index 70f5e07..204a4b4 100644 --- a/MoySkladICMLParser.php +++ b/MoySkladICMLParser.php @@ -162,7 +162,7 @@ class MoySkladICMLParser */ protected function parserFolder() { - $categories = []; + $categories = array(); $offset = 0; $end = null; $ignoreCategories = $this->getIgnoreProductGroupsInfo(); @@ -179,6 +179,7 @@ class MoySkladICMLParser $response = $this->requestJson(self::BASE_URL . self::FOLDER_LIST_URL . '?expand=productFolder&limit=100&offset=' . $offset); } catch (Exception $e) { echo $e->getMessage(); + return array(); } @@ -201,6 +202,7 @@ class MoySkladICMLParser if (in_array($folder['externalCode'],$ignoreCategories['externalCode'])) { continue; } + if (isset($folder['productFolder']['externalCode'])) { if (in_array($folder['productFolder']['externalCode'],$ignoreCategories['externalCode'])) { continue; @@ -253,31 +255,38 @@ class MoySkladICMLParser $ignoreCategories = $this->getIgnoreProductGroupsInfo(); - if (isset($this->options['archivedGoods']) && $this->options['archivedGoods'] === true) { + if (isset($this->options['archivedGoods'])) { $url .= '&archived=All'; } while (true) { - try{ + try{ $response = $this->requestJson($url.'&offset='.$offset); } catch (Exception $e) { echo $e->getMessage(); return array(); } + if ($response && $response['rows']) { - foreach ($response['rows'] as $assortiment) { + if (!empty($assortiment['modificationsCount']) + || $assortiment['meta']['type'] == 'consignment') + { + continue; + } - if (!empty($assortiment['modificationsCount']) || - $assortiment['meta']['type'] == 'service' || - $assortiment['meta']['type'] == 'consignment') { + if ($assortiment['meta']['type'] == 'service' && !isset($this->options['service'])) + { + if (!isset($this->options['service']) || !$this->options['service']) { continue; + } } if ($ignoreNoCategoryOffers === true) { - if ( !isset($assortiment['productFolder']['externalCode']) && - !isset($assortiment['product']['productFolder']['externalCode']) ) { + if (!isset($assortiment['productFolder']['externalCode']) + && !isset($assortiment['product']['productFolder']['externalCode'])) + { continue; } @@ -298,7 +307,6 @@ class MoySkladICMLParser } if (isset($ignoreCategories['externalCode']) && is_array($ignoreCategories['externalCode'])) { - if (!empty($assortiment['productFolder']['externalCode'])) { if (in_array($assortiment['productFolder']['externalCode'], $ignoreCategories['externalCode'])) { continue; @@ -320,25 +328,23 @@ class MoySkladICMLParser $urlImage = ''; } + if (!empty($assortiment['product']['externalCode'])) { + $xmlId = $assortiment['product']['externalCode'] . '#' . $assortiment['externalCode']; + } else { + $xmlId = $assortiment['externalCode']; + } + $products[$assortiment['id']] = array( 'uuid' => $assortiment['id'], - 'id' => !empty($assortiment['product']['externalCode']) ? - ($assortiment['product']['externalCode'] . '#' . $assortiment['externalCode']) : - $assortiment['externalCode'], + 'id' => $xmlId, 'exCode' => $assortiment['externalCode'], 'productId' => isset($assortiment['product']['externalCode']) ? $assortiment['product']['externalCode'] : $assortiment['externalCode'], 'name' => $assortiment['name'], 'productName'=> isset($assortiment['product']['name']) ? $assortiment['product']['name'] : $assortiment['name'], - 'weight' => isset($assortiment['weight']) ? - $assortiment['weight'] : - $assortiment['product']['weight'], 'code' => isset($assortiment['code']) ? (string) $assortiment['code'] : '', - 'xmlId' => !empty($assortiment['product']['externalCode']) ? - ($assortiment['product']['externalCode'] . '#' . $assortiment['externalCode']) : - $assortiment['externalCode'], - + 'xmlId' => $xmlId, 'url' => !empty($assortiment['product']['meta']['uuidHref']) ? $assortiment['product']['meta']['uuidHref'] : ( @@ -347,10 +353,17 @@ class MoySkladICMLParser '' ), ); + + if (isset($assortiment['weight'])) { + $products[$assortiment['id']]['weight'] = $assortiment['weight']; + } elseif (isset($assortiment['product']['weight'])) { + $products[$assortiment['id']]['weight'] = $assortiment['product']['weight']; + } + if (isset($this->options['customFields'])) { if (!empty($assortiment['attributes'])) { $products[$assortiment['id']]['customFields'] = $this->getCustomFields($assortiment['attributes']); - } elseif (!empty($assortiment['product']['attributes'])){ + } elseif (!empty($assortiment['product']['attributes'])) { $products[$assortiment['id']]['customFields'] = $this->getCustomFields($assortiment['product']['attributes']); } } @@ -365,18 +378,18 @@ class MoySkladICMLParser if (isset($assortiment['buyPrice']['value'])) { $products[$assortiment['id']]['purchasePrice'] = (((float)$assortiment['buyPrice']['value']) / 100); } elseif (isset($assortiment['product']['buyPrice']['value'])) { - $products[$assortiment['id']]['purchasePrice'] = (((float)$assortiment['product']['buyPrice']['value']) / 100); + $products[$assortiment['id']]['purchasePrice'] = (((float)$assortiment['product']['buyPrice']['value']) / 100); } else { $products[$assortiment['id']]['purchasePrice'] = 0; } } if (isset($assortiment['salePrices'][0]['value']) && $assortiment['salePrices'][0]['value'] != 0) { - $products[$assortiment['id']]['price'] = (((float)$assortiment['salePrices'][0]['value']) / 100); - } elseif (isset($assortiment['product']['salePrices'][0]['value'])) { - $products[$assortiment['id']]['price'] = (((float)$assortiment['product']['salePrices'][0]['value']) / 100); - } else { - $products[$assortiment['id']]['price'] = ((float)0); + $products[$assortiment['id']]['price'] = (((float)$assortiment['salePrices'][0]['value']) / 100); + } elseif (isset($assortiment['product']['salePrices'][0]['value'])) { + $products[$assortiment['id']]['price'] = (((float)$assortiment['product']['salePrices'][0]['value']) / 100); + } else { + $products[$assortiment['id']]['price'] = ((float)0); } if (isset($assortiment['uom'])){ @@ -394,6 +407,7 @@ class MoySkladICMLParser ); } } elseif (isset($assortiment['product']['uom'])) { + if (isset($assortiment['product']['uom']['code'])){ $products[$assortiment['id']]['unit'] = array ( 'code' => $assortiment['product']['uom']['code'], @@ -407,10 +421,8 @@ class MoySkladICMLParser 'description' => $assortiment['product']['uom']['name'], ); } - } else { - $products[$assortiment['id']]['unit'] = ''; } - + if (isset($assortiment['effectiveVat']) && $assortiment['effectiveVat'] != 0) { $products[$assortiment['id']]['effectiveVat'] = $assortiment['effectiveVat']; } elseif (isset($assortiment['product']['effectiveVat']) && $assortiment['product']['effectiveVat'] != 0) { @@ -435,25 +447,20 @@ class MoySkladICMLParser $products[$assortiment['id']]['article'] = (string) $assortiment['article']; } elseif (isset($assortiment['product']['article'])) { $products[$assortiment['id']]['article'] = (string) $assortiment['product']['article']; - } else { - $products[$assortiment['id']]['article'] = ''; } if (isset($assortiment['product']['supplier']['name'])) { $products[$assortiment['id']]['vendor'] = $assortiment['product']['supplier']['name']; } elseif (isset($assortiment['supplier']['name'])) { $products[$assortiment['id']]['vendor'] = $assortiment['supplier']['name']; - } else { - $products[$assortiment['id']]['vendor'] = ''; } - + if ($urlImage != '') { $products[$assortiment['id']]['image']['imageUrl'] = $urlImage; - $products[$assortiment['id']]['image']['name'] = - isset($assortiment['image']['filename']) ? - $assortiment['image']['filename'] : $assortiment['product']['image']['filename']; + $products[$assortiment['id']]['image']['name'] = isset($assortiment['image']['filename']) ? + $assortiment['image']['filename'] : + $assortiment['product']['image']['filename']; } - } } @@ -469,6 +476,7 @@ class MoySkladICMLParser break; } } + unset($response, $assortiment); return $products; @@ -545,7 +553,7 @@ class MoySkladICMLParser $this->icmlAdd($offerXml, 'url', htmlspecialchars($product['url'])); } - if ($product['unit'] != '') { + if (isset($product['unit'])) { $unitXml = $offerXml->addChild('unit'); $unitXml->addAttribute('code', $product['unit']['code']); $unitXml->addAttribute('name', $product['unit']['description']); @@ -554,19 +562,17 @@ class MoySkladICMLParser if ($product['categoryId']) { $this->icmlAdd($offerXml, 'categoryId', $product['categoryId']); - }else { - $this->icmlAdd($offerXml, 'categoryId', 'warehouseRoot'); } - if ($product['article']) { + if (isset($product['article'])) { $art = $this->icmlAdd($offerXml, 'param', $product['article']); $art->addAttribute('code', 'article'); $art->addAttribute('name', 'Артикул'); } - if ($product['weight']) { + if (isset($product['weight'])) { if (isset($this->options['tagWeight']) && $this->options['tagWeight'] === true) { - $wei = $this->icmlAdd($offerXml, 'weight', $product['weight']); + $this->icmlAdd($offerXml, 'weight', $product['weight']); } else { $wei = $this->icmlAdd($offerXml, 'param', $product['weight']); $wei->addAttribute('code', 'weight'); @@ -580,7 +586,7 @@ class MoySkladICMLParser $cod->addAttribute('name', 'Код'); } - if ($product['vendor']) { + if (isset($product['vendor'])) { $this->icmlAdd($offerXml, 'vendor', $product['vendor']); } diff --git a/README.md b/README.md index 98023af..4e66e6e 100644 --- a/README.md +++ b/README.md @@ -71,34 +71,35 @@ e) При необходимости включения в генерацию а Формат: положительное число с точностью 0.001 (или 0.000001, в зависимости от настройки RetailCRM "Точность веса": граммы или миллиграммы соответственно), разделитель целой и дробной части - точка. Указывается в свойствах товара сервиса Мой Склад. * `loadPurchasePrice` - установка данной опции со значением `true` включает в генерацию закупочные цены. По умолчанию закупочные цены для товаров не генерируются. +* `service` - установка данного ключа со значение `true` добавляет в генерацию каталога услуги, созданные в сервисе Мой Склад. * `customFields` - массив для указания для генерации габаритов (dimensions) и дополнительных параметров товаров. Включает в себя следующие опции: * `dimensions` - массив с одним или тремя значениями, содержащий id пользовательских полей товара в МС. При указании 3 полей должен соблюдаться порядок 'Длина,Ширина,Высота'. Пример заполнения: `'dimensions' => - [ + array( '00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000000' - ]` + )` Если для генерации планируется использовать одно поле, то нужно использовать дополнительный параметр `separate` в котором вы должны указать какой разделитель используется в поле между значениями на стороне МС. Пример заполнения: ` 'separate' => '/', 'dimensions' => - [ + array( '00000000-0000-0000-0000-000000000000' - ] + ) ` * `paramTag` - массив со значениями,складывающимися из кода, который должен использоваться для генерации данного дополнительного параметра и id пользовательского поля товара. Заполняется с разделетелем "#" следующим образом: `'paramTag'=> - [ + array( 'somecode1#00000000-0000-0000-0000-000000000000', 'somecode2#00000000-0000-0000-0000-000000000000' - ]` + )` Id пользовательских свойств товара можно получить, совершив GET-запрос к api МС по адресу `https://online.moysklad.ru/api/remap/1.1/entity/product/metadata`, используя для запроса ваш логин и пароль, используемый для генерации каталога. Необходимые id будут указаны внутри индекса "attributes".