From 599cdb66a8bc9ac4f72afffe704f3b6f5afc35c0 Mon Sep 17 00:00:00 2001 From: Markus Klein <klein.t3@mfc-linz.at> Date: Sun, 16 Feb 2014 11:11:15 +0100 Subject: [PATCH] [BUGFIX] concatenateJs/Css does not consider forceOnTop Setting the forceOnTop property for a JS or CSS file is not observed if concatenateJs/Css is set as well. Resolves: #53116 Resolves: #56019 Releases: 6.2, 6.1 Change-Id: Ica31656bd72f4a0249513206bac45aa16b929761 Reviewed-on: https://review.typo3.org/27640 Reviewed-by: Stefan Neufeind Tested-by: Stefan Neufeind Reviewed-by: Wouter Wolters Tested-by: Wouter Wolters --- .../sysext/core/Classes/Page/PageRenderer.php | 46 +++++++++++-------- .../Classes/Resource/ResourceCompressor.php | 19 ++++++-- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/typo3/sysext/core/Classes/Page/PageRenderer.php b/typo3/sysext/core/Classes/Page/PageRenderer.php index a29d0cf73138..104cf6ddc5ce 100644 --- a/typo3/sysext/core/Classes/Page/PageRenderer.php +++ b/typo3/sysext/core/Classes/Page/PageRenderer.php @@ -2359,10 +2359,11 @@ class PageRenderer implements \TYPO3\CMS\Core\SingletonInterface { $wrapArr = explode($properties['splitChar'] ?: '|', $properties['allWrap'], 2); $tag = $wrapArr[0] . $tag . $wrapArr[1]; } + $tag .= LF; if ($properties['forceOnTop']) { - $cssFiles = $tag . LF . $cssFiles; + $cssFiles = $tag . $cssFiles; } else { - $cssFiles .= LF . $tag; + $cssFiles .= $tag; } } } @@ -2389,10 +2390,11 @@ class PageRenderer implements \TYPO3\CMS\Core\SingletonInterface { $wrapArr = explode($properties['splitChar'] ?: '|', $properties['allWrap'], 2); $tag = $wrapArr[0] . $tag . $wrapArr[1]; } + $tag .= LF; if ($properties['forceOnTop']) { - $cssFiles = $tag . LF . $cssFiles; + $cssFiles = $tag . $cssFiles; } else { - $cssFiles .= LF . $tag; + $cssFiles .= $tag; } } } @@ -2408,10 +2410,11 @@ class PageRenderer implements \TYPO3\CMS\Core\SingletonInterface { $cssInline = ''; if (count($this->cssInline)) { foreach ($this->cssInline as $name => $properties) { + $cssCode = '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF; if ($properties['forceOnTop']) { - $cssInline = '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF . $cssInline; + $cssInline = $cssCode . $cssInline; } else { - $cssInline .= '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF; + $cssInline .= $cssCode; } } $cssInline = $this->inlineCssWrap[0] . $cssInline . $this->inlineCssWrap[1]; @@ -2436,17 +2439,18 @@ class PageRenderer implements \TYPO3\CMS\Core\SingletonInterface { $wrapArr = explode($properties['splitChar'] ?: '|', $properties['allWrap'], 2); $tag = $wrapArr[0] . $tag . $wrapArr[1]; } + $tag .= LF; if ($properties['forceOnTop']) { if ($properties['section'] === self::PART_HEADER) { - $jsLibs = $tag . LF . $jsLibs; + $jsLibs = $tag . $jsLibs; } else { - $jsFooterLibs = $tag . LF . $jsFooterLibs; + $jsFooterLibs = $tag . $jsFooterLibs; } } else { if ($properties['section'] === self::PART_HEADER) { - $jsLibs .= LF . $tag; + $jsLibs .= $tag; } else { - $jsFooterLibs .= LF . $tag; + $jsFooterLibs .= $tag; } } } @@ -2475,23 +2479,24 @@ class PageRenderer implements \TYPO3\CMS\Core\SingletonInterface { $wrapArr = explode($properties['splitChar'] ?: '|', $properties['allWrap'], 2); $tag = $wrapArr[0] . $tag . $wrapArr[1]; } + $tag .= LF; if ($properties['forceOnTop']) { if ($properties['section'] === self::PART_HEADER) { - $jsFiles = $tag . LF . $jsFiles; + $jsFiles = $tag . $jsFiles; } else { - $jsFooterFiles = $tag . LF . $jsFooterFiles; + $jsFooterFiles = $tag . $jsFooterFiles; } } else { if ($properties['section'] === self::PART_HEADER) { - $jsFiles .= LF . $tag; + $jsFiles .= $tag; } else { - $jsFooterFiles .= LF . $tag; + $jsFooterFiles .= $tag; } } } } if ($this->moveJsFromHeaderToFooter) { - $jsFooterFiles = $jsFiles . LF . $jsFooterFiles; + $jsFooterFiles = $jsFiles . $jsFooterFiles; $jsFiles = ''; } return array($jsFiles, $jsFooterFiles); @@ -2507,17 +2512,18 @@ class PageRenderer implements \TYPO3\CMS\Core\SingletonInterface { $jsFooterInline = ''; if (count($this->jsInline)) { foreach ($this->jsInline as $name => $properties) { + $jsCode = '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF; if ($properties['forceOnTop']) { if ($properties['section'] === self::PART_HEADER) { - $jsInline = '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF . $jsInline; + $jsInline = $jsCode . $jsInline; } else { - $jsFooterInline = '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF . $jsFooterInline; + $jsFooterInline = $jsCode . $jsFooterInline; } } else { if ($properties['section'] === self::PART_HEADER) { - $jsInline .= '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF; + $jsInline .= $jsCode; } else { - $jsFooterInline .= '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF; + $jsFooterInline .= $jsCode; } } } @@ -2529,7 +2535,7 @@ class PageRenderer implements \TYPO3\CMS\Core\SingletonInterface { $jsFooterInline = $this->inlineJavascriptWrap[0] . $jsFooterInline . $this->inlineJavascriptWrap[1]; } if ($this->moveJsFromHeaderToFooter) { - $jsFooterInline = $jsInline . LF . $jsFooterInline; + $jsFooterInline = $jsInline . $jsFooterInline; $jsInline = ''; } return array($jsInline, $jsFooterInline); diff --git a/typo3/sysext/core/Classes/Resource/ResourceCompressor.php b/typo3/sysext/core/Classes/Resource/ResourceCompressor.php index 04852a036ee3..a9980a274ae3 100644 --- a/typo3/sysext/core/Classes/Resource/ResourceCompressor.php +++ b/typo3/sysext/core/Classes/Resource/ResourceCompressor.php @@ -188,19 +188,25 @@ class ResourceCompressor { $filenameFromMainDir = $this->getFilenameFromMainDir($fileOptions['file']); // if $options['baseDirectories'] set, we only include files below these directories if ((!isset($options['baseDirectories']) || $this->checkBaseDirectory($filenameFromMainDir, array_merge($options['baseDirectories'], array($this->targetDirectory)))) && $fileOptions['media'] === 'all') { - $filesToInclude[] = $filenameFromMainDir; + if ($fileOptions['forceOnTop']) { + array_unshift($filesToInclude, $filenameFromMainDir); + } else { + $filesToInclude[] = $filenameFromMainDir; + } // remove the file from the incoming file array unset($cssFiles[$key]); } } - if (count($filesToInclude)) { + if (!empty($filesToInclude)) { $targetFile = $this->createMergedCssFile($filesToInclude); $targetFileRelative = $this->relativePath . $targetFile; $concatenatedOptions = array( 'file' => $targetFileRelative, 'rel' => 'stylesheet', 'media' => 'all', - 'compress' => TRUE + 'compress' => TRUE, + 'forceOnTop' => FALSE, + 'allWrap' => '' ); // place the merged stylesheet on top of the stylesheets $cssFiles = array_merge(array($targetFileRelative => $concatenatedOptions), $cssFiles); @@ -222,7 +228,12 @@ class ResourceCompressor { continue; } // we remove BACK_PATH from $filename, so make it relative to root path - $filesToInclude[$fileOptions['section']][] = $this->getFilenameFromMainDir($fileOptions['file']); + $filenameFromMainDir = $this->getFilenameFromMainDir($fileOptions['file']); + if ($fileOptions['forceOnTop']) { + array_unshift($filesToInclude[$fileOptions['section']], $filenameFromMainDir); + } else { + $filesToInclude[$fileOptions['section']][] = $filenameFromMainDir; + } // remove the file from the incoming file array unset($jsFiles[$key]); } -- GitLab