Report to an external LRS

Dec 30, 2021

Hello everyone,

I don't understand the meaning of the new option released in November 2021: publication for LMS and LRS. The documentation says:

"Actor is the information used by the LRS to identify each learner—for example, the full name and email address of a learner. You don't need to supply the actor when you publish for xAPI or cmi5—your LMS supplies the actor. However, you must provide the actor when you publish for both LRS and SCORM or AICC LMS or you publish for LRS only."

But what is the point then? If my LMS supports xAPI/CMI-5, why would I send data to another LRS?

This option makes sense for those LMS that only support SCORM and cannot provide an actor. Articulate Storyline should receive the actor via SCORM automatically, for example, as it is done here:

var studentID = pipwerks.SCORM.data.get("cmi.core.student_id");

One of the valid Inverse Functional Identifiers in xAPI is an account Object, which has two properties, homePage, and name. The name is the id that we just got through the SCORM API, and the homePage is an IRL that we must specify in the configuration of the course.

As you can see this launch method constructs the user identity in an artificial way: getting part of it from the LMS, and using a pre-configured value to complete it. Obviously, this will only be useful if that way of identifying users is acceptable in your situation.

18 Replies
Lauren Connelly

Hello Oleg!

I'm happy to clarify!

If my LMS supports xAPI/CMI-5, why would I send data to another LRS?

Any learning data can be captured with xAPI and cmi5. The LMS uses a conformant LRS to support both. With an LRS, you can build a learning ecosystem beyond the LMS and easily connect to other systems. LRSs aren't intended to replace LMSs. LRSs are more likely to be components of LMS.

Oleg Buylov

Hi Lauren,

Articulate has been supporting xAPI / CMI-5 for a long time. I don't understand what is the point of the November 2021 update. Prior to this update, Storyline courses were available in the LRS.

As I understand it, the point is to send data to two LRSs at the same time? But what is it for?

I was hoping that two standards could be supported: SCORM and xAPI (the course launched in the old LMS via SCORM and sends data to the LRS), but that doesn't work, since the old LMS cannot provide an actor. It is not possible to modify old LMS or cloud LMS that only support SCORM to provide an actor.

Oleg Buylov

Hi Lauren,

It can be any LMS that only supports SCORM: for example, iSpring Learn or WebTutor. LRS is installed separately, for example Learning Locker. It is necessary to transfer data simultaneously to LMS (which supports SCORM), for example, iSpring Learn, and to LRS, for example, Learning Locker.

Leslie McKerchie

Hi Oleg,

Check out our documentation here.

If you'd like to send to an LMS and an LRS, make sure both are selected.

In addition, since you're using SCORM, be sure to provide an Actor during your LRS configuration:

Your LRS admin or IT staff will use scripts to supply the LRS details, including the actor, endpoint, and credentials.

Oleg Buylov

Hi Leslie,

sorry for the bad english.

What I'm trying to say is: in old or cloud-based LMSs that only support SCORM, there is no way to provide an actor. Therefore, the new publishing options added in the November 2021 update don't make any sense. We cannot change the LMS configuration for us or our clients.

It makes sense if Articulate Storyline will automatically get an actor from SCORM, without involving IT staff. I gave in the post an example of the implementation of the approach in the courses Adapt Learning.

Here's a similar question from another user: https://community.articulate.com/discussions/articulate-storyline/how-do-i-create-an-actor-query-string-when-using-xapi-statemnt-trigger-but-publishing-for-scorm

Maria Costa-Stienstra

Hi, Oleg.

Thank you for reaching out and sharing your thoughts about the new feature in Storyline!

We also have a feature request logged for the ability to send actor information through variables (xAPI), which might work for what you're looking to accomplish, so I added this discussion to the report. 

We will update this discussion if we have any news to share or if this request makes it to our feature roadmap. 

Oleg Buylov

Hello!

I tested the Articulate Storyline update on February 15th 2022 and I hasten to report that I am absolutely satisfied with the new feature - JS templates for getting an actor. It works fantastic for old LMS.

I just have one question: is this the last new feature for Storyline? Roadmap is empty...

Stephen Wilhite
Oleg Buylov

I am absolutely satisfied with the new feature - JS templates for getting an actor. It works fantastic for old LMS.

Oleg, are you pulling SCORM variables (Student ID or Student Name) from your "old LMS" using this approach? I'm trying to adapt the "Static Account" template to grab the Student ID, but without success.

Oleg Buylov

Hello Stephen,

I'm using a personal JavaScript template, you can try:

lmsAPI = parent;
function getActor() {
return {
"objectType": "Agent",
"account": {
"homePage": "https://www.example.com",
"name": lmsAPI.GetStudentID(),
}
};
}
Unfortunately, I find it difficult to respond to this forum. I have to use VPN. Articulate Global, LLC has blocked access to all users from Russia.
Ken Haas

Hello Stephen,

Thank you for this Javascript!  It worked perfectly for me in ScormCloud but doesn't appear to work for all LMS's as it did not work for me within Cornerstone.  It actually breaks the course completely in Cornerstone.  The course gets stuck on the loading screen and never launches.

It took a lot of tinkering but I was finally able to get it to work for Cornerstone too by using the below JavaScript.  Just wanted to share for others that my find it valuable.

 

function findLMSAPI(win) {
// look in this window
if (win.hasOwnProperty("GetStudentID")) return win;

// all done if no parent
else if (win.parent == win) return null;

// climb up to parent window & look there
else return findLMSAPI(win.parent);
}

function getActor() {
var lmsAPI = findLMSAPI(this);
var myName = lmsAPI.GetStudentName();
return {
"objectType": "Agent",
"account": {
"homePage": "https://url.com",
"name": myName
}
};
}