12
12
use Magento \Framework \App \Response \Http ;
13
13
14
14
/**
15
- * Plugin for putting all js to footer .
15
+ * Plugin for putting all JavaScript tags to the end of body .
16
16
*/
17
17
class JsFooterPlugin
18
18
{
@@ -32,45 +32,52 @@ public function __construct(ScopeConfigInterface $scopeConfig)
32
32
}
33
33
34
34
/**
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 .
36
36
*
37
37
* @param Http $subject
38
38
* @return void
39
39
*/
40
40
public function beforeSendResponse (Http $ subject )
41
41
{
42
42
$ 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 );
43
46
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
+ }
54
54
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 );
58
64
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 ;
63
69
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 ;
68
73
}
69
74
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 );
74
79
}
80
+
81
+ return $ scripts ;
75
82
}
76
83
}
0 commit comments