Сентябрь 8, 2022
Теги: События, Модули grain, Интеграция с iiko
В данном примере килограммы конвертируются в граммы при загрузке товаров на сайт, и обратно в килограммы - при отправке заказа в iiko. Для модуля Интеграция с iiko. Используются события "OnBeforeDishesSync", "OnAfterSyncElementAsProductPropertyUpdate", "OnBuildOrderParamsArray".
<?php
namespace Partner;
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'grain.iiko',
'OnBeforeDishesSync',
'\Partner\DishesUnitFix::onBeforeDishesSync'
);
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'grain.iiko',
'OnAfterSyncElementAsProductPropertyUpdate',
'\Partner\DishesUnitFix::onAfterSyncElementAsProductPropertyUpdate'
);
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'grain.iiko',
'OnBuildOrderParamsArray',
'\Partner\DishesUnitFix::onBuildOrderParamsArray'
);
class DishesUnitFix
{
static $changedUnitIds = array();
public static function onBeforeDishesSync(\Bitrix\Main\Event $event)
{
$restaurant = $event->getParameter('RESTAURANT'); // массив с данными ресторана, может быть изменен и возвращен
$dishesIblockId = $event->getParameter('DISHES_IBLOCK_ID'); // ID текущего обновляемого инфоблока с блюдами, может быть изменен и возвращен
$dishes = $event->getParameter('DISHES'); // массив данных номенклатуры из iiko, может быть изменен и возвращен
$stopList = $event->getParameter('STOP_LIST'); // массив данных стоп-листа из iiko, может быть изменен и возвращен
// изменяем массив данных из iiko и заносим id измененных товаров в $changedUnitIds
foreach($dishes['result']['products'] as &$product)
{
if($product['type']=='Modifier' || $product['type']=='Service')
continue;
if($product['measureUnit']!='кг')
continue;
$xmlId = $product['id'];
$product['measureUnit'] = 'г';
foreach($product['sizePrices'] as &$price)
{
if(!isset($price['price']['currentPrice']))
continue;
$price['price']['currentPrice'] /= 1000;
}
unset($price);
if(isset($product['weight']) && $product['weight']>0)
$product['weight'] /= 1000;
// не забываем изменить стоп-лист
if(isset($stopList[$xmlId]['items']))
{
foreach($stopList[$xmlId]['items'] as $terminalGroupId=>&$stopListItem)
{
$stopListItem['balance'] *= 1000;
}
unset($stopListItem);
if(isset($stopList[$xmlId]['totalQuantity']))
$stopList[$xmlId]['totalQuantity'] *= 1000;
if(isset($stopList[$xmlId]['minimalQuantity']))
$stopList[$xmlId]['minimalQuantity'] *= 1000;
}
// /не забываем изменить стоп-лист
static::$changedUnitIds[] = $xmlId;
}
unset($product);
// /изменяем массив данных из iiko и заносим id измененных товаров в $changedUnitIds
$changedData = array();
foreach ($event->getResults() as $eventResult) // получение данных после другого обработчика, если он был
{
if($eventResult->getType() == \Bitrix\Main\EventResult::ERROR)
continue;
if($eventResult->getParameters())
$changedData = $eventResult->getParameters();
}
$changedData['DISHES'] = $dishes;
$changedData['STOP_LIST'] = $stopList;
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $changedData);
return $result;
}
public static function onAfterSyncElementAsProductPropertyUpdate(\Bitrix\Main\Event $event)
{
// на этапе вызова события элемент инфоблока создан или обновлен, также обновлены данные товара и свойства
$restaurant = $event->getParameter('RESTAURANT'); // массив с данными ресторана
$fields = $event->getParameter('PROP_TO_PRODUCT'); // соответствие название свойств и полей товара из iiko
$id = $event->getParameter('ID'); // ID элемента инфоблока
$product = $event->getParameter('PRODUCT'); // данные товара из iiko
// проставляем в элементах инфоблока свойство-флаг изменения единиц измерения
$xmlId = $product['id'];
\CIBlockElement::SetPropertyValueCode($id, 'converted_to_grams', in_array($xmlId,static::$changedUnitIds)?1:0);
// /проставляем в элементах инфоблока свойство-флаг изменения единиц измерения
}
public static function onBuildOrderParamsArray(\Bitrix\Main\Event $event)
{
$restaurant = $event->getParameter('RESTAURANT'); // массив с данными ресторана
$order = $event->getParameter('ORDER'); // объект заказа модуля интернет-магазина
$params = $event->getParameter('PARAMS'); // массив подготовленных параметров для передачи в iiko (не результирующий массив), может быть изменен и возвращен
foreach ($event->getResults() as $eventResult) // получение данных после другого обработчика, если он был
{
if($eventResult->getType() == \Bitrix\Main\EventResult::ERROR)
continue;
if($eventResult->getParameters())
$params = $eventResult->getParameters();
}
$check = $event->getParameter('CHECK'); // флаг проверки перед добавлением заказа
// изменяем массив $params
$basket = $order->getBasket();
foreach ($basket as $basketItem)
{
$productId = intval($basketItem->getProductId());
if($productId<=0)
continue;
$rsElements = \CIBlockElement::GetList(
array(),
array("=ID"=>$productId),
false,
array("nTopCount"=>1),
array("ID","IBLOCK_ID","XML_ID","NAME","PROPERTY_converted_to_grams")
);
if(!$ob=$rsElements->GetNextElement())
continue;
$element = $ob->GetFields();
$element['PROPERTIES'] = array(
'converted_to_grams'=>$ob->GetProperty('converted_to_grams'),
);
if(!$element['PROPERTIES']['converted_to_grams']['~VALUE'])
continue;
foreach($params['items'] as &$item)
{
if($item['id']!=$element['XML_ID'])
continue;
$item['price'] *= 1000;
$item['amount'] /= 1000;
}
unset($item);
}
// /изменяем массив $params
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $params);
return $result;
}
}