public function navigation($blnShowAll=false)
	{
		/** @var AttributeBagInterface $objSessionBag */
		$objSessionBag = System::getContainer()->get('session')->getBag('contao_backend');

		/** @var RouterInterface $router */
		$router = System::getContainer()->get('router');

		$arrModules = array();
		$session = $objSessionBag->all();

		// Toggle nodes
		if (Input::get('mtg'))
		{
			$session['backend_modules'][Input::get('mtg')] = (isset($session['backend_modules'][Input::get('mtg')]) && $session['backend_modules'][Input::get('mtg')] == 0) ? 1 : 0;
			$objSessionBag->replace($session);
			Controller::redirect(preg_replace('/(&(amp;)?|\?)mtg=[^& ]*/i', '', Environment::get('request')));
		}

		$strRefererId = System::getContainer()->get('request_stack')->getCurrentRequest()->attributes->get('_contao_referer_id');

		foreach ($GLOBALS['BE_MOD'] as $strGroupName=>$arrGroupModules)
		{
			if (!empty($arrGroupModules) && ($strGroupName == 'system' || $this->hasAccess(array_keys($arrGroupModules), 'modules')))
			{
				$arrModules[$strGroupName]['class'] = ' node-expanded';
				$arrModules[$strGroupName]['title'] = StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['collapseNode']);
				$arrModules[$strGroupName]['label'] = (($label = \is_array($GLOBALS['TL_LANG']['MOD'][$strGroupName]) ? $GLOBALS['TL_LANG']['MOD'][$strGroupName][0] : $GLOBALS['TL_LANG']['MOD'][$strGroupName]) != false) ? $label : $strGroupName;
				$arrModules[$strGroupName]['href'] = $router->generate('contao_backend', array('do'=>Input::get('do'), 'mtg'=>$strGroupName, 'ref'=>$strRefererId));
				$arrModules[$strGroupName]['ajaxUrl'] = $router->generate('contao_backend');
				$arrModules[$strGroupName]['icon'] = 'modPlus.gif'; // backwards compatibility with e.g. EasyThemes

				foreach ($arrGroupModules as $strModuleName=>$arrModuleConfig)
				{
					// Check access
					$blnAccess = (isset($arrModuleConfig['disablePermissionChecks']) && $arrModuleConfig['disablePermissionChecks'] === true) || $this->hasAccess($strModuleName, 'modules');
					$blnHide = isset($arrModuleConfig['hideInNavigation']) && $arrModuleConfig['hideInNavigation'] === true;

					if ($blnAccess && !$blnHide)
					{
						$arrModules[$strGroupName]['modules'][$strModuleName] = $arrModuleConfig;
						$arrModules[$strGroupName]['modules'][$strModuleName]['title'] = StringUtil::specialchars($GLOBALS['TL_LANG']['MOD'][$strModuleName][1]);
						$arrModules[$strGroupName]['modules'][$strModuleName]['label'] = (($label = \is_array($GLOBALS['TL_LANG']['MOD'][$strModuleName]) ? $GLOBALS['TL_LANG']['MOD'][$strModuleName][0] : $GLOBALS['TL_LANG']['MOD'][$strModuleName]) != false) ? $label : $strModuleName;
						$arrModules[$strGroupName]['modules'][$strModuleName]['class'] = 'navigation ' . $strModuleName;
						$arrModules[$strGroupName]['modules'][$strModuleName]['href'] = $router->generate('contao_backend', array('do'=>$strModuleName, 'ref'=>$strRefererId));
						$arrModules[$strGroupName]['modules'][$strModuleName]['isActive'] = false;
					}
				}
			}
		}

		// HOOK: add custom logic
		if (isset($GLOBALS['TL_HOOKS']['getUserNavigation']) && \is_array($GLOBALS['TL_HOOKS']['getUserNavigation']))
		{
			foreach ($GLOBALS['TL_HOOKS']['getUserNavigation'] as $callback)
			{
				$this->import($callback[0]);
				$arrModules = $this->{$callback[0]}->{$callback[1]}($arrModules, true);
			}
		}

		foreach ($arrModules as $strGroupName => $arrGroupModules)
		{
			$arrModules[$strGroupName]['isClosed'] = false;

			// Do not show the modules if the group is closed
			if (!$blnShowAll && isset($session['backend_modules'][$strGroupName]) && $session['backend_modules'][$strGroupName] < 1)
			{
				$arrModules[$strGroupName]['class'] = str_replace('node-expanded', '', $arrModules[$strGroupName]['class']) . ' node-collapsed';
				$arrModules[$strGroupName]['title'] = StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['expandNode']);
				$arrModules[$strGroupName]['isClosed'] = true;
			}

			if (isset($arrGroupModules['modules']) && \is_array($arrGroupModules['modules']))
			{
				foreach ($arrGroupModules['modules'] as $strModuleName => $arrModuleConfig)
				{
					// Mark the active module and its group
					if (Input::get('do') == $strModuleName)
					{
						$arrModules[$strGroupName]['class'] .= ' trail';
						$arrModules[$strGroupName]['modules'][$strModuleName]['isActive'] = true;
					}
				}
			}
		}

		return $arrModules;
	}
public function navigation($blnShowAll=false)
	{
		
		$objSessionBag = System::getContainer()->get('session')->getBag('contao_backend');

		
		$router = System::getContainer()->get('router');

		$arrModules = array();
		$session = $objSessionBag->all();

		
		if (Input::get('mtg'))
		{
			$session['backend_modules'][Input::get('mtg')] = (isset($session['backend_modules'][Input::get('mtg')]) && $session['backend_modules'][Input::get('mtg')] == 0) ? 1 : 0;
			$objSessionBag->replace($session);
			Controller::redirect(preg_replace('/(&(amp;)?|\?)mtg=[^& ]*/i', '', Environment::get('request')));
		}

		$strRefererId = System::getContainer()->get('request_stack')->getCurrentRequest()->attributes->get('_contao_referer_id');

		foreach ($GLOBALS['BE_MOD'] as $strGroupName=>$arrGroupModules)
		{
			if (!empty($arrGroupModules) && ($strGroupName == 'system' || $this->hasAccess(array_keys($arrGroupModules), 'modules')))
			{
				$arrModules[$strGroupName]['class'] = ' node-expanded';
				$arrModules[$strGroupName]['title'] = StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['collapseNode']);
				$arrModules[$strGroupName]['label'] = (($label = \is_array($GLOBALS['TL_LANG']['MOD'][$strGroupName]) ? $GLOBALS['TL_LANG']['MOD'][$strGroupName][0] : $GLOBALS['TL_LANG']['MOD'][$strGroupName]) != false) ? $label : $strGroupName;
				$arrModules[$strGroupName]['href'] = $router->generate('contao_backend', array('do'=>Input::get('do'), 'mtg'=>$strGroupName, 'ref'=>$strRefererId));
				$arrModules[$strGroupName]['ajaxUrl'] = $router->generate('contao_backend');
				$arrModules[$strGroupName]['icon'] = 'modPlus.gif'; 

				foreach ($arrGroupModules as $strModuleName=>$arrModuleConfig)
				{
					
					$blnAccess = (isset($arrModuleConfig['disablePermissionChecks']) && $arrModuleConfig['disablePermissionChecks'] === true) || $this->hasAccess($strModuleName, 'modules');
					$blnHide = isset($arrModuleConfig['hideInNavigation']) && $arrModuleConfig['hideInNavigation'] === true;

					if ($blnAccess && !$blnHide)
					{
						$arrModules[$strGroupName]['modules'][$strModuleName] = $arrModuleConfig;
						$arrModules[$strGroupName]['modules'][$strModuleName]['title'] = StringUtil::specialchars($GLOBALS['TL_LANG']['MOD'][$strModuleName][1]);
						$arrModules[$strGroupName]['modules'][$strModuleName]['label'] = (($label = \is_array($GLOBALS['TL_LANG']['MOD'][$strModuleName]) ? $GLOBALS['TL_LANG']['MOD'][$strModuleName][0] : $GLOBALS['TL_LANG']['MOD'][$strModuleName]) != false) ? $label : $strModuleName;
						$arrModules[$strGroupName]['modules'][$strModuleName]['class'] = 'navigation ' . $strModuleName;
						$arrModules[$strGroupName]['modules'][$strModuleName]['href'] = $router->generate('contao_backend', array('do'=>$strModuleName, 'ref'=>$strRefererId));
						$arrModules[$strGroupName]['modules'][$strModuleName]['isActive'] = false;
					}
				}
			}
		}

		
		if (isset($GLOBALS['TL_HOOKS']['getUserNavigation']) && \is_array($GLOBALS['TL_HOOKS']['getUserNavigation']))
		{
			foreach ($GLOBALS['TL_HOOKS']['getUserNavigation'] as $callback)
			{
				$this->import($callback[0]);
				$arrModules = $this->{$callback[0]}->{$callback[1]}($arrModules, true);
			}
		}

		foreach ($arrModules as $strGroupName => $arrGroupModules)
		{
			$arrModules[$strGroupName]['isClosed'] = false;

			
			if (!$blnShowAll && isset($session['backend_modules'][$strGroupName]) && $session['backend_modules'][$strGroupName] < 1)
			{
				$arrModules[$strGroupName]['class'] = str_replace('node-expanded', '', $arrModules[$strGroupName]['class']) . ' node-collapsed';
				$arrModules[$strGroupName]['title'] = StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['expandNode']);
				$arrModules[$strGroupName]['isClosed'] = true;
			}

			if (isset($arrGroupModules['modules']) && \is_array($arrGroupModules['modules']))
			{
				foreach ($arrGroupModules['modules'] as $strModuleName => $arrModuleConfig)
				{
					
					if (Input::get('do') == $strModuleName)
					{
						$arrModules[$strGroupName]['class'] .= ' trail';
						$arrModules[$strGroupName]['modules'][$strModuleName]['isActive'] = true;
					}
				}
			}
		}

		return $arrModules;
	}
public function navigation ( $ blnShowAll = false ) { /** @var AttributeBagInterface $objSessionBag */ $ objSessionBag = System :: getContainer ( ) -> get ( 'session' ) -> getBag ( 'contao_backend' ) ; /** @var RouterInterface $router */ $ router = System :: getContainer ( ) -> get ( 'router' ) ; $ arrModules = array ( ) ; $ session = $ objSessionBag -> all ( ) ; // Toggle nodes if ( Input :: get ( 'mtg' ) ) { $ session [ 'backend_modules' ] [ Input :: get ( 'mtg' ) ] = ( isset ( $ session [ 'backend_modules' ] [ Input :: get ( 'mtg' ) ] ) && $ session [ 'backend_modules' ] [ Input :: get ( 'mtg' ) ] == 0 ) ? 1 : 0 ; $ objSessionBag -> replace ( $ session ) ; Controller :: redirect ( preg_replace ( '/(&(amp;)?|\?)mtg=[^& ]*/i' , '' , Environment :: get ( 'request' ) ) ) ; } $ strRefererId = System :: getContainer ( ) -> get ( 'request_stack' ) -> getCurrentRequest ( ) -> attributes -> get ( '_contao_referer_id' ) ; foreach ( $ GLOBALS [ 'BE_MOD' ] as $ strGroupName => $ arrGroupModules ) { if ( ! empty ( $ arrGroupModules ) && ( $ strGroupName == 'system' || $ this -> hasAccess ( array_keys ( $ arrGroupModules ) , 'modules' ) ) ) { $ arrModules [ $ strGroupName ] [ 'class' ] = ' node-expanded' ; $ arrModules [ $ strGroupName ] [ 'title' ] = StringUtil :: specialchars ( $ GLOBALS [ 'TL_LANG' ] [ 'MSC' ] [ 'collapseNode' ] ) ; $ arrModules [ $ strGroupName ] [ 'label' ] = ( ( $ label = \ is_array ( $ GLOBALS [ 'TL_LANG' ] [ 'MOD' ] [ $ strGroupName ] ) ? $ GLOBALS [ 'TL_LANG' ] [ 'MOD' ] [ $ strGroupName ] [ 0 ] : $ GLOBALS [ 'TL_LANG' ] [ 'MOD' ] [ $ strGroupName ] ) != false ) ? $ label : $ strGroupName ; $ arrModules [ $ strGroupName ] [ 'href' ] = $ router -> generate ( 'contao_backend' , array ( 'do' => Input :: get ( 'do' ) , 'mtg' => $ strGroupName , 'ref' => $ strRefererId ) ) ; $ arrModules [ $ strGroupName ] [ 'ajaxUrl' ] = $ router -> generate ( 'contao_backend' ) ; $ arrModules [ $ strGroupName ] [ 'icon' ] = 'modPlus.gif' ; // backwards compatibility with e.g. EasyThemes foreach ( $ arrGroupModules as $ strModuleName => $ arrModuleConfig ) { // Check access $ blnAccess = ( isset ( $ arrModuleConfig [ 'disablePermissionChecks' ] ) && $ arrModuleConfig [ 'disablePermissionChecks' ] === true ) || $ this -> hasAccess ( $ strModuleName , 'modules' ) ; $ blnHide = isset ( $ arrModuleConfig [ 'hideInNavigation' ] ) && $ arrModuleConfig [ 'hideInNavigation' ] === true ; if ( $ blnAccess && ! $ blnHide ) { $ arrModules [ $ strGroupName ] [ 'modules' ] [ $ strModuleName ] = $ arrModuleConfig ; $ arrModules [ $ strGroupName ] [ 'modules' ] [ $ strModuleName ] [ 'title' ] = StringUtil :: specialchars ( $ GLOBALS [ 'TL_LANG' ] [ 'MOD' ] [ $ strModuleName ] [ 1 ] ) ; $ arrModules [ $ strGroupName ] [ 'modules' ] [ $ strModuleName ] [ 'label' ] = ( ( $ label = \ is_array ( $ GLOBALS [ 'TL_LANG' ] [ 'MOD' ] [ $ strModuleName ] ) ? $ GLOBALS [ 'TL_LANG' ] [ 'MOD' ] [ $ strModuleName ] [ 0 ] : $ GLOBALS [ 'TL_LANG' ] [ 'MOD' ] [ $ strModuleName ] ) != false ) ? $ label : $ strModuleName ; $ arrModules [ $ strGroupName ] [ 'modules' ] [ $ strModuleName ] [ 'class' ] = 'navigation ' . $ strModuleName ; $ arrModules [ $ strGroupName ] [ 'modules' ] [ $ strModuleName ] [ 'href' ] = $ router -> generate ( 'contao_backend' , array ( 'do' => $ strModuleName , 'ref' => $ strRefererId ) ) ; $ arrModules [ $ strGroupName ] [ 'modules' ] [ $ strModuleName ] [ 'isActive' ] = false ; } } } } // HOOK: add custom logic if ( isset ( $ GLOBALS [ 'TL_HOOKS' ] [ 'getUserNavigation' ] ) && \ is_array ( $ GLOBALS [ 'TL_HOOKS' ] [ 'getUserNavigation' ] ) ) { foreach ( $ GLOBALS [ 'TL_HOOKS' ] [ 'getUserNavigation' ] as $ callback ) { $ this -> import ( $ callback [ 0 ] ) ; $ arrModules = $ this -> { $ callback [ 0 ] } -> { $ callback [ 1 ] } ( $ arrModules , true ) ; } } foreach ( $ arrModules as $ strGroupName => $ arrGroupModules ) { $ arrModules [ $ strGroupName ] [ 'isClosed' ] = false ; // Do not show the modules if the group is closed if ( ! $ blnShowAll && isset ( $ session [ 'backend_modules' ] [ $ strGroupName ] ) && $ session [ 'backend_modules' ] [ $ strGroupName ] < 1 ) { $ arrModules [ $ strGroupName ] [ 'class' ] = str_replace ( 'node-expanded' , '' , $ arrModules [ $ strGroupName ] [ 'class' ] ) . ' node-collapsed' ; $ arrModules [ $ strGroupName ] [ 'title' ] = StringUtil :: specialchars ( $ GLOBALS [ 'TL_LANG' ] [ 'MSC' ] [ 'expandNode' ] ) ; $ arrModules [ $ strGroupName ] [ 'isClosed' ] = true ; } if ( isset ( $ arrGroupModules [ 'modules' ] ) && \ is_array ( $ arrGroupModules [ 'modules' ] ) ) { foreach ( $ arrGroupModules [ 'modules' ] as $ strModuleName => $ arrModuleConfig ) { // Mark the active module and its group if ( Input :: get ( 'do' ) == $ strModuleName ) { $ arrModules [ $ strGroupName ] [ 'class' ] .= ' trail' ; $ arrModules [ $ strGroupName ] [ 'modules' ] [ $ strModuleName ] [ 'isActive' ] = true ; } } } } return $ arrModules ; }
Generate the navigation menu and return it as array

@param boolean $blnShowAll

@return array
Generate the navigation menu and return it as array