Skip to content

Commit 27805df

Browse files
author
Mateusz Krzeszowiak
committed
Modularize code a bit
1 parent 2c5bc50 commit 27805df

File tree

1 file changed

+34
-27
lines changed

1 file changed

+34
-27
lines changed

app/code/Magento/Theme/Controller/Result/JsFooterPlugin.php

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
use Magento\Framework\App\Response\Http;
1313

1414
/**
15-
* Plugin for putting all js to footer.
15+
* Plugin for putting all JavaScript tags to the end of body.
1616
*/
1717
class JsFooterPlugin
1818
{
@@ -32,45 +32,52 @@ public function __construct(ScopeConfigInterface $scopeConfig)
3232
}
3333

3434
/**
35-
* Put all javascript to footer before sending the response.
35+
* Moves all JavaScript tags to the end of body if this feature is enabled.
3636
*
3737
* @param Http $subject
3838
* @return void
3939
*/
4040
public function beforeSendResponse(Http $subject)
4141
{
4242
$content = (string)$subject->getContent();
43+
$bodyEndTag = '</body';
44+
$isEndBodyTagFound = strpos($content, $bodyEndTag) !== false;
45+
$shouldMoveJsToBottom = $this->scopeConfig->isSetFlag(self::XML_PATH_DEV_MOVE_JS_TO_BOTTOM, ScopeInterface::SCOPE_STORE);
4346

44-
$bodyClose = '</body';
45-
46-
if (strpos($content, $bodyClose) !== false && $this->scopeConfig->isSetFlag(
47-
self::XML_PATH_DEV_MOVE_JS_TO_BOTTOM,
48-
ScopeInterface::SCOPE_STORE
49-
)) {
50-
$scripts = '';
51-
$scriptOpen = '<script';
52-
$scriptClose = '</script>';
53-
$scriptOpenPos = strpos($content, $scriptOpen);
47+
if ($isEndBodyTagFound && $shouldMoveJsToBottom) {
48+
if ($scripts = $this->extractScriptTags($content)) {
49+
$content = str_replace($bodyEndTag, "$scripts\n$bodyEndTag", $content);
50+
$subject->setContent($content);
51+
}
52+
}
53+
}
5454

55-
while ($scriptOpenPos !== false) {
56-
$scriptClosePos = strpos($content, $scriptClose, $scriptOpenPos);
57-
$script = substr($content, $scriptOpenPos, $scriptClosePos - $scriptOpenPos + strlen($scriptClose));
55+
/**
56+
* Extracts and returns script tags found in given content.
57+
*/
58+
public function extractScriptTags(&$content)
59+
{
60+
$scripts = '';
61+
$scriptOpen = '<script';
62+
$scriptClose = '</script>';
63+
$scriptOpenPos = strpos($content, $scriptOpen);
5864

59-
if (strpos($script, 'text/x-magento-template') !== false) {
60-
$scriptOpenPos = strpos($content, $scriptOpen, $scriptClosePos);
61-
continue;
62-
}
65+
while ($scriptOpenPos !== false) {
66+
$scriptClosePos = strpos($content, $scriptClose, $scriptOpenPos);
67+
$script = substr($content, $scriptOpenPos, $scriptClosePos - $scriptOpenPos + strlen($scriptClose));
68+
$isXMagentoTemplate = strpos($script, 'text/x-magento-template') !== false;
6369

64-
$scripts .= "\n" . $script;
65-
$content = str_replace($script, '', $content);
66-
// Script cut out, continue search from its position.
67-
$scriptOpenPos = strpos($content, $scriptOpen, $scriptOpenPos);
70+
if ($isXMagentoTemplate) {
71+
$scriptOpenPos = strpos($content, $scriptOpen, $scriptClosePos);
72+
continue;
6873
}
6974

70-
if ($scripts) {
71-
$content = str_replace($bodyClose, $scripts . "\n" . $bodyClose, $content);
72-
$subject->setContent($content);
73-
}
75+
$scripts .= "\n" . $script;
76+
$content = str_replace($script, '', $content);
77+
// Script cut out, continue search from its position.
78+
$scriptOpenPos = strpos($content, $scriptOpen, $scriptOpenPos);
7479
}
80+
81+
return $scripts;
7582
}
7683
}

0 commit comments

Comments
 (0)