• Модуль: landing
  • Путь к файлу: ~/bitrix/modules/landing/lib/subtype/menu.php
  • Класс: BitrixLandingSubtypeMenu
  • Вызов: Menu::prepareManifest
static function prepareManifest(array $manifest, BitrixLandingBlock $block = null, array $params = []): array
{
	// add attrs to work TWO MENUS together
	if (!isset($manifest['attrs']) || !is_array($manifest['attrs']))
	{
		$manifest['attrs'] = array();
	}
	if (!isset($manifest['attrs']['.navbar-collapse']))
	{
		$manifest['attrs']['.navbar-collapse'] = array(
			array(
				'hidden' => true,
				'attribute' => 'id',
			),
		);
	}
	if (!isset($manifest['attrs']['button.navbar-toggler']))
	{
		$manifest['attrs']['button.navbar-toggler'] = array(
			array(
				'hidden' => true,
				'attribute' => 'aria-controls',
			),
			array(
				'hidden' => true,
				'attribute' => 'data-target',
			),
		);
	}
	
	// add callbacks
	$manifest['callbacks'] = array(
		'afterAdd' => function (BitrixLandingBlock &$block) use($params)
		{
			$manifest = $block->getManifest();
			$needSave = false;

			// autogenerate MENU
			// predefine params
			if (isset($params['selector']))
			{
				$selector = $params['selector'];
			}
			else
			{
				$selector = '.landing-block-node-menu-list-item-link';
			}
			$count = isset($params['count']) ? $params['count'] : 5;
			$source = isset($params['source']) ? $params['source'] : null;

			// new menu items
			$menuItems = array();

			if (isset($manifest['nodes'][$selector]))
			{
				// fill menu
				if ($source == 'catalog')
				{
					$site = $block->getSite();
					if ($site['TYPE'] == 'STORE')
					{
						$menuItems = self::getCatalogMenu(
							$block->getSiteId(),
							$count
						);
					}
				}
				else if ($source == 'personal')
				{
					$menuItems = self::getPersonalMenu();
				}
				
				// save new items
				if (!empty($menuItems))
				{
					$block->updateNodes(array(
						$selector => $menuItems
					));
					$needSave = true;
				}
			}
			else if ($source == 'structure')
			{
				// after add immediately
				BitrixLandingSubtypeMenu::redrawStructureMenu($block);
				// after site creating if it is processing now
				$eventManager = BitrixMainEventManager::getInstance();
				$eventManager->addEventHandler('landing', 'onAfterDemoCreate',
					function(BitrixMainEvent $event) use($block)
					{
						BitrixLandingSubtypeMenu::redrawStructureMenu($block);
					}
				);
			}

			// to work TWO MENUS together
			// todo: check in manifest
			$navbarCollapseSection = $params['navbarCollapseSection'] ?? '.navbar-collapse';
			$navbarTogglerButton = $params['navbarTogglerButton'] ?? 'button.navbar-toggler';
			
			if (
				isset($manifest['attrs'][$navbarCollapseSection])
				&& isset($manifest['attrs'][$navbarTogglerButton])
			)
			{
				$newId = 'navBar' . $block->getId();
				$block->setAttributes(array(
					$navbarCollapseSection => array('id' => $newId),
					$navbarTogglerButton => array(
						'aria-controls' => $newId,
						'data-target' => '#' . $newId,
					),
				));
				$needSave = true;
			}
			
			// SAVE
			if($needSave)
			{
				$block->save();
			}
		},
	);

	return $manifest;
}