Home » Cleaning up Adobe Captivate’s SCORM Publishing Template, Part 6: Bugs & Scope Creep

Cleaning up Adobe Captivate’s SCORM Publishing Template, Part 6: Bugs & Scope Creep

For this blog post, I was going to write a summary of the changes to the template and wrap up the series. Instead, I’m looking at ways to increase the template’s flexibility and hot-rod it for some cool other stuff.

First, in case you missed it, here are the first five parts of the series:

  1. Part 1: Introduction
  2. Part 2: HTML
  3. Part 3: JavaScript
  4. Part 4: SCORM
  5. Part 5: Finishing up

This series has been an exercise in refactoring; I walked through the code and continued to refine it until I reached a point where the template performed as I felt it should have; a bare minimum of functionality was met, with a sprinkle of extra goodness.

The problem is, when it comes to refactoring code, you’re never really done! Flaws are found, ideas pop into your head when you’re trying to go to sleep, and suggestions come along, all prompting another look at your work. Bug fixes and new features (aka scope creep) rule the roost. This project is no exception.

Regarding bug fixes, as part of the cleanup process, I added a feature that displays an error message to the learner when the SCORM API isn’t found; this works great when launching the course from an LMS, but as Infosemantics’ Rod Ward pointed out, it prevents the developer from previewing the course locally. Oops. I also noticed that the code I added for centering the SWF makes the ‘no SCORM’ message look strangely off-center, in the rare cases where you’d see it. No worries, it will be fixed.

Regarding new features, there are many ways we can improve the template, or at least make it more flexible. For example:

  • We can add a debug mode that logs SCORM commands to the console; the debug mode could be toggled on or off via the CONFIG object in the HTML file.
  • Some Captivate developers like to use JavaScript with their course; the addition of the SWFObject callback function makes it trickier for developers to know where to place their extra code. We can help by providing a clearly defined space for these developers.
  • We can provide a compressed version of the template’s scorm_support.js file, which reduces file size.
  • We haven’t touched the imsmanifest.xml file, but there are probably some improvements we can make there, as well.

I’m sure there are other possibilities I’m leaving out. Improvement is an ongoing process, and I would love to hear any ideas you might have about improving Captivate’s SCORM 2004 publishing template. Post a comment below, or message me on Twitter.

(Note: I’m not a fuddy-duddy, but I will ignore and sometimes delete off-topic comments; I tend to get a lot of these, and they’re a drag to deal with. If you have general e-learning questions, please post them on the E-Learning Technology and Development Google Group, which I moderate.)

Reminder: all of this work is centered on Captivate 5.5, not older versions. Captivate versions 4 and 5 require a little bit of help from the inside (ActionScript delivered via a second SWF). I might cover that ground in a future post if I have time.

Update: I was mistaken about Captivate 5 — this revised template should work fine with both 5.0 and 5.5.

Continue to Part 7 of the series.

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


  1. Linda says:

    This is awesome Philip! Thank you so much!

    One of the issues I tried to solve with my customized publishing template involved Captivate loading two modules in one LMS course. I know this isn’t the best thing to do, but Captivate’s built in quizzing feature didn’t work well when we had both knowledge check questions and a randomized exam at the end as part of the module. So I hacked together some javascript that made swfobject load the exam swf when the user clicked a button. This works semi well, since the exam is essentially the only part that gets graded.

    Some issues I ran into involved resume data (I have the javascript only sending the resume data when the content is loaded vs the exam).

  2. philip says:

    @linda that’s an interesting scenario. When SCORM is involved, you’re going to have a hard time shoehorning two Captivate SWFs into one SCORM SCO. It would probably be better to load them as two separate SCOs. It may require two launches from the LMS, but otherwise SCORM already supports this behavior, so you wouldn’t need to use hacks anymore.

    When you try and shoehorn them into one SCO, you run into problems because each Captivate SWF maintains its own score data, bookmarks, etc. They also try to start and stop (initialize and terminate) the SCORM communication, which causes problems. The only way I can see it working is if you turn off SCORM in the main SWF, and just use SCORM for the quiz.

    Ideally you’d go to the root of the problem — “Captivate’s built in quizzing feature didn’t work well when we had both knowledge check questions and a randomized exam at the end as part of the module” — and fix that instead.

    Are you tracking the results of the knowledge checks? If so, you might have better success if you disable tracking on the KC questions and only track scores on the quiz itself. Since the KC questions aren’t part of the exam, anyway, they shouldn’t be counted towards the exam’s score.

  3. Rod Ward says:

    Phil, I’ve been loving the new templates and look forward to testing them in various LMSs. I had followed your installation instructions to the letter, including the one about deleting the redundant scorm_support.htm and scorm_support.swf files in the scorm_support folder. But I ran into an issue on the weekend when I tried to zip a SCORM lesson using your new template setup. The Cp5.5 zip utility complained about the zip file possibly being corrupted because it didn’t contain these now redundant files. Fortunately I had also followed your instruction to back up my Publish folder, so I was able to dig them out of the backup and throw them them back where they belonged. Then the zip utility stopped complaining and I was able to publish without error messages popping up.

  4. philip says:

    @rod thanks for the feedback. I was just working on that very issue — I neglected to remove two lines from the manifest file that point to the old files. Delete the references to scorm_support.htm and scorm_support.swf in Manifest2004.xml file (you can find them around line 108). That should do the trick.

  5. Jonathan says:

    Philip, Great work on cleaning this up. I was actually searching the internet for exactly this. The code on adobe presenter 7 actually has comments from the developers about “it would be nice if this worked, but it doesn’t yet”. I’m going to test your 1.2 files in the adobe presenter 7 publish with our Oracle Learning Management system.

    I did have one question/suggestion. I haven’t looked through your code fully, but do you have anything in the code to handle the LMS Communication Error that gets returned if your session expires or your internet drops? Right now the LMS will send communication issues on the LMSCommits but just lets the student keep plugging along through the content till they exit (which of course saves nothing). I’ve been looking into an option to give the user a pop-up if a communication error occurs to let them know they have to restart the course.

  6. Jonathan says:

    @Philip, I know what you mean, most LMS systems have it built in to warn a user when their session expires. Oracle Learning Management doesn’t, so I’m stuck either modifying the API or modifying the content. Do you have any suggestions or resources (I can’t seem to find a good piece of code to start with).

    Side Note: I tried using the code with Adobe Presenter 7, but it is different enough, I might use some of your code to change parts, but it is a whole different system. Management here likes the “presenter wrapper” opposed to the captivate version, so I’m stuck with Presenter.

    Thanks for both your site and help, it’s more useful than the Adobe site.

  7. Michael says:

    Hi Philip,

    Great work!

    I recommend declaring “standard.js” in the manifest.xml and manifest2004.xml files as well while you are at it.

    Some LMS’s might complain or fail to import “undeclared resources” and since “standard.js” is a default file for all Captivate courses it is better to declare it under the RESOURCE node in the manifest files.


    • philip says:

      @micheal yes, that’s a great suggestion, i completely overlooked that. any resources used by the course should be declared in the manifest to ensure proper SCORM conformance.

  8. ahsijetaisriche says:

    First of all, congratulations to you. We were in a situation where Captivate 5 contents did not load into our LMS running on IE 6, 7 and 8 (and running fine in any other browser), and with your files it works fine.
    I have only one problem left. We successfully record all user information in our LMS, including SCORM interaction data. But we cannot get some session data, such as status, raw score or scaled score. We have added a SCORM wrapper which shows any SCORM API call, and these calls do not appear. We have checked the Captivate parameters regarding quiz and SCORM reporting, and everything seems correct. Any idea ?

    • philip says:

      @ahsijetaisriche thanks. it appears i accidentally introduced a bug in my code that prevents some data from being transferred. i already have plans to fix it, watch the github page for updates.

Comments are closed.