• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/lib/UI/LeftMenu/Preset/PresetAbstract.php
  • Класс: BitrixIntranetUILeftMenuPresetPresetAbstract
  • Вызов: PresetAbstract::oldToNewStructure
static function oldToNewStructure(array $oldData, array $newData): array
{
	$data = [
		'shown' => isset($oldData['show']) && is_array($oldData['show']) ? $oldData['show'] : [],
		'hidden' => isset($oldData['hide']) && is_array($oldData['hide']) ? $oldData['hide'] : []
	];

	$result = ['shown' => [], 'hidden' => []];
	$systemGroups = [];
	$replaceItems = [
		'menu_live_feed' => 'menu_teamwork',
		'menu_marketplace_sect' => 'menu_marketplace_group'
	];
	foreach ($result as $visibility => $items)
	{
		foreach ($data[$visibility] as $itemId)
		{
			if (array_key_exists($itemId, $replaceItems))
			{
				$groupId = $replaceItems[$itemId];
				$expectedStructure = null;
				foreach ($newData as $structureContent)
				{
					if (is_array($structureContent) && array_key_exists($groupId , $structureContent))
					{
						$expectedStructure = $structureContent[$groupId];
						break;
					}
				}
				if ($expectedStructure !== null)
				{
					$result[$visibility][$groupId] = [$itemId];
					$systemGroups[$groupId] = [$visibility, $expectedStructure];
				}
				continue;
			}

			$result[$visibility][] = $itemId;
		}
	}

	foreach ($systemGroups as $groupId => [$visibility, $expectedStructure])
	{
		$menu = &$result[$visibility];
		$foundItems = array_intersect($menu, $expectedStructure);
		$menu[$groupId] = array_merge(
			$menu[$groupId],
			array_values($foundItems)
		);
		$notFoundItems = array_diff($expectedStructure, $menu[$groupId]);
		if ($visibility === 'shown')
		{
			$notFoundItems = array_diff($notFoundItems,
				array_intersect($result['hidden'], $expectedStructure)
			);
			$menu[$groupId] = array_merge(
				$menu[$groupId],
				array_values($notFoundItems)
			);
		}
		$result[$visibility] = array_diff($menu, $menu[$groupId]);
		unset($menu);
	}
	return ['shown' => $result['shown'], 'hidden' => $result['hidden']];
}