public function addBreadcrumb()
	{
		/** @var Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface $objSessionBag */
		$objSessionBag = Contao\System::getContainer()->get('session')->getBag('contao_backend');

		// Set a new node
		if (isset($_GET['fn']))
		{
			// Check the path (thanks to Arnaud Buchoux)
			if (Contao\Validator::isInsecurePath(Contao\Input::get('fn', true)))
			{
				throw new RuntimeException('Insecure path ' . Contao\Input::get('fn', true));
			}

			$objSessionBag->set('tl_templates_node', Contao\Input::get('fn', true));
			$this->redirect(preg_replace('/(&|\?)fn=[^&]*/', '', Contao\Environment::get('request')));
		}

		$strNode = $objSessionBag->get('tl_templates_node');

		if ($strNode == '')
		{
			return;
		}

		// Check the path (thanks to Arnaud Buchoux)
		if (Contao\Validator::isInsecurePath($strNode))
		{
			throw new RuntimeException('Insecure path ' . $strNode);
		}

		$rootDir = Contao\System::getContainer()->getParameter('kernel.project_dir');

		// Currently selected folder does not exist
		if (!is_dir($rootDir . '/' . $strNode))
		{
			$objSessionBag->set('tl_templates_node', '');

			return;
		}

		$strPath = 'templates';
		$arrNodes = explode('/', preg_replace('/^templates\//', '', $strNode));
		$arrLinks = array();

		// Add root link
		$arrLinks[] = Contao\Image::getHtml('filemounts.svg') . ' <a href="' . $this->addToUrl('fn=') . '" title="'.Contao\StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['selectAllNodes']).'">' . $GLOBALS['TL_LANG']['MSC']['filterAll'] . '</a>';

		// Generate breadcrumb trail
		foreach ($arrNodes as $strFolder)
		{
			$strPath .= '/' . $strFolder;

			// No link for the active folder
			if ($strFolder == basename($strNode))
			{
				$arrLinks[] = Contao\Image::getHtml('folderC.svg') . ' ' . $strFolder;
			}
			else
			{
				$arrLinks[] = Contao\Image::getHtml('folderC.svg') . ' <a href="' . $this->addToUrl('fn='.$strPath) . '" title="'.Contao\StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['selectNode']).'">' . $strFolder . '</a>';
			}
		}

		// Limit tree
		$GLOBALS['TL_DCA']['tl_templates']['list']['sorting']['root'] = array($strNode);

		// Insert breadcrumb menu
		$GLOBALS['TL_DCA']['tl_templates']['list']['sorting']['breadcrumb'] .= '

<nav aria-label="' . $GLOBALS['TL_LANG']['MSC']['breadcrumbMenu'] . '">
  <ul id="tl_breadcrumb">
    <li>' . implode(' › </li><li>', $arrLinks) . '</li>
  </ul>
</nav>';
	}
public function addBreadcrumb()
	{
		
		$objSessionBag = Contao\System::getContainer()->get('session')->getBag('contao_backend');

		
		if (isset($_GET['fn']))
		{
			
			if (Contao\Validator::isInsecurePath(Contao\Input::get('fn', true)))
			{
				throw new RuntimeException('Insecure path ' . Contao\Input::get('fn', true));
			}

			$objSessionBag->set('tl_templates_node', Contao\Input::get('fn', true));
			$this->redirect(preg_replace('/(&|\?)fn=[^&]*/', '', Contao\Environment::get('request')));
		}

		$strNode = $objSessionBag->get('tl_templates_node');

		if ($strNode == '')
		{
			return;
		}

		
		if (Contao\Validator::isInsecurePath($strNode))
		{
			throw new RuntimeException('Insecure path ' . $strNode);
		}

		$rootDir = Contao\System::getContainer()->getParameter('kernel.project_dir');

		
		if (!is_dir($rootDir . '/' . $strNode))
		{
			$objSessionBag->set('tl_templates_node', '');

			return;
		}

		$strPath = 'templates';
		$arrNodes = explode('/', preg_replace('/^templates\
		$arrLinks = array();

		
		$arrLinks[] = Contao\Image::getHtml('filemounts.svg') . ' <a href="' . $this->addToUrl('fn=') . '" title="'.Contao\StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['selectAllNodes']).'">' . $GLOBALS['TL_LANG']['MSC']['filterAll'] . '</a>';

		
		foreach ($arrNodes as $strFolder)
		{
			$strPath .= '/' . $strFolder;

			
			if ($strFolder == basename($strNode))
			{
				$arrLinks[] = Contao\Image::getHtml('folderC.svg') . ' ' . $strFolder;
			}
			else
			{
				$arrLinks[] = Contao\Image::getHtml('folderC.svg') . ' <a href="' . $this->addToUrl('fn='.$strPath) . '" title="'.Contao\StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['selectNode']).'">' . $strFolder . '</a>';
			}
		}

		
		$GLOBALS['TL_DCA']['tl_templates']['list']['sorting']['root'] = array($strNode);

		
		$GLOBALS['TL_DCA']['tl_templates']['list']['sorting']['breadcrumb'] .= '

<nav aria-label="' . $GLOBALS['TL_LANG']['MSC']['breadcrumbMenu'] . '">
  <ul id="tl_breadcrumb">
    <li>' . implode(' › </li><li>', $arrLinks) . '</li>
  </ul>
</nav>';
	}
public function addBreadcrumb ( ) { /** @var Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface $objSessionBag */ $ objSessionBag = Contao \ System :: getContainer ( ) -> get ( 'session' ) -> getBag ( 'contao_backend' ) ; // Set a new node if ( isset ( $ _GET [ 'fn' ] ) ) { // Check the path (thanks to Arnaud Buchoux) if ( Contao \ Validator :: isInsecurePath ( Contao \ Input :: get ( 'fn' , true ) ) ) { throw new RuntimeException ( 'Insecure path ' . Contao \ Input :: get ( 'fn' , true ) ) ; } $ objSessionBag -> set ( 'tl_templates_node' , Contao \ Input :: get ( 'fn' , true ) ) ; $ this -> redirect ( preg_replace ( '/(&|\?)fn=[^&]*/' , '' , Contao \ Environment :: get ( 'request' ) ) ) ; } $ strNode = $ objSessionBag -> get ( 'tl_templates_node' ) ; if ( $ strNode == '' ) { return ; } // Check the path (thanks to Arnaud Buchoux) if ( Contao \ Validator :: isInsecurePath ( $ strNode ) ) { throw new RuntimeException ( 'Insecure path ' . $ strNode ) ; } $ rootDir = Contao \ System :: getContainer ( ) -> getParameter ( 'kernel.project_dir' ) ; // Currently selected folder does not exist if ( ! is_dir ( $ rootDir . '/' . $ strNode ) ) { $ objSessionBag -> set ( 'tl_templates_node' , '' ) ; return ; } $ strPath = 'templates' ; $ arrNodes = explode ( '/' , preg_replace ( '/^templates\//' , '' , $ strNode ) ) ; $ arrLinks = array ( ) ; // Add root link $ arrLinks [ ] = Contao \ Image :: getHtml ( 'filemounts.svg' ) . ' <a href="' . $ this -> addToUrl ( 'fn=' ) . '" title="' . Contao \ StringUtil :: specialchars ( $ GLOBALS [ 'TL_LANG' ] [ 'MSC' ] [ 'selectAllNodes' ] ) . '">' . $ GLOBALS [ 'TL_LANG' ] [ 'MSC' ] [ 'filterAll' ] . '</a>' ; // Generate breadcrumb trail foreach ( $ arrNodes as $ strFolder ) { $ strPath .= '/' . $ strFolder ; // No link for the active folder if ( $ strFolder == basename ( $ strNode ) ) { $ arrLinks [ ] = Contao \ Image :: getHtml ( 'folderC.svg' ) . ' ' . $ strFolder ; } else { $ arrLinks [ ] = Contao \ Image :: getHtml ( 'folderC.svg' ) . ' <a href="' . $ this -> addToUrl ( 'fn=' . $ strPath ) . '" title="' . Contao \ StringUtil :: specialchars ( $ GLOBALS [ 'TL_LANG' ] [ 'MSC' ] [ 'selectNode' ] ) . '">' . $ strFolder . '</a>' ; } } // Limit tree $ GLOBALS [ 'TL_DCA' ] [ 'tl_templates' ] [ 'list' ] [ 'sorting' ] [ 'root' ] = array ( $ strNode ) ; // Insert breadcrumb menu $ GLOBALS [ 'TL_DCA' ] [ 'tl_templates' ] [ 'list' ] [ 'sorting' ] [ 'breadcrumb' ] .= '

<nav aria-label="' . $ GLOBALS [ 'TL_LANG' ] [ 'MSC' ] [ 'breadcrumbMenu' ] . '">
  <ul id="tl_breadcrumb">
    <li>' . implode ( ' › </li><li>',  $ r rLinks)  . ' /li>
  </ul>
</nav>' ; }
Add the breadcrumb menu

@throws RuntimeException
Add the breadcrumb menu