Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

Template Questions

Requirements included after last <script> tag on template


Reply

2 Posts   567 Views

Avatar
Double-A-Ron

26 June 2013 at 4:02pm Community Member, 604 Posts

A colleague just bought me something I've never seen and I can't see mention of this in the docs. This was originally a question, but by the time I finished writing it I had found my answer in sapphire/core/Requirements.php. So I'll leave what wrote as something searchable.

Take these snippets:

Page.ss

<div>
<script src="/js/myScript.js"></script>
<p>Stuff</p>
</div>

Page.php

function pageAction() {
Requirements::javascript('mysite/javascript/thirdparty/jquery-1.4.2.min.js');
Requirements::javascript('mysite/javascript/thirdparty/jquery.plugin.js');

.....
}

The html output of this is:

<div>
<script src="http://domain.com/mysite/javascript/thirdparty/jquery-1.4.2.min.js"></script>
<script src="http://domain.com/mysite/javascript/thirdparty/jquery.plugin.js"></script>
<script src="/js/myScript.js"></script>
<p>Stuff</p>
</div>

The reason why he bought this over was because the first, litteral JS include was a secure cert service that feeds a badge/image on the page. It was being broken due to the other files being injected there. (Don't ask how)

What was interesting was the solution:

Page.ss

<div>
<script src="/js/myScript.js"></script>
<p>Stuff</p>
</div>
<script></script>

Which resulted in:

<div>
<script src="/js/myScript.js"></script>
<p>Stuff</p>
</div>
<script src="http://domain.com/mysite/javascript/thirdparty/jquery-1.4.2.min.js"></script>
<script src="http://domain.com/mysite/javascript/thirdparty/jquery.plugin.js"></script>
<script></script>

Looking at core, Silverstripe does a strripos() for any '<script' tags in the template and injects the requirements before this point.

Avatar
simon_w

26 June 2013 at 4:08pm Forum Moderator, 474 Posts

And this has been fixed in 3.1 so JavaScript requirements are correctly inserted before the first <script> tag in the <body> if one exists.