Изменение ограничений по городам при подсказках адреса

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

Март 12, 2026

Теги: Модули grain, Интеграция с iiko

Изменение списка городов при получении подсказки адреса в модуле Интеграция с iiko.

Работает с версии модуля 6.0.0. Используется событие "OnAddressSuggest".


<?php

namespace Partner;

\Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'grain.iiko'
    
'OnAddressSuggest'
    
'\Partner\CitySuggest::onAddressSuggest'
); 

class 
CitySuggest
{
    public static function 
onAddressSuggest(\Bitrix\Main\Event $event
    {
        
$q $event->getParameter('Q'); // поисковый запрос
        
$siteId $event->getParameter('SITE_ID'); // ID сайта
        
$restaurant $event->getParameter('RESTAURANT'); // массив ресторана
        
$cities $event->getParameter('CITIES'); // массив городов 
        
$limit $event->getParameter('LIMIT'); // ограничение количества для поиска
        
        
foreach ($event->getResults() as $eventResult// получение данных после другого обработчика, если он был
        
{
            if(
$eventResult->getType() == \Bitrix\Main\EventResult::ERROR)
                continue;
            if(
$eventResult->getParameters())
            {
                
$parameters $eventResult->getParameters();
                if(isset(
$parameters['CITIES']))
                    
$cities $parameters['CITIES'];
            }
        }
        
        
$citiesBySites = [
            
's2' => ['Рязань'],
            
's3' => ['Тула'],
            
's4' => ['Воронеж'],
        ];
        
        if(!isset(
$citiesBySites[$siteId]))
            return;
    
        
$tmp $cities;
        
$cities = [];
        foreach(
$tmp as $city)
            if(
in_array($city['NAME'],$citiesBySites[$siteId]))
                
$cities[] = $city;
    
        
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['CITIES'=>$cities]);
        return 
$result;
    }
}

То же, но в качестве привязки городов используется свойство "cities" инфоблока ресторанов:


<?php

namespace Partner;

\Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'grain.iiko'
    
'OnAddressSuggest'
    
'\Partner\CitySuggest::onAddressSuggest'
); 

class 
CitySuggest
{
    public static function 
onAddressSuggest(\Bitrix\Main\Event $event
    {
        
$q $event->getParameter('Q'); // поисковый запрос
        
$siteId $event->getParameter('SITE_ID'); // ID сайта
        
$restaurant $event->getParameter('RESTAURANT'); // массив ресторана
        
$cities $event->getParameter('CITIES'); // массив городов 
        
$limit $event->getParameter('LIMIT'); // ограничение количества для поиска
        
        
foreach ($event->getResults() as $eventResult// получение данных после другого обработчика, если он был
        
{
            if(
$eventResult->getType() == \Bitrix\Main\EventResult::ERROR)
                continue;
            if(
$eventResult->getParameters())
            {
                
$parameters $eventResult->getParameters();
                if(isset(
$parameters['CITIES']))
                    
$cities $parameters['CITIES'];
            }
        }
        
        
$restaurantsIblockId = (int)\Bitrix\Main\Config\Option::get('grain.iiko','restaurants_iblock_id');    
        
$propertyResult \CIBlockElement::GetProperty($restaurantsIblockId,(int)$restaurant['ID'],Array(),Array("CODE"=>"cities"));
        while(
$propertyValue=$propertyResult->fetch()) 
        {
            if(!
$propertyValue['VALUE'])
                continue;
            
$allowedCityId[] = $propertyValue['VALUE'];
        }
        
        
$tmp $cities;
        
$cities = [];
        foreach(
$tmp as $city)
            if(
in_array($city['CITY_ID'],$allowedCityId))
                
$cities[] = $city;
    
        
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['CITIES'=>$cities]);
        return 
$result;
    }
}

Если нужно более тонко поменять ограничения поиска для dadata, например, добавить какой-то район в области от близлежащего города, в не просто изменить список городов (используется событие уже непосредственно для dadata, а не общее событие):


<?php

namespace Partner;

\Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'grain.iiko'
    
'OnAddressSuggestDadata'
    
'\Partner\CitySuggest::onAddressSuggestDadata'
); 

class 
CitySuggest
{    
    public static function 
onAddressSuggestDadata(\Bitrix\Main\Event $event
    {
        
$siteId $event->getParameter('SITE_ID'); // ID сайта
        
$restaurant $event->getParameter('RESTAURANT'); // массив ресторана
        
$cities $event->getParameter('CITIES'); // массив городов 
        
$body $event->getParameter('BODY'); // тело запроса
        
$header $event->getParameter('HEADER'); // заголовки запроса
        
        
foreach ($event->getResults() as $eventResult// получение данных после другого обработчика, если он был
        
{
            if(
$eventResult->getType() == \Bitrix\Main\EventResult::ERROR)
                continue;
            if(
$eventResult->getParameters())
            {
                
$parameters $eventResult->getParameters();
                if(isset(
$parameters['BODY']))
                    
$body $parameters['BODY'];
                if(isset(
$parameters['HEADER']))
                    
$header $parameters['HEADER'];
                if(isset(
$parameters['RETURN']))
                    
$return $parameters['RETURN'];
            }
        }
        
        if(!
is_array($body) || !is_array($body['locations']))
            return;
            
        switch(
$restaurant['ID'])
        {
            case 
'1172'// Тула
            
case '5631'// Тула
                
$body['locations'][] = [
                    
"region" => "Тульская",
                    
"settlement" => "Петровский"// поселок
                
];
                break;
        }
        
        
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['BODY'=>$body]);
        return 
$result;
    }

}
Интеграция с iiko и rkeeper, готовый сайт ресторана

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