Установка корневой группы для выгрузки блюд из iiko

Модуль расширенного управления меню для битрикс

Ноябрь 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']))>&& !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);
    }
}

См. также:

← Переход к списку