Forum Discussion
Everything we know about Cornerstone on Demand and Storyline!
I thought I would start a thread about Cornerstone on Demand so there's a central place for people to read and add to. There seems to be a dearth of information about how CSOD and Storyline interact with each other as well as the unresolved issues surrounding it. I've spent many hours scouring the web and speaking with Cornerstone trying to find a solution. Hopefully this thread will serve as a resource for others going forward.
On a side note, I love Articulate Storyline. I started with Adobe Captivate with limited success. It was a very steep learning curve, but I was able to get some basic functionality out of it. I tested out Storyline with it's 30 day trial, and I will say that time-to-effectiveness was drastically reduced. It really IS like using powerpoint. Granted there is less complex functionality and interactions available than Captivate, but so far it's given me everything I've needed to use. The benefit is that the learning curve is much less steep too. Think of it as the difference between iMovie and Final Cut Pro. The latter can do some crazy effects, but the former gives you 90% of what you need and can get you comfortable in 1/4 of the time.
It's nice to have a properly-working content creation tool when you're in an LMS like Cornerstone. I have enough trouble in CSOD as it is.
So some of the nuggets of wisdom that I've found are :
- Cornerstone does not track SCORM 1.2 content properly. You cannot pull a lot of the reports if they are not in SCORM 2004 format. You don't have the option to select that course in the reports.
- If you export into SCORM 2004, there will be an extra section on the left with text links to the module. This takes up 30% of the screen, and on smaller laptop screens may crowd out the module window. Cornerstone says this is a Storyline exporting settings issue. I couldn't find any settings that shows/hides that section. The workaround is to resize the module to the screen, which doesn't get rid of the section, but at least fits the module.
- When reporting, you can get the completion status for a course based on quiz result or last slide viewed. You can also get a final grade for course. Storyline passes the results information for each question (including short answer) but you cannot pull a list of the answers for an individual. Therefore, it may not be advisable to administer any testing where you'll need to review individual answers
- You can get a list of aggregate answers for a module. e.g. I can see how 100 employees answered this multiple choice question. This is helpful to determine if learners are absorbing the course information correctly.
- Web objects (such as websites, or links to sharepoint documents) work in modules if your IT has added csod.com to the trusted sites
- Popup windows that open up the articulate module in CSOD will work if you add csod.com to the allowed list for popup blockers. Your IT dept can also add this to everyone's computer. Otherwise when learners click the "launch" button, the module does not show up.
I'll post more as I think or find them, but feel free to add to this list!
912 Replies
- ChrisUndery-aeaCommunity Member
This may be a query better suited to CSOD but thought I'd try here as well. Does anyone know if it is possible to get a deep link working inside an iframe to present SL3 content inside a CSOD custom page. I want to include a brief overview (built in SL3) visible on an CSOD custom page so tried adding as a deep link inside an iframe. It sort of works but it registers and opens the actual course in a separate tab rather than it being visible inside the frame.
Any other alternatives to getting SL3 content visible (via the LMS) inside a web page (CSOD or Intranet) would be appreciated.
- SteveFlowersCommunity Member
Hi, Chris -
Are you wanting to track progress or just display the content? If you are just wanting to display the content, here's how you can grab the launch point of the story.html file:
1) Launch the content after registering the LO in Chrome (this can also be done in other browsers but the steps are a little different)
2) When the content launches, select the address bar and hit CTRL-SHIFT-J. This will open developer tools.
3) Click the sources tab in the Developer Tools window.
4) Expand the activityFrame item, then expand the xxxx.csod.com item. Expand the content folder that ends in publications/xxx.
5) Scroll down until you see index_lms_html5.html or index_lms.html (depending on how you published)
6) Right-click the index_xxx.html item and Copy Link Address.
It will look something like this:
https://xxxx.csod.com/content/xxxx/publications/677/index_lms_html5.html
Change the index_lms_html5 or index_lms to story.
https://xxxx.csod.com/content/xxxx/publications/677/story.html
Now you can use the direct link in your iframe and the content should display right on the page. It won't track but it will display.- ChrisUndery-aeaCommunity Member
Steve, is it possible to do this with a course that was created in RISE rather than Storyline as it doesn't seem to work?
(PS. I'm aware I'm replying to a post that is 4 years old :))
- ChrisUndery-aeaCommunity Member
Thanks Steve, at the moment I'm not bothered about it tracking so I'll have a go at the above (we use IE110 and may come back for some more help.
If this is linked to the version uploaded to CSOD am I correct in assuming the link wil break if the course is reversioned?
- SteveFlowersCommunity Member
Yes. If the course is reversioned, a new publication number is assigned. This is also (I think) subject to availability settings but I could be wrong. The direct link is not available if not logged in.
- SteveFlowersCommunity Member
Developer tools are launched in IE10 with F12, I think.
Steve
- ChrisUndery-aeaCommunity Member
Thank you Steve, this works like a charm. Don't suppose you know a clever way of doing the same but where we can track the course?
Hey Joseph,
You're running into an issue with a Table of Contents from your LMS as well? Looks like Jason mentioned here that CSOD was able to resolve this for him, so hopefully you'll be able to get that handled quickly as well.
- ChrisUndery-aeaCommunity Member
I'm trying to learn a bit more about SCORM and was hoping some nice person out there might be able to point me in the direction of a useful resource (our publish standard at bottom of post). I want to better understand what is sent from SL3 to CSOD and when - I keep reading about terms like .cmi, suspend, normal etc but I'm never quite sure what they actually mean from a practical perspective. I think that a more enhanced fundamental understanding will help me troubleshoot problems better.
What would be even better would be if I could then understand how the different settings in SL3 affect what is sent and when.
Any help would be greatly appreciated. We use SL3 & CSOD and publish as SCORM 2004 3rd edition (Complete/Incomplete).
- SteveFlowersCommunity Member
Hey, Chris -
Here's the complete API reference for SCORM 2004. The second link is a printable poster:
https://scorm.com/scorm-explained/technical-scorm/run-time/run-time-reference/
https://scorm.com/scorm-explained/scorm-resources/reference-poster/One of the easier ways to see what's going on is to register for a SCORM Cloud account at http://cloud.scorm.com
Using this tool, you can see the log of all of the API calls made in a Storyline module. It's one of the best ways that I have found to troubleshoot a module. I've pasted an example of a debug log below. Here you see:
- Initialization of the API. In CSOD, when you click launch, the window changes state to loading. Then a new window is launched with your content. This window uses a unique identifier for the learning object and the user to tell the API where in the database to look for the user's information and where to put it.
- The first thing Storyline does is get the lesson_mode. This will almost always return as normal. I have seen where some cases returned review but only in older versions of Moodle. This tells the course how to run (browse, normal, or review). I don't think storyline will set anything but normal but I could be wrong.
- Then Storyline requests the lesson_status. Lesson status is how the LMS knows you're done or not. In a new launch, you'll probably see 'not attempted'. If SL receives not attempted, it will respond to the LMS to set it to 'incomplete'. In CSOD, this is translated to In Progress.
- I expanded the line below at 05:32:772 to show what the SCORM Cloud is doing in response to a request.
- The line you see for LMSGetValue('cmi.core.student_name') isn't something that Storyline requests. I added that in a Javascript trigger. I used that information to display the name of the participant in a text field and also to generate an xAPI agent (another complicated explanation) to report data to an LRS in addition to the LMS and enable a 'trainer's gradebook' of simulation actions that we could not provide in CSOD.
- This module is set to not retain progress and start fresh with every launch. So you're not seeing any suspend_data calls. After each slide change, you should see an LMSSetValue('cmi.suspend_data') call. This sends the "LMS Cookie" to the LMS so when you resume the SL runtime knows how to suss it out.
- When the learner has met the conditions for completion (Quiz result, slide count, completion trigger), the score and lesson status are sent from the SL file.
+ [00:05:47.364] LMSSetValue('cmi.core.score.raw', '100') returned 'true' in 0.001 seconds
+ [00:05:47.365] LMSSetValue('cmi.core.score.max', '100') returned 'true' in 0 seconds
+ [00:05:47.365] LMSSetValue('cmi.core.score.min', '0') returned 'true' in 0 seconds
+ [00:05:47.365] LMSSetValue('cmi.core.lesson_status', 'completed') returned 'true' in 0.001
- And finally, when you exit the module, the session_time is recorded with a call from SL to set that value, the exit state is set to "suspend", LMSCommit is called, as is LMSFinish. This cleans everything up, ensures the right values are sent to the LMS, and closes out the API connection. You can't send anything else after LMSFinish (LMS dependent) until you again initialize the API.
[23:52:10.198] LMSCommit('') returned 'true' in 0 seconds
[23:52:10.198] Checking for Commit Error
[23:52:10.198] Call is error free.
- [23:52:10.198] LMSFinish('')
[23:52:10.198] Checking for Finish Error
[23:52:10.198] Call is error free.
[23:52:10.198] Close Out Session
[23:52:10.198] Mode = normal
[23:52:10.198] Credit = credit
[23:52:10.198] CompletionStatus = completed
[23:52:10.198] SuccessStatus = unknown
[23:52:10.198] MasteryScore = null
[23:52:10.198] Score = 100
[23:52:10.198] Sco was taken for credit
[23:52:10.198] Sco is completed so resetting credit to no-credit and mode to review
[23:52:10.198] Next entry is normal
[23:52:10.199] Session Time: PT12M43.35S (76335 hundredths)
[23:52:10.199] Previous Time: PT0H0M0S (0 hundredths)
[23:52:10.199] New Total Time: PT12M43.35S (76335 hundredths)
[23:52:10.199] New Tracked Total Time: PT12M45.98S
Example log from SCORM Cloud
[00:05:29.786] Beginning prerequisites evaluation of activity loan_01
[00:05:29.786] Beginning prerequisites evaluation of activity loan_01
[00:05:29.786] Beginning prerequisites evaluation of activity loan_01_SCO
+ [00:05:32.771] LMSInitialize('') returned 'true' in 0 seconds
+ [00:05:32.771] LMSGetValue('cmi.core.lesson_mode') returned 'normal' in 0 seconds
[00:05:32.771] LMSGetLastError() returned '0' in 0 seconds
+ [00:05:32.771] LMSGetValue('cmi.core.lesson_mode') returned 'normal' in 0.001 seconds
[00:05:32.772] LMSGetLastError() returned '0' in 0 seconds
+ [00:05:32.772] LMSGetValue('cmi.core.lesson_status') returned 'not attempted' in 0 seconds
[00:05:32.772] LMSGetLastError() returned '0' in 0 seconds
- [00:05:32.772] LMSSetValue('cmi.core.lesson_status', 'incomplete') returned 'true' in 0.002 seconds
[00:05:32.773] CheckForSetValueError (cmi.core.lesson_status, incomplete, cmi.core.lesson_status, , )
[00:05:32.773] Element is: lesson_status
[00:05:32.773] Call is error free.
[00:05:32.774] StoreValue (cmi.core.lesson_status, incomplete, cmi.core.lesson_status, , )
[00:05:32.774] Element is: lesson_status
[00:05:32.774] StatusSetInCurrentSession = false, CompletionStatus=unknown
[00:05:32.774] Allowing status change
[00:05:32.774] RunTimeApi_ImmediateRollup called
[00:05:32.774] Transferring RTE data to Activity data
[00:05:32.774] Rolling up activity data
- [00:05:32.774] LMSSetValue('cmi.core.exit', 'suspend') returned 'true' in 0 seconds
[00:05:32.774] CheckForSetValueError (cmi.core.exit, suspend, cmi.core.exit, , )
[00:05:32.774] Element is: exit
[00:05:32.774] Call is error free.
[00:05:32.774] StoreValue (cmi.core.exit, suspend, cmi.core.exit, , )
[00:05:32.774] Element is: exit
- [00:05:32.903] LMSGetValue('cmi.core.student_name') returned 'Flowers, Steve' in 0 seconds
[00:05:32.903] CheckForGetValueError (cmi.core.student_name, cmi.core.student_name, , )
[00:05:32.903] Call is error free.
[00:05:32.903] RetrieveGetValueData (cmi.core.student_name, cmi.core.student_name, , )
[00:05:32.903] Element is: student name
[00:05:32.903] LMSGetLastError() returned '0' in 0 seconds
+ [00:05:32.903] LMSGetValue('cmi.core.student_name') returned 'Flowers, Steve' in 0 seconds
[00:05:32.903] LMSGetLastError() returned '0' in 0 seconds
[00:05:32.925] Beginning prerequisites evaluation of activity loan_01
[00:05:32.925] Beginning prerequisites evaluation of activity loan_01
[00:05:32.925] Beginning prerequisites evaluation of activity loan_01_SCO
+ [00:05:36.152] LMSGetValue('cmi.core.student_name') returned 'Flowers, Steve' in 0 seconds
[00:05:36.152] LMSGetLastError() returned '0' in 0 seconds
+ [00:05:36.152] LMSGetValue('cmi.core.student_name') returned 'Flowers, Steve' in 0 seconds
[00:05:36.152] LMSGetLastError() returned '0' in 0 seconds
+ [00:05:47.364] LMSSetValue('cmi.core.score.raw', '100') returned 'true' in 0.001 seconds
+ [00:05:47.365] LMSSetValue('cmi.core.score.max', '100') returned 'true' in 0 seconds
+ [00:05:47.365] LMSSetValue('cmi.core.score.min', '0') returned 'true' in 0 seconds
+ [00:05:47.365] LMSSetValue('cmi.core.lesson_status', 'completed') returned 'true' in 0.001 seconds
[00:05:47.516] Beginning prerequisites evaluation of activity loan_01
[00:05:47.516] Beginning prerequisites evaluation of activity loan_01
[00:05:47.516] Beginning prerequisites evaluation of activity loan_01_SCO
[00:05:47.668] Beginning prerequisites evaluation of activity loan_01
[00:05:47.668] Beginning prerequisites evaluation of activity loan_01
[00:05:47.668] Beginning prerequisites evaluation of activity loan_01_SCO
+ [00:06:00.778] LMSSetValue('cmi.core.session_time', '0000:00:28.0') returned 'true' in 0.001 seconds
+ [00:06:00.779] LMSSetValue('cmi.core.exit', 'suspend') returned 'true' in 0 seconds
+ [00:06:00.779] LMSCommit('') returned 'true' in 0 seconds
+ [00:06:00.779] LMSFinish('') returned 'true' in 0.001 seconds
+ [00:06:00.780] Pre-evaluation of exit action
+ [00:06:01.231] OverallSequencingProcess for SCORM 1.1 / SCORM 1.2 returned '' in 0.632 seconds
+ [00:06:01.912] OverallSequencingProcess for SCORM 1.1 / SCORM 1.2 - SteveFlowersCommunity Member
The example above was for SCORM 1.2. You'll see different data model calls in SCORM 2004. For example, lesson_status is completion_status in 2004.
Part 2 of the long explanation. In a conformant LMS, all of the runtime calls listed in the reference model can be called from the browser using Javascript. This means even if the content (storyline) doesn't have it built in, you could use Javascript to access the API to set or get values.
Example, if you wanted to add something to the comments data field, you could call LMSSetValue on the cmi.comments_from_learner.n.comment and store away some text. You'd need a way to retrieve that within the module since you cannot report this data in CSOD.
Storyline stores quiz responses in the cmi.interactions data elements. This can be reported using CSOD. There are a lot of cmi-interactions... calls when a question is submitted. Not that only questions associated with the results slide used to track completion of your module will be submitted by Storyline. There are neat things you can do to store values using a quiz question.
Another note, Storyline uses a standard API to submit to the LMS. But the player uses an abstraction of functions to reach that end. If you want to communicate with the LMS directly, you can choose to use the standard LMS API calls in Javascript, or use Storyline's abstracted functions.
Example direct call:
LMSSetValue('cmi.core.score.max', '100')... and all of the other score setting calls (raw, min)
or Storyline's player functions:
lmsAPI=parent;
lmsAPI.SetScore(90, 100, 0);
SetStatus("completed")I've found the manual calls to be less reliable and subject to change so much of the time, I have been setting them directly using the standard calls. It's more script but I know it's going to go through even if Articulate changes something in their player functions.
- ChrisUndery-aeaCommunity Member
Thanks Steve, lots for me to read through. If we allow a learner to take a quiz twice, do you know if there is a way to get CSOD to record both attempts along with all question attempts as I believe the SCO overwrites the records in the LMS as standard?
- SteveFlowersCommunity Member
All of the question attempts will be recorded.There is only one score and status field.
Related Content
- 7 months ago
- 8 months ago
- 4 months ago
- 6 months ago