/** * 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 */ 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 .= "\n" . trim($script) . "\n"; } } $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 .= "\n" . trim($script) . "\n"; } } $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 .= trim($script) . "\n"; } } // Command scheduler if (!\Config::get('disableCron')) { $strScripts .= "\n" . \Template::generateInlineScript('setTimeout(function(){var e=function(e,t){try{var n=new XMLHttpRequest}catch(r){return}n.open("GET",e,!0),n.onreadystatechange=function(){this.readyState==4&&this.status==200&&typeof t=="function"&&t(this.responseText)},n.send()},t="system/cron/cron.";e(t+"txt",function(n){parseInt(n||0)<Math.round(+(new Date)/1e3)-' . \Frontend::getCronTimeout() . '&&e(t+"php")})},5e3);') . "\n"; } $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::addStaticUrlTo($stylesheet), $options->media) . "\n"; } } } // 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::addStaticUrlTo($stylesheet), $options->media) . "\n"; } } } // Create the aggregated style sheet if ($objCombiner->hasEntries()) { $strScripts .= \Template::generateStyleTag($objCombiner->getCombinedFile(), 'all') . "\n"; } $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) { if ($options->async) { $objCombinerAsync->add($javascript, $options->mtime); } else { $objCombiner->add($javascript, $options->mtime); } } else { $strScripts .= \Template::generateScriptTag(static::addStaticUrlTo($javascript), $options->async) . "\n"; } } // Create the aggregated script and add it before the non-static scripts (see #4890) if ($objCombiner->hasEntries()) { $strScripts = \Template::generateScriptTag($objCombiner->getCombinedFile()) . "\n" . $strScripts; } if ($objCombinerAsync->hasEntries()) { $strScripts = \Template::generateScriptTag($objCombinerAsync->getCombinedFile(), true) . "\n" . $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 .= trim($head) . "\n"; } } $arrReplace['[[TL_HEAD]]'] = $strScripts; return str_replace(array_keys($arrReplace), array_values($arrReplace), $strBuffer); }
/** * Create a new template * * @param \PageModel $objPage * @param \LayoutModel $objLayout */ protected function createTemplate($objPage, $objLayout) { /** @var \FrontendTemplate|object $objTemplate */ $objTemplate = new \FrontendTemplate($objPage->template); $this->Template = $objTemplate; $this->Template->viewport = ''; $this->Template->framework = ''; $arrFramework = deserialize($objLayout->framework); // Generate the CSS framework if (is_array($arrFramework) && in_array('layout.css', $arrFramework)) { $strFramework = ''; if (in_array('responsive.css', $arrFramework)) { $this->Template->viewport = '<meta name="viewport" content="width=device-width,initial-scale=1.0">' . "\n"; } // Wrapper if ($objLayout->static) { $arrSize = deserialize($objLayout->width); if (isset($arrSize['value']) && $arrSize['value'] != '' && $arrSize['value'] >= 0) { $arrMargin = array('left' => '0 auto 0 0', 'center' => '0 auto', 'right' => '0 0 0 auto'); $strFramework .= sprintf('#wrapper{width:%s;margin:%s}', $arrSize['value'] . $arrSize['unit'], $arrMargin[$objLayout->align]); } } // Header if ($objLayout->rows == '2rwh' || $objLayout->rows == '3rw') { $arrSize = deserialize($objLayout->headerHeight); if (isset($arrSize['value']) && $arrSize['value'] != '' && $arrSize['value'] >= 0) { $strFramework .= sprintf('#header{height:%s}', $arrSize['value'] . $arrSize['unit']); } } $strContainer = ''; // Left column if ($objLayout->cols == '2cll' || $objLayout->cols == '3cl') { $arrSize = deserialize($objLayout->widthLeft); if (isset($arrSize['value']) && $arrSize['value'] != '' && $arrSize['value'] >= 0) { $strFramework .= sprintf('#left{width:%s;right:%s}', $arrSize['value'] . $arrSize['unit'], $arrSize['value'] . $arrSize['unit']); $strContainer .= sprintf('padding-left:%s;', $arrSize['value'] . $arrSize['unit']); } } // Right column if ($objLayout->cols == '2clr' || $objLayout->cols == '3cl') { $arrSize = deserialize($objLayout->widthRight); if (isset($arrSize['value']) && $arrSize['value'] != '' && $arrSize['value'] >= 0) { $strFramework .= sprintf('#right{width:%s}', $arrSize['value'] . $arrSize['unit']); $strContainer .= sprintf('padding-right:%s;', $arrSize['value'] . $arrSize['unit']); } } // Main column if ($strContainer != '') { $strFramework .= sprintf('#container{%s}', substr($strContainer, 0, -1)); } // Footer if ($objLayout->rows == '2rwf' || $objLayout->rows == '3rw') { $arrSize = deserialize($objLayout->footerHeight); if (isset($arrSize['value']) && $arrSize['value'] != '' && $arrSize['value'] >= 0) { $strFramework .= sprintf('#footer{height:%s}', $arrSize['value'] . $arrSize['unit']); } } // Add the layout specific CSS if ($strFramework != '') { $this->Template->framework = \Template::generateInlineStyle($strFramework) . "\n"; } } // Overwrite the viewport tag (see #6251) if ($objLayout->viewport != '') { $this->Template->viewport = '<meta name="viewport" content="' . $objLayout->viewport . '">' . "\n"; } $this->Template->mooScripts = ''; // Make sure TL_JAVASCRIPT exists (see #4890) if (isset($GLOBALS['TL_JAVASCRIPT']) && is_array($GLOBALS['TL_JAVASCRIPT'])) { $arrAppendJs = $GLOBALS['TL_JAVASCRIPT']; $GLOBALS['TL_JAVASCRIPT'] = array(); } else { $arrAppendJs = array(); $GLOBALS['TL_JAVASCRIPT'] = array(); } $arrPackages = \System::getContainer()->getParameter('kernel.packages'); // jQuery scripts if ($objLayout->addJQuery) { if ($objLayout->jSource == 'j_googleapis' || $objLayout->jSource == 'j_fallback') { if (($strVersion = $arrPackages['contao-components/jquery']) !== null) { $this->Template->mooScripts .= \Template::generateScriptTag('//code.jquery.com/jquery-' . $strVersion . '.min.js') . "\n"; // Local fallback (thanks to DyaGa) if ($objLayout->jSource == 'j_fallback') { $this->Template->mooScripts .= \Template::generateInlineScript('window.jQuery || document.write(\'<script src="' . TL_ASSETS_URL . 'assets/jquery/js/jquery.min.js">\\x3C/script>\')') . "\n"; } } else { $GLOBALS['TL_JAVASCRIPT'][] = 'assets/jquery/js/jquery.min.js|static'; } } else { $GLOBALS['TL_JAVASCRIPT'][] = 'assets/jquery/js/jquery.min.js|static'; } } // MooTools scripts if ($objLayout->addMooTools) { if ($objLayout->mooSource == 'moo_googleapis' || $objLayout->mooSource == 'moo_fallback') { if (($strVersion = $arrPackages['contao-components/mootools']) !== null) { $this->Template->mooScripts .= \Template::generateScriptTag('//ajax.googleapis.com/ajax/libs/mootools/' . $strVersion . '/mootools-yui-compressed.js') . "\n"; // Local fallback (thanks to DyaGa) if ($objLayout->mooSource == 'moo_fallback') { $this->Template->mooScripts .= \Template::generateInlineScript('window.MooTools || document.write(\'<script src="' . TL_ASSETS_URL . 'assets/mootools/js/mootools-core.min.js">\\x3C/script>\')') . "\n"; } $GLOBALS['TL_JAVASCRIPT'][] = 'assets/mootools/js/mootools-more.min.js|static'; $GLOBALS['TL_JAVASCRIPT'][] = 'assets/mootools/js/mootools-mobile.min.js|static'; } else { $GLOBALS['TL_JAVASCRIPT'][] = 'assets/mootools/js/mootools.min.js|static'; } } else { $GLOBALS['TL_JAVASCRIPT'][] = 'assets/mootools/js/mootools.min.js|static'; } } // Picturefill if ($objLayout->picturefill) { $GLOBALS['TL_JAVASCRIPT'][] = 'assets/respimage/js/respimage.min.js|static'; } // Check whether TL_APPEND_JS exists (see #4890) if (!empty($arrAppendJs)) { $GLOBALS['TL_JAVASCRIPT'] = array_merge($GLOBALS['TL_JAVASCRIPT'], $arrAppendJs); } // Initialize the sections $this->Template->header = ''; $this->Template->left = ''; $this->Template->main = ''; $this->Template->right = ''; $this->Template->footer = ''; // Initialize the custom layout sections $this->Template->sections = array(); $this->Template->sPosition = $objLayout->sPosition; // Default settings $this->Template->layout = $objLayout; $this->Template->language = $GLOBALS['TL_LANGUAGE']; $this->Template->charset = \Config::get('characterSet'); $this->Template->base = \Environment::get('base'); $this->Template->disableCron = \Config::get('disableCron'); $this->Template->cronTimeout = $this->getCronTimeout(); $this->Template->isRTL = false; }
/** * 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 */ 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 .= "\n" . trim($script) . "\n"; } } $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 .= "\n" . trim($script) . "\n"; } } $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 .= trim($script) . "\n"; } } $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) { if ($options->mtime === null) { $options->mtime = filemtime(TL_ROOT . '/' . $stylesheet); } $objCombiner->add($stylesheet, $options->mtime, $options->media); } else { $strScripts .= \Template::generateStyleTag(static::addStaticUrlTo($stylesheet), $options->media) . "\n"; } } } // 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::addStaticUrlTo($stylesheet), $options->media) . "\n"; } } } // Create the aggregated style sheet if ($objCombiner->hasEntries()) { $strScripts .= \Template::generateStyleTag($objCombiner->getCombinedFile(), 'all') . "\n"; } $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) { if ($options->mtime === null) { $options->mtime = filemtime(TL_ROOT . '/' . $javascript); } $options->async ? $objCombinerAsync->add($javascript, $options->mtime) : $objCombiner->add($javascript, $options->mtime); } else { $strScripts .= \Template::generateScriptTag(static::addStaticUrlTo($javascript), $options->async) . "\n"; } } // Create the aggregated script and add it before the non-static scripts (see #4890) if ($objCombiner->hasEntries()) { $strScripts = \Template::generateScriptTag($objCombiner->getCombinedFile()) . "\n" . $strScripts; } if ($objCombinerAsync->hasEntries()) { $strScripts = \Template::generateScriptTag($objCombinerAsync->getCombinedFile(), true) . "\n" . $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 .= trim($head) . "\n"; } } $arrReplace['[[TL_HEAD]]'] = $strScripts; return str_replace(array_keys($arrReplace), array_values($arrReplace), $strBuffer); }