Ноябрь 10, 2023
Теги: События, Интеграция с iiko
Для модуля Интеграция с iiko. Установка корневой группы для выгрузки, в данном примере - "Меню Сайт" (их может быть несколько).
Требуется создание свойства раздела "UF_FORCE_HIDE" ("Принудительно деактивировать раздел", тип "Да/Нет"). Т.к. групповые модификаторы других папок могут попадать в выгрузку, папки модификаторов складываются в корневую папку "МОДИФИКАТОРЫ", после первой синхронизации ее можно деактивировать и установить данную галочку для предотвращения активации при следующей синхронизации:
<?php
namespace Partner;
use \Bitrix\Main\Config\Option;
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'grain.iiko',
'OnBeforeDishesSync',
'\Partner\SetRootGroup::onBeforeDishesSync'
);
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'grain.iiko',
'OnAfterSyncSectionAsGroupUpdate',
'\Partner\SetRootGroup::onAfterSyncSectionAsGroupUpdate'
);
class SetRootGroup
{
const rootGroupNames = 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, может быть изменен и возвращен
$modifierGroupId = array();
foreach($dishes['result']['products'] as $product)
{
if($product['type'] != 'Modifier')
continue;
if($product['groupId'] && !in_array($product['groupId'],$modifierGroupId))
$modifierGroupId[] = $product['groupId'];
if($product['parentGroup'] && !in_array($product['parentGroup'],$modifierGroupId))
$modifierGroupId[] = $product['parentGroup'];
}
$modifiersParentGroup = array(
"imageLinks" => array(),
"parentGroup" => null,
"order" => 0,
"isIncludedInMenu" => true,
"isGroupModifier" => true,
"id" => "modifiesrs-custom",
"code" => '',
"name" => "МОДИФИКАТОРЫ",
"description" => "",
"additionalInfo" => "",
"tags" => "",
"isDeleted" => "",
"seoDescription" => "",
"seoText" => "",
"seoKeywords" => "",
"seoTitle" => "",
);
$leaveGroupId = array($modifiersParentGroup['id']);
$rootGroupId = array();
$groupsById = array();
if(is_array($dishes['result']['groups']))
{
$c=0;
while(count($groupsById)<count($dishes['result']['groups']) && $c<=10)
{
foreach($dishes['result']['groups'] as $group)
{
if(array_key_exists($group['id'], $groupsById))
continue;
if(strlen(strval($group['parentGroup']))>0 && !array_key_exists($group['parentGroup'], $groupsById))
continue;
$groupsById[$group['id']] = $group;
if(in_array($group['name'],static::rootGroupNames))
$rootGroupId[] = $group['id'];
}
$c++;
}
}
$dishes['result']['groups'] = array(
$modifiersParentGroup,
);
foreach($groupsById as $groupId => $group)
{
if(in_array($group['parentGroup'],$rootGroupId))
{
$group['parentGroup'] = null;
$dishes['result']['groups'][] = $group;
$leaveGroupId[] = $group['id'];
}
elseif(
(in_array($group['id'],$modifierGroupId) || $group['isGroupModifier'])
) {
$groupChain = array($group);
$currentGroup = $group;
while($currentGroup['parentGroup'])
{
if(!$currentGroup=$groupsById[$currentGroup['parentGroup']])
break;
if(in_array($currentGroup['id'],$rootGroupId))
break;
array_unshift($groupChain, $currentGroup);
}
$leaveGroupId[] = $group['id'];
//print_r($groupChain);
foreach($groupChain as $i=>&$currentGroup)
{
if($i==0)
$currentGroup['parentGroup'] = $modifiersParentGroup['id'];
$dishes['result']['groups'][] = $currentGroup;
}
unset($currentGroup);
//print_r($groupChain);
}
elseif(in_array($group['parentGroup'],$leaveGroupId))
{
$dishes['result']['groups'][] = $group;
$leaveGroupId[] = $group['id'];
}
}
$tmpProducts = $dishes['result']['products'];
$dishes['result']['products'] = array();
foreach($tmpProducts as $product)
{
if($product['type']=='Dish' && !in_array($product['parentGroup'], $leaveGroupId))
continue;
$dishes['result']['products'][] = $product;
}
unset($product);
$changedData = array();
$changedData['DISHES'] = $dishes;
//print_r($dishes);die();
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $changedData);
return $result;
}
public static function onAfterSyncSectionAsGroupUpdate(\Bitrix\Main\Event $event)
{
$restaurant = $event->getParameter('RESTAURANT'); // массив с данными ресторана
$fields = $event->getParameter('FIELDS'); // обновленные поля раздела
$id = $event->getParameter('ID'); // ID раздела
$group = $event->getParameter('GROUP'); // массив данных группы из api iiko
foreach ($event->getResults() as $eventResult) // получение данных после другого обработчика, если он был
{
if($eventResult->getType() == \Bitrix\Main\EventResult::ERROR)
continue;
}
if(!$id)
return;
if(intval($dishesIblockId=Option::get('grain.iiko','dishes_iblock_id_'.$restaurant['ID']))<=0)
return;
if(!$entity = \Bitrix\Iblock\Model\Section::compileEntityByIblock($dishesIblockId))
return;
$resultSection = $entity::getList(array(
'filter' => array(
'IBLOCK_ID' => $dishesIblockId,
'=ID' => $id,
),
'select' => array(
'ID',
'IBLOCK_ID',
'ACTIVE',
'UF_FORCE_HIDE',
),
'limit' => 1,
));
if(!$section=$resultSection->fetch())
return;
if(!$section['UF_FORCE_HIDE'] || $section['ACTIVE']!='Y')
return;
//\Bitrix\Iblock\SectionTable::update($id,array('ACTIVE'=>'N'));
$obSection = new \CIBlockSection;
$obSection->Update($id,array('ACTIVE'=>'N'),true,true,true);
}
}