1
0
Fork 0
mirror of synced 2025-04-09 12:02:04 +00:00

Генерация услуг в каталоге

This commit is contained in:
Sergey 2019-04-23 14:15:08 +03:00
parent 1aac177c4e
commit 817c606e8f
2 changed files with 59 additions and 52 deletions

View file

@ -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']);
}

View file

@ -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".