• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/lib/binding/menu.php
  • Класс: BitrixIntranetBindingis
  • Вызов: is::getBindings
static function getBindings()
{
	$map = self::getMap();

	// local bindings, from another modules
	$event = new Event('intranet', 'onBuildBindingMenu', []);
	$event->send();
	foreach ($event->getResults() as $result)
	{
		if ($result->getType() != EventResult::ERROR)
		{
			$places = $result->getParameters();
			if (is_array($places))
			{
				foreach ($places as $place)
				{
					// validate necessary keys
					if (
						!isset($place['items']) ||
						!isset($place['bindings'])
					)
					{
						continue;
					}
					$items = self::getValidItems($place['items']);
					$bindings = self::getValidBindings($place['bindings']);
					// fill map with items
					if ($items && $bindings)
					{
						foreach ($bindings as $bindingCode => $binding)
						{
							foreach ($map[$bindingCode]['items'] as $itemsCode => &$menu)
							{
								if (
									(
										!$binding['include'] ||
										in_array($itemsCode, $binding['include'])
									)
									&&
									(
										!in_array($itemsCode, $binding['exclude'])
									)
								)
								{
									$menu = array_merge($menu, $items);
								}
							}
							unset($menu);
						}
					}
				}
			}
		}
	}

	// rest bindings
	if (BitrixMainLoader::includeModule('rest'))
	{
		$menuSectionCode = self::SECTIONS['marketplace'];
		$groups = [];// array for group items position storage
		$res = BitrixRestPlacementTable::getList([
			'select' => [
				'ID',
				'APP_ID',
				'PLACEMENT',
				'TITLE',
				'APP_NAME' => 'REST_APP.APP_NAME',
				'GROUP_NAME',
				'LANG_ALL',
			],
			'filter' => [
				'=PLACEMENT' => array_keys(static::getRestPlacementMap())
			],
			'order' => [
				'ID' => 'desc'
			]
		]);
		foreach ($res->fetchCollection() as $row)
		{
			if (!isset(static::getRestPlacementMap()[$row->getPlacement()]))
			{
				continue;
			}

			$placementLang = [];
			$placementLangAll = [];
			if (!is_null($row->getLangAll()))
			{
				foreach ($row->getLangAll() as $lang)
				{
					if (trim($lang->getTitle()))
					{
						$placementLangAll[$lang->getLanguageId()] = [
							'TITLE' => trim($lang->getTitle()),
							'GROUP_NAME' => $lang->getGroupName(),
						];
					}
				}
			}
			if (!empty($placementLangAll))
			{
				$langList = BitrixRestLang::listLanguage();
				foreach ($langList as $lang)
				{
					if ($placementLangAll[$lang])
					{
						$placementLang = $placementLangAll[$lang];
						break;
					}
				}
				if (!$placementLang['TITLE'])
				{
					$placementLang = reset($placementLangAll);
				}
			}
			elseif ($row->getRestApp())
			{
				$placementLang['TITLE'] = $row->getRestApp()->getAppName();
			}

			if (!trim($placementLang['TITLE']))
			{
				$placementLang['TITLE'] = BitrixRestPlacementTable::getDefaultTitle($row->getId());
			}

			[$bindingCode, $menuCode] = explode('@', static::getRestPlacementMap()[$row->getPlacement()]);
			$bindingCode = mb_strtolower($bindingCode);
			$menuCode = mb_strtolower($menuCode);
			if (isset($map[$bindingCode]['items'][$menuCode]))
			{
				self::$needProvider = true;
				$oneItem = [
					'id' => 'rest_' . $row->getId(),
					'system' => false,
					'text' => htmlspecialcharsbx($placementLang['TITLE']),
					'sort' => 500,
					'sectionCode' => $menuSectionCode,
					'linkProvider' => 'marketplace',
					'params' => [
						'app_id' => $row->getAppId(),
						'placement_id' => $row->getId(),
						'placement' => $row->getPlacement(),
					]
				];
				if ($placementLang['GROUP_NAME'])
				{
					$groupingKey = $row->getPlacement() . '_' . $placementLang['GROUP_NAME'];
					if (isset($groups[$groupingKey]))
					{
						$i = $groups[$groupingKey];
						$map[$bindingCode]['items'][$menuCode][$i]['items'][] = $oneItem;
					}
					else
					{
						$map[$bindingCode]['items'][$menuCode][] = [
							'text' => $placementLang['GROUP_NAME'],
							'sort' => 500,
							'sectionCode' => $menuSectionCode,
							'items' => [
								$oneItem
							]
						];
						$groups[$groupingKey] = count($map[$bindingCode]['items'][$menuCode]) - 1;
					}
				}
				else
				{
					$map[$bindingCode]['items'][$menuCode][] = $oneItem;
				}
			}
		}
	}

	return $map;
}