public static function replaceDynamicScriptTags($strBuffer)
	{
		// HOOK: add custom logic
		if (isset($GLOBALS['TL_HOOKS']['replaceDynamicScriptTags']) && \is_array($GLOBALS['TL_HOOKS']['replaceDynamicScriptTags']))
		{
			foreach ($GLOBALS['TL_HOOKS']['replaceDynamicScriptTags'] as $callback)
			{
				$strBuffer = static::importStatic($callback[0])->{$callback[1]}($strBuffer);
			}
		}

		$arrReplace = array();
		$strScripts = '';

		// Add the internal jQuery scripts
		if (!empty($GLOBALS['TL_JQUERY']) && \is_array($GLOBALS['TL_JQUERY']))
		{
			foreach (array_unique($GLOBALS['TL_JQUERY']) as $script)
			{
				$strScripts .= $script;
			}
		}

		$arrReplace['[[TL_JQUERY]]'] = $strScripts;
		$strScripts = '';

		// Add the internal MooTools scripts
		if (!empty($GLOBALS['TL_MOOTOOLS']) && \is_array($GLOBALS['TL_MOOTOOLS']))
		{
			foreach (array_unique($GLOBALS['TL_MOOTOOLS']) as $script)
			{
				$strScripts .= $script;
			}
		}

		$arrReplace['[[TL_MOOTOOLS]]'] = $strScripts;
		$strScripts = '';

		// Add the internal <body> tags
		if (!empty($GLOBALS['TL_BODY']) && \is_array($GLOBALS['TL_BODY']))
		{
			foreach (array_unique($GLOBALS['TL_BODY']) as $script)
			{
				$strScripts .= $script;
			}
		}

		// FE preview support
		if (System::getContainer()->get('contao.security.token_checker')->hasBackendUser())
		{
			$strScripts .= "
<script>
  (function(win) {
    if (!win.parent || typeof(win.parent.postMessage) !== 'function') {
      return;
    }
    win.parent.postMessage({
      'contao.preview': {
        'title': win.document.title,
        'uri': win.location.href
      }}, win.location.origin);
  })(window);
</script>";
		}

		global $objPage;

		$objLayout = LayoutModel::findByPk($objPage->layoutId);
		$blnCombineScripts = ($objLayout === null) ? false : $objLayout->combineScripts;

		$arrReplace['[[TL_BODY]]'] = $strScripts;
		$strScripts = '';

		$objCombiner = new Combiner();

		// Add the CSS framework style sheets
		if (!empty($GLOBALS['TL_FRAMEWORK_CSS']) && \is_array($GLOBALS['TL_FRAMEWORK_CSS']))
		{
			foreach (array_unique($GLOBALS['TL_FRAMEWORK_CSS']) as $stylesheet)
			{
				$objCombiner->add($stylesheet);
			}
		}

		// Add the internal style sheets
		if (!empty($GLOBALS['TL_CSS']) && \is_array($GLOBALS['TL_CSS']))
		{
			foreach (array_unique($GLOBALS['TL_CSS']) as $stylesheet)
			{
				$options = StringUtil::resolveFlaggedUrl($stylesheet);

				if ($options->static)
				{
					$objCombiner->add($stylesheet, $options->mtime, $options->media);
				}
				else
				{
					$strScripts .= Template::generateStyleTag(static::addAssetsUrlTo($stylesheet), $options->media, $options->mtime);
				}
			}
		}

		// Add the user style sheets
		if (!empty($GLOBALS['TL_USER_CSS']) && \is_array($GLOBALS['TL_USER_CSS']))
		{
			foreach (array_unique($GLOBALS['TL_USER_CSS']) as $stylesheet)
			{
				$options = StringUtil::resolveFlaggedUrl($stylesheet);

				if ($options->static)
				{
					$objCombiner->add($stylesheet, $options->mtime, $options->media);
				}
				else
				{
					$strScripts .= Template::generateStyleTag(static::addAssetsUrlTo($stylesheet), $options->media, $options->mtime);
				}
			}
		}

		// Create the aggregated style sheet
		if ($objCombiner->hasEntries())
		{
			if ($blnCombineScripts)
			{
				$strScripts .= Template::generateStyleTag($objCombiner->getCombinedFile(), 'all');
			}
			else
			{
				foreach ($objCombiner->getFileUrls() as $strUrl)
				{
					$options = StringUtil::resolveFlaggedUrl($strUrl);
					$strScripts .= Template::generateStyleTag($strUrl, $options->media, $options->mtime);
				}
			}
		}

		$arrReplace['[[TL_CSS]]'] = $strScripts;
		$strScripts = '';

		// Add the internal scripts
		if (!empty($GLOBALS['TL_JAVASCRIPT']) && \is_array($GLOBALS['TL_JAVASCRIPT']))
		{
			$objCombiner = new Combiner();
			$objCombinerAsync = new Combiner();

			foreach (array_unique($GLOBALS['TL_JAVASCRIPT']) as $javascript)
			{
				$options = StringUtil::resolveFlaggedUrl($javascript);

				if ($options->static)
				{
					$options->async ? $objCombinerAsync->add($javascript, $options->mtime) : $objCombiner->add($javascript, $options->mtime);
				}
				else
				{
					$strScripts .= Template::generateScriptTag(static::addAssetsUrlTo($javascript), $options->async, $options->mtime);
				}
			}

			// Create the aggregated script and add it before the non-static scripts (see #4890)
			if ($objCombiner->hasEntries())
			{
				if ($blnCombineScripts)
				{
					$strScripts = Template::generateScriptTag($objCombiner->getCombinedFile()) . $strScripts;
				}
				else
				{
					$arrReversed = array_reverse($objCombiner->getFileUrls());

					foreach ($arrReversed as $strUrl)
					{
						$options = StringUtil::resolveFlaggedUrl($strUrl);
						$strScripts = Template::generateScriptTag($strUrl, false, $options->mtime) . $strScripts;
					}
				}
			}

			if ($objCombinerAsync->hasEntries())
			{
				if ($blnCombineScripts)
				{
					$strScripts = Template::generateScriptTag($objCombinerAsync->getCombinedFile(), true) . $strScripts;
				}
				else
				{
					$arrReversed = array_reverse($objCombinerAsync->getFileUrls());

					foreach ($arrReversed as $strUrl)
					{
						$options = StringUtil::resolveFlaggedUrl($strUrl);
						$strScripts = Template::generateScriptTag($strUrl, true, $options->mtime) . $strScripts;
					}
				}
			}
		}

		// Add the internal <head> tags
		if (!empty($GLOBALS['TL_HEAD']) && \is_array($GLOBALS['TL_HEAD']))
		{
			foreach (array_unique($GLOBALS['TL_HEAD']) as $head)
			{
				$strScripts .= $head;
			}
		}

		$arrReplace['[[TL_HEAD]]'] = $strScripts;

		return str_replace(array_keys($arrReplace), $arrReplace, $strBuffer);
	}
public static function replaceDynamicScriptTags($strBuffer)
	{
		
		if (isset($GLOBALS['TL_HOOKS']['replaceDynamicScriptTags']) && \is_array($GLOBALS['TL_HOOKS']['replaceDynamicScriptTags']))
		{
			foreach ($GLOBALS['TL_HOOKS']['replaceDynamicScriptTags'] as $callback)
			{
				$strBuffer = static::importStatic($callback[0])->{$callback[1]}($strBuffer);
			}
		}

		$arrReplace = array();
		$strScripts = '';

		
		if (!empty($GLOBALS['TL_JQUERY']) && \is_array($GLOBALS['TL_JQUERY']))
		{
			foreach (array_unique($GLOBALS['TL_JQUERY']) as $script)
			{
				$strScripts .= $script;
			}
		}

		$arrReplace['[[TL_JQUERY]]'] = $strScripts;
		$strScripts = '';

		
		if (!empty($GLOBALS['TL_MOOTOOLS']) && \is_array($GLOBALS['TL_MOOTOOLS']))
		{
			foreach (array_unique($GLOBALS['TL_MOOTOOLS']) as $script)
			{
				$strScripts .= $script;
			}
		}

		$arrReplace['[[TL_MOOTOOLS]]'] = $strScripts;
		$strScripts = '';

		
		if (!empty($GLOBALS['TL_BODY']) && \is_array($GLOBALS['TL_BODY']))
		{
			foreach (array_unique($GLOBALS['TL_BODY']) as $script)
			{
				$strScripts .= $script;
			}
		}

		
		if (System::getContainer()->get('contao.security.token_checker')->hasBackendUser())
		{
			$strScripts .= "
<script>
  (function(win) {
    if (!win.parent || typeof(win.parent.postMessage) !== 'function') {
      return;
    }
    win.parent.postMessage({
      'contao.preview': {
        'title': win.document.title,
        'uri': win.location.href
      }}, win.location.origin);
  })(window);
</script>";
		}

		global $objPage;

		$objLayout = LayoutModel::findByPk($objPage->layoutId);
		$blnCombineScripts = ($objLayout === null) ? false : $objLayout->combineScripts;

		$arrReplace['[[TL_BODY]]'] = $strScripts;
		$strScripts = '';

		$objCombiner = new Combiner();

		
		if (!empty($GLOBALS['TL_FRAMEWORK_CSS']) && \is_array($GLOBALS['TL_FRAMEWORK_CSS']))
		{
			foreach (array_unique($GLOBALS['TL_FRAMEWORK_CSS']) as $stylesheet)
			{
				$objCombiner->add($stylesheet);
			}
		}

		
		if (!empty($GLOBALS['TL_CSS']) && \is_array($GLOBALS['TL_CSS']))
		{
			foreach (array_unique($GLOBALS['TL_CSS']) as $stylesheet)
			{
				$options = StringUtil::resolveFlaggedUrl($stylesheet);

				if ($options->static)
				{
					$objCombiner->add($stylesheet, $options->mtime, $options->media);
				}
				else
				{
					$strScripts .= Template::generateStyleTag(static::addAssetsUrlTo($stylesheet), $options->media, $options->mtime);
				}
			}
		}

		
		if (!empty($GLOBALS['TL_USER_CSS']) && \is_array($GLOBALS['TL_USER_CSS']))
		{
			foreach (array_unique($GLOBALS['TL_USER_CSS']) as $stylesheet)
			{
				$options = StringUtil::resolveFlaggedUrl($stylesheet);

				if ($options->static)
				{
					$objCombiner->add($stylesheet, $options->mtime, $options->media);
				}
				else
				{
					$strScripts .= Template::generateStyleTag(static::addAssetsUrlTo($stylesheet), $options->media, $options->mtime);
				}
			}
		}

		
		if ($objCombiner->hasEntries())
		{
			if ($blnCombineScripts)
			{
				$strScripts .= Template::generateStyleTag($objCombiner->getCombinedFile(), 'all');
			}
			else
			{
				foreach ($objCombiner->getFileUrls() as $strUrl)
				{
					$options = StringUtil::resolveFlaggedUrl($strUrl);
					$strScripts .= Template::generateStyleTag($strUrl, $options->media, $options->mtime);
				}
			}
		}

		$arrReplace['[[TL_CSS]]'] = $strScripts;
		$strScripts = '';

		
		if (!empty($GLOBALS['TL_JAVASCRIPT']) && \is_array($GLOBALS['TL_JAVASCRIPT']))
		{
			$objCombiner = new Combiner();
			$objCombinerAsync = new Combiner();

			foreach (array_unique($GLOBALS['TL_JAVASCRIPT']) as $javascript)
			{
				$options = StringUtil::resolveFlaggedUrl($javascript);

				if ($options->static)
				{
					$options->async ? $objCombinerAsync->add($javascript, $options->mtime) : $objCombiner->add($javascript, $options->mtime);
				}
				else
				{
					$strScripts .= Template::generateScriptTag(static::addAssetsUrlTo($javascript), $options->async, $options->mtime);
				}
			}

			
			if ($objCombiner->hasEntries())
			{
				if ($blnCombineScripts)
				{
					$strScripts = Template::generateScriptTag($objCombiner->getCombinedFile()) . $strScripts;
				}
				else
				{
					$arrReversed = array_reverse($objCombiner->getFileUrls());

					foreach ($arrReversed as $strUrl)
					{
						$options = StringUtil::resolveFlaggedUrl($strUrl);
						$strScripts = Template::generateScriptTag($strUrl, false, $options->mtime) . $strScripts;
					}
				}
			}

			if ($objCombinerAsync->hasEntries())
			{
				if ($blnCombineScripts)
				{
					$strScripts = Template::generateScriptTag($objCombinerAsync->getCombinedFile(), true) . $strScripts;
				}
				else
				{
					$arrReversed = array_reverse($objCombinerAsync->getFileUrls());

					foreach ($arrReversed as $strUrl)
					{
						$options = StringUtil::resolveFlaggedUrl($strUrl);
						$strScripts = Template::generateScriptTag($strUrl, true, $options->mtime) . $strScripts;
					}
				}
			}
		}

		
		if (!empty($GLOBALS['TL_HEAD']) && \is_array($GLOBALS['TL_HEAD']))
		{
			foreach (array_unique($GLOBALS['TL_HEAD']) as $head)
			{
				$strScripts .= $head;
			}
		}

		$arrReplace['[[TL_HEAD]]'] = $strScripts;

		return str_replace(array_keys($arrReplace), $arrReplace, $strBuffer);
	}
public static function replaceDynamicScriptTags ( $ strBuffer ) { // HOOK: add custom logic if ( isset ( $ GLOBALS [ 'TL_HOOKS' ] [ 'replaceDynamicScriptTags' ] ) && \ is_array ( $ GLOBALS [ 'TL_HOOKS' ] [ 'replaceDynamicScriptTags' ] ) ) { foreach ( $ GLOBALS [ 'TL_HOOKS' ] [ 'replaceDynamicScriptTags' ] as $ callback ) { $ strBuffer = static :: importStatic ( $ callback [ 0 ] ) -> { $ callback [ 1 ] } ( $ strBuffer ) ; } } $ arrReplace = array ( ) ; $ strScripts = '' ; // Add the internal jQuery scripts if ( ! empty ( $ GLOBALS [ 'TL_JQUERY' ] ) && \ is_array ( $ GLOBALS [ 'TL_JQUERY' ] ) ) { foreach ( array_unique ( $ GLOBALS [ 'TL_JQUERY' ] ) as $ script ) { $ strScripts .= $ script ; } } $ arrReplace [ '[[TL_JQUERY]]' ] = $ strScripts ; $ strScripts = '' ; // Add the internal MooTools scripts if ( ! empty ( $ GLOBALS [ 'TL_MOOTOOLS' ] ) && \ is_array ( $ GLOBALS [ 'TL_MOOTOOLS' ] ) ) { foreach ( array_unique ( $ GLOBALS [ 'TL_MOOTOOLS' ] ) as $ script ) { $ strScripts .= $ script ; } } $ arrReplace [ '[[TL_MOOTOOLS]]' ] = $ strScripts ; $ strScripts = '' ; // Add the internal <body> tags if ( ! empty ( $ GLOBALS [ 'TL_BODY' ] ) && \ is_array ( $ GLOBALS [ 'TL_BODY' ] ) ) { foreach ( array_unique ( $ GLOBALS [ 'TL_BODY' ] ) as $ script ) { $ strScripts .= $ script ; } } // FE preview support if ( System :: getContainer ( ) -> get ( 'contao.security.token_checker' ) -> hasBackendUser ( ) ) { $ strScripts .= "
<script>
  (function(win) {
    if (!win.parent || typeof(win.parent.postMessage) !== 'function') {
      return;
    }
    win.parent.postMessage({
      'contao.preview': {
        'title': win.document.title,
        'uri': win.location.href
      }}, win.location.origin);
  })(window);
</script>" ; } global $ objPage ; $ objLayout = LayoutModel :: findByPk ( $ objPage -> layoutId ) ; $ blnCombineScripts = ( $ objLayout === null ) ? false : $ objLayout -> combineScripts ; $ arrReplace [ '[[TL_BODY]]' ] = $ strScripts ; $ strScripts = '' ; $ objCombiner = new Combiner ( ) ; // Add the CSS framework style sheets if ( ! empty ( $ GLOBALS [ 'TL_FRAMEWORK_CSS' ] ) && \ is_array ( $ GLOBALS [ 'TL_FRAMEWORK_CSS' ] ) ) { foreach ( array_unique ( $ GLOBALS [ 'TL_FRAMEWORK_CSS' ] ) as $ stylesheet ) { $ objCombiner -> add ( $ stylesheet ) ; } } // Add the internal style sheets if ( ! empty ( $ GLOBALS [ 'TL_CSS' ] ) && \ is_array ( $ GLOBALS [ 'TL_CSS' ] ) ) { foreach ( array_unique ( $ GLOBALS [ 'TL_CSS' ] ) as $ stylesheet ) { $ options = StringUtil :: resolveFlaggedUrl ( $ stylesheet ) ; if ( $ options -> static ) { $ objCombiner -> add ( $ stylesheet , $ options -> mtime , $ options -> media ) ; } else { $ strScripts .= Template :: generateStyleTag ( static :: addAssetsUrlTo ( $ stylesheet ) , $ options -> media , $ options -> mtime ) ; } } } // Add the user style sheets if ( ! empty ( $ GLOBALS [ 'TL_USER_CSS' ] ) && \ is_array ( $ GLOBALS [ 'TL_USER_CSS' ] ) ) { foreach ( array_unique ( $ GLOBALS [ 'TL_USER_CSS' ] ) as $ stylesheet ) { $ options = StringUtil :: resolveFlaggedUrl ( $ stylesheet ) ; if ( $ options -> static ) { $ objCombiner -> add ( $ stylesheet , $ options -> mtime , $ options -> media ) ; } else { $ strScripts .= Template :: generateStyleTag ( static :: addAssetsUrlTo ( $ stylesheet ) , $ options -> media , $ options -> mtime ) ; } } } // Create the aggregated style sheet if ( $ objCombiner -> hasEntries ( ) ) { if ( $ blnCombineScripts ) { $ strScripts .= Template :: generateStyleTag ( $ objCombiner -> getCombinedFile ( ) , 'all' ) ; } else { foreach ( $ objCombiner -> getFileUrls ( ) as $ strUrl ) { $ options = StringUtil :: resolveFlaggedUrl ( $ strUrl ) ; $ strScripts .= Template :: generateStyleTag ( $ strUrl , $ options -> media , $ options -> mtime ) ; } } } $ arrReplace [ '[[TL_CSS]]' ] = $ strScripts ; $ strScripts = '' ; // Add the internal scripts if ( ! empty ( $ GLOBALS [ 'TL_JAVASCRIPT' ] ) && \ is_array ( $ GLOBALS [ 'TL_JAVASCRIPT' ] ) ) { $ objCombiner = new Combiner ( ) ; $ objCombinerAsync = new Combiner ( ) ; foreach ( array_unique ( $ GLOBALS [ 'TL_JAVASCRIPT' ] ) as $ javascript ) { $ options = StringUtil :: resolveFlaggedUrl ( $ javascript ) ; if ( $ options -> static ) { $ options -> async ? $ objCombinerAsync -> add ( $ javascript , $ options -> mtime ) : $ objCombiner -> add ( $ javascript , $ options -> mtime ) ; } else { $ strScripts .= Template :: generateScriptTag ( static :: addAssetsUrlTo ( $ javascript ) , $ options -> async , $ options -> mtime ) ; } } // Create the aggregated script and add it before the non-static scripts (see #4890) if ( $ objCombiner -> hasEntries ( ) ) { if ( $ blnCombineScripts ) { $ strScripts = Template :: generateScriptTag ( $ objCombiner -> getCombinedFile ( ) ) . $ strScripts ; } else { $ arrReversed = array_reverse ( $ objCombiner -> getFileUrls ( ) ) ; foreach ( $ arrReversed as $ strUrl ) { $ options = StringUtil :: resolveFlaggedUrl ( $ strUrl ) ; $ strScripts = Template :: generateScriptTag ( $ strUrl , false , $ options -> mtime ) . $ strScripts ; } } } if ( $ objCombinerAsync -> hasEntries ( ) ) { if ( $ blnCombineScripts ) { $ strScripts = Template :: generateScriptTag ( $ objCombinerAsync -> getCombinedFile ( ) , true ) . $ strScripts ; } else { $ arrReversed = array_reverse ( $ objCombinerAsync -> getFileUrls ( ) ) ; foreach ( $ arrReversed as $ strUrl ) { $ options = StringUtil :: resolveFlaggedUrl ( $ strUrl ) ; $ strScripts = Template :: generateScriptTag ( $ strUrl , true , $ options -> mtime ) . $ strScripts ; } } } } // Add the internal <head> tags if ( ! empty ( $ GLOBALS [ 'TL_HEAD' ] ) && \ is_array ( $ GLOBALS [ 'TL_HEAD' ] ) ) { foreach ( array_unique ( $ GLOBALS [ 'TL_HEAD' ] ) as $ head ) { $ strScripts .= $ head ; } } $ arrReplace [ '[[TL_HEAD]]' ] = $ strScripts ; return str_replace ( array_keys ( $ arrReplace ) , $ arrReplace , $ strBuffer ) ; }
Replace the dynamic script tags (see #4203)

@param string $strBuffer The string with the tags to be replaced

@return string The string with the replaced tags
Replace the dynamic script tags ( see #4203 )