Март 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;
}
}