Home » Cleaning up Adobe Captivate’s SCORM Publishing Template, Part 7: Giving the Revisions a Home

Cleaning up Adobe Captivate’s SCORM Publishing Template, Part 7: Giving the Revisions a Home

I decided to post my revised Adobe Captivate publishing template to GitHub, where it can be easily copied, forked, and updated. Currently, the only files are for the Captivate 5.0 and 5.5 templates for SCORM 2004. I hope to add SCORM 1.2 soon, as well as replacing the default ‘standard.htm’ template, which doesn’t use any LMS-related code.

Update: The SCORM 1.2 template is now available.

If you take a look at Default.htm on GitHub, you’ll notice I’ve made a few changes since I wrote my series about editing the templates. I moved a few bits of markup/code around, added some configuration options (such as the ability to turn off centering, turn on logging, and require SCORM when loading), and added a ton of comments to explain some of the new options. Hopefully it’s all self-explanatory.

I also made a small edit to manifest2004.xml, and a few edits to scorm_support.js.

To use these template files, do the following:

  1. Make a backup of your entire publishing folder and put it somewhere safe!
  2. Go to Captivate’s Templates\Publish\SCORM\2004\ folder and replace Default.htm with the new file.
  3. Go to Templates\Publish\SCORM\2004\SCORM_support\ and replace scorm_support.js with the new file.
  4. While you’re in your SCORM_support folder, delete scorm_support.htm and scorm_support.swf, they won’t be used anymore.
  5. Go to Templates\Publish\ and replace manifest2004.xml with the new file.
  6. While you’re still in the Templates\Publish\ folder, replace standard.js with the new file.
  7. Restart Captivate and give it a try!

Find a bug? Think of a good edit for the template? Post a comment here, or better yet, file an issue on GitHub!

New SCORM ebook coming soon!

I'm writing an ebook explaining how to build an HTML-based SCORM course. Subscribe to be notified when it's ready, as well as receive early bird pricing and some free goodies!

No spam, no sharing your email address, unsubscribe at any time. Powered by ConvertKit

24 comments

  1. Weblingo says:

    This is great and very helpfull, Its a shock that it was in this state!

    I feel a bit ashamed, as you have put so much time and effort into this, but have you got an idea when we might see a modified captivate the 1.2 SCORM template?

    I hope adobe are listening

    WL

  2. Michael says:

    You continue to be awesome! Here’s hoping that you find copious spare time for the 1.2 revision. Our LMS, Peoplesoft ELM, only recently got 2004 support, and we are hesitant to use it.

    All of our current captivate modules use 1.2, so any improvements would be gratefully accepted.

    Anyhow, thanks for all the great work and thought on this!

    Michael

  3. Joel says:

    Hi,

    I have also struggled with Captivate 5.5 Scorm 1.2 compatiability with Saba LMS. This is a road block to a commercial deliverable, so I am happy to pay for a robust solution, that can also be given away to the next guy?

    All the Articulate users here in Singapore, are using your scripts from Saba support, so the fixes and work arounds are well know, not so much so with Captivate. Please email me when you have the chance.

    Regards Joel

  4. Jimmi Thøgersen says:

    Hi Philip – and Joel

    Just a few pointers on Saba (I’m afraid I can’t help much there either, Joel): There are plenty of issues with Saba and Captivate (I should know, been writing a Captivate 5 SCORM 2004 template from scratch over the past weeks – with some great inspiration from these articles – thanks!).

    For one, Saba doesn’t like the SCO asking for cmi.score.*, cmi.suspend_data etc. when it’s just told it a moment ago that cmi.entry is “ab-initio” (understandable). It also doesn’t like how Captivate’s rdcmdExit sends cmi.exit = “suspend” no matter if the course is completed.

    Anyway, just to give something back (hopefully), I also submitted an issue on GitHub, which has to do with cmiCache never updating the value store. Hope it helps.

    Not going to file an issue for this other one (because I don’t have the time at the moment), but I’m quite sure this line (in the SetValue handler) won’t do much:

    if(parameter === “completion_status”){ courseStatus = value; }

    Should be “cmi.completion_status” surely?

    Anyway, thanks for some great insights – knowledge sharing in the e-learning/courseware business isn’t exactly a given. 🙂

    Jimmi

  5. Jimmi Thøgersen says:

    Looks good to me – can’t actually test it (re: your reply on the issue), because our own code is quite different – for one, all the cases for handling Captivate’s calls are moved into their own functions – which are then also used for our “manual” calls to the LMS (this means our manual calls to e.g. SetValue are cached too). And I’m an application developer, not a Captivate developer, so can’t even make a course to test it on. 🙂 Still, the logic looks OK to me now.

    Just a note about something you mentioned in regards to Captivate 5. As far as I can tell, there’s no need for a helper SWF there – looks to me like your template could be used just as well for Captivate 5 courses – as long as they’re SCORM 2004 and don’t use the old LocalConnection API – i.e. as long as the course is published as AS3 and the URL parameters are “?SCORM_API=1.0&SCORM_TYPE=0”.

    • philip says:

      @jimmi Adobe intended to stop using LocalConnection in CP5, but I’ve been told there’s a bug in their code that prevents ExternalInterface from being used in Firefox. The external SWF I mentioned is part of Captivate, and contains a copy of Captivate’s internal tracking adapter code. When Captivate SWFs initialize, they immediately look to see if the external SWF is there; if found, the Captivate SWF will use the code found in the external SWF for tracking instead of its own internal tracking adapter. So basically a bugfix can be applied to that external SWF.

  6. Jimmi Thøgersen says:

    Well, looking at a course published from Captivate 5, I see only a couple of lines of code in the external SWF – which open a LocalConnection and invoke a method specified in the URL parameters to the swf. Adobe reload that SWF (by rewriting the HTML in the Mozilla-specific <layer>) every time something needs to be sent to Flash.

    Looking at the decompiled code of the published SWF, however, there’s no use of LocalConnection at all, except for communicating between AVM2 (i.e. AS3) and an embedded AVM1 (AS1/2) movie. There are two lines of code referring to LocalConnection outside of that – on the main timeline:

    public var LocalConnectionInUse:Boolean;

    and

    LocalConnectionInUse = false;

    In other words, there seems to be no LocalConnection actually listening to anything the external SWF says. And LocalConnectionInUse is never set to “true” – or used – anywhere in the code.

    I don’t know how Captivate does the publishing internally – and as mentioned, I can’t make my own course and test if LocalConnection might be used in some cases. But judging from the code in the published SWF, it seems it’s a rather static process – i.e., the same code seems to be published to the SWF, no matter if the course actually uses it (mmquizzing, I’m looking at you), and no matter what settings are made on the course.

    Adding to that, we haven’t had a problem with our own template on Firefox (3.5 – 11) when removing it. And although it’s very different from your template by now, I see nothing in terms of communication with Flash that would work differently.

    Next stop (possibly): Articulate, which – although its javascript is much cleaner – is also much more cumbersome to modify, because it actually implements an entire javascript API (e.g. SCORM_GetMaxTimeAllowed), rather than just wrapping the functions of the SCORM API.

  7. philip says:

    @jimmi

    it’s a different SWF, not the one in the scorm_support folder. It’s called MMTracking.swf, and doesn’t ship with Captivate.

    As for the Firefox bug in CP5, I haven’t encountered it myself, I’ve only heard of its existence.

    RE: the Articulate code, it’s a good idea to get familiar with it; it’s provided by Rustici Software (scorm.com), and is becoming widely adopted.

  8. Jimmi Thøgersen says:

    Ah, I finally get it. It’s not a matter of mmtracking.swf being needed as such, but a matter of it being a place to fix Captivate’s tracking (yeah, you said exactly that in the first post, but I somehow read it wrong – and yes, I was looking at scorm_support.swf) – thanks Philip 🙂

    I’ll wait until the problem shows up (if ever) before I fix it. Hoping this is the last time in a while that we’ll have to support Captivate, and I can focus on our internal authoring tool.

  9. Paul Linton says:

    Thanks for this series. It got CP 5 working with the BasicPlayer in the SharePoint Learning Kit (slk.codeplex.com) for me. I found that I need to SetValue(“cmi.exit”, “”) and SetValue(“adl.nav.request”, “continue”) just prior to calling Terminate(“”) within DoExternalInterface to get the BasicPlayer to correctly take back control when the course finishes.

    Even though I removed the scorm_support.htm and .swf entries from the manifest template I find that Captivate complains when publishing that the files are missing. No big deal, I have just added two empty files to \scorm_support.

    My javascript knowledge is not great and I found myself scratching my head trying to understand the Adobe code, it seemed to do many silly things and redundent things (windows 3.1, yikes!). Then I found this series of articles and the light was turned on. Many, many thanks.

  10. nancy says:

    I have no cents to add, just a few questions.

    What is mmtracking.swf?

    Why is our LMS vendor insisting it is a problem?

    LMS is IntraLearn (the Yugo of LMSs) and we use Captivate 5.5.

    • philip says:

      mmtracking.swf is a SWF that enables you to plug custom tracking mechanisms into Captivate. 99.9% of Captivate users will never see it or need it — mmtracking.swf is not even publicly available. Your vendor might think it’s a problem because Captivate SWFs always looks for the mmtracking.swf file when launching, generating a 404 “file not found” error. This is harmless and can be ignored.

  11. WL says:

    This is amazing stuff
    I’m sure I speak for the whole community when I say thanks
    One question if you can help….In the old template (yuk) I used to add 100% in place of the width and hight but doing so in the new improved one sends the swf off screen
    how do I get the swf to resize with the browser?

    thanks

    WL

  12. Yemi says:

    Hi,

    Am really not good with swf and flash programming, although would love to learn, after replacing the scorm 1.4 and scorm 2004 files with the ones recommended, i attempted publishing and got some errors after publishing.

    The title bar had “C:\stage\dev\source\components\ziputils\CPInternalZipUtils.cpp524

    said “Filedoesnt exist…\\publish_path\scorm_support\scorm_support.htm” and also for “scorm_support.swf”

    I published using the default IMS setting in captivate.

    I am using adobe captivate 5.5

    Please advise.

  13. Martin says:

    Hi Philip,

    Thanks a lot for your great work! We tried this hoping our problems get solved. Unfortunately we still have the same problem:

    SCORM 1.2 or 2004 files (no matter which combination of reporting options – we’ve tested 40 combinations, f.e. self paced learning on/off) are freezing LMS (f.e. Clixx or SAP LSO) if module contains Quiz slides and “Send resume data” is activated. Error appears if SCORM module is closed being on a quiz slide. After resuming the module the module freezes. Tested on Firefox and Internet Explorer several times. Tried using different SCORM templates – even your new templates. Same result. Must be a problem of Captivate itself?

    The result: Captivate modules containing quiz slides cannot be used in combination with “Send resume data” …

    Any ideas? Many thanks for your help!

    Best regards,
    Martin

    • philip says:

      @martin i haven’t encountered the issue myself, but i know it’s a problem for many others, depending on the LMS being used. it’s definitely a Captivate issue, and my hunch is that it’s either a result of the string formatting being used by Captivate, or that the string is too large and gets truncated, causing an error. I know the string truncation occurs with suspend_data in SCORM 1.2; the official limit is 4096 bytes, so it’s not hard to exceed that number when building large Captivate courses.

  14. Marek says:

    Hi,
    I found one problem in new solution. When I published my course with template SendTrackingDataAtEnd, the content was not visible in Web browsers. I chceked in the console of Browser and I found one error – CONFIG is not defined. IHMO there is a problem, because:
    – main htm file after publish with another template was changed,
    – in SCORM_support folder there is no files (scorm_support.swf and scorm_support.js) which are used by another template.

    • philip says:

      @marek SendTrackingDataAtEnd is independent of my template. As described in my posts, when installing my template, you will be replacing the built-in SCORM code. It is implied that any Captivate files relying on the old Captivate SCORM code — such as SendTrackingDataAtEnd — will fail.

      Really, the point of my template is to make SendTrackingDataAtEnd moot. SendTrackingDataAtEnd was created by Adobe as a workaround for the SCORM bugginess in their standard SCORM template; if you use my template you shouldn’t encounter those issues anymore. I suggest deleting SendTrackingDataAtEnd.

Comments are closed.