Closed davidpesce closed 9 years ago
Additional Info Here's the tincan.xml file published via Storyline v2
<?xml version="1.0" encoding="utf-8"?>
<tincan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://projecttincan.com/tincan.xsd">
<activities>
<activity id="http://6FVyxTN5JBq_course_id" type="http://adlnet.gov/expapi/activities/course">
<name lang="und">Articulate Storyline 2 - xAPI Test Course</name>
<description lang="und" />
<launch lang="und">story.html</launch>
</activity>
<activity id="http://6FVyxTN5JBq_course_id/5UuVh2O1NO0" type="http://adlnet.gov/expapi/activities/objective">
<name lang="und">Articulate Storyline 2 - xAPI Test Course</name>
<description lang="und">Articulate Storyline 2 - xAPI Test Course</description>
</activity>
<activity id="http://6FVyxTN5JBq_course_id/5yyklupHTGz" type="http://adlnet.gov/expapi/activities/module">
<name lang="und">Welcome slide</name>
<description lang="und">Welcome slide</description>
</activity>
<activity id="http://6FVyxTN5JBq_course_id/5gvEKshCSeN" type="http://adlnet.gov/expapi/activities/module">
<name lang="und">content slide</name>
<description lang="und">content slide</description>
</activity>
<activity id="http://6FVyxTN5JBq_course_id/61OIKJOogJV" type="http://adlnet.gov/expapi/activities/module">
<name lang="und">Summary</name>
<description lang="und">Summary</description>
</activity>
<activity id="http://6FVyxTN5JBq_course_id/6DUXi98D5qT" type="http://adlnet.gov/expapi/activities/module">
<name lang="und">Results Slide</name>
<description lang="und">Results Slide</description>
</activity>
<activity id="http://6FVyxTN5JBq_course_id/5abFMfDqBnb" type="http://adlnet.gov/expapi/activities/module">
<name lang="und">I’m as tall as an elephant.</name>
<description lang="und">I’m as tall as an elephant.</description>
</activity>
<activity id="http://6FVyxTN5JBq_course_id/5abFMfDqBnb/5gxm9XNuJki" type="http://adlnet.gov/expapi/activities/cmi.interaction">
<name lang="und">I’m as tall as an elephant.</name>
<description lang="und">I’m as tall as an elephant.</description>
<interactionType>choice</interactionType>
<correctResponsePatterns>
<correctResponsePattern>choice_61AZyRWkoKp</correctResponsePattern>
</correctResponsePatterns>
<choices>
<component>
<id>choice_6S8k13hnOca</id>
<description lang="und">True</description>
</component>
<component>
<id>choice_61AZyRWkoKp</id>
<description lang="und">False</description>
</component>
</choices>
</activity>
<activity id="http://6FVyxTN5JBq_course_id/6OP7rjIAs1Z" type="http://adlnet.gov/expapi/activities/module">
<name lang="und">What is the capitol of New York State?</name>
<description lang="und">What is the capitol of New York State?</description>
</activity>
<activity id="http://6FVyxTN5JBq_course_id/6OP7rjIAs1Z/6TkRy1JVtoo" type="http://adlnet.gov/expapi/activities/cmi.interaction">
<name lang="und">What is the capitol of New York State?</name>
<description lang="und">What is the capitol of New York State?</description>
<interactionType>choice</interactionType>
<correctResponsePatterns>
<correctResponsePattern>choice_5qipgIk0fD8</correctResponsePattern>
</correctResponsePatterns>
<choices>
<component>
<id>choice_5qipgIk0fD8</id>
<description lang="und">Albany</description>
</component>
<component>
<id>choice_6844Y2NZI6o</id>
<description lang="und">Rochester</description>
</component>
<component>
<id>choice_5Zxtgs1Fj41</id>
<description lang="und">Syracuse</description>
</component>
<component>
<id>choice_6PyFS3rQsW5</id>
<description lang="und">New York City</description>
</component>
</choices>
</activity>
</activities>
</tincan>
Learning Locker doesn't read the TinCan.xml file because it's not uploaded to Learning Locker. Technically this isn't a bug, rather it's a lack of feature. By only including the data in tincan.xml, Storyline is saying "we only support content being uploaded to an LMS", which is fine.
I'm not sure if this is a person who can speak for Articulate, but it doesn't sound like they plan on changing the current functionality.
I'm currently digging through the story.js file to see if there's anyway this can be hacked together.
Yeah, the details of Articulate's support for xAPI are pretty shamefully bad (for some examples: horrible activity IDs that run roughshod over web principles, silent cloning of identifiers when you copy slides between courses even if you change them a lot after, awful passthrough of launch parameters making it necessary to have to special case rapid authoring tools in launching applications).
We've provided them feedback and been willing to help out, but they haven't paid attention, and given they seem dedicated to not changing their very bad practices, I don't see a point to being quiet about them any more.
That's a bummer. Looks like I'll be creating some courses from scratch!
Closing, since this isn't an actual LL issue.
Thanks for reporting the issue and following our guidelines @davidpesce :+1: thanks for your input @garemoko. Glad this is resolved.
@davidpesce Can you please share an example Storyline2 launch URL. As I've read above, your are actually communicating with LL from SL2. I'm not able to using the following launch link:
http://lrs.learning-templates.com/uploads/users/test/story.html?endpoint=http://lrs.learning-templates.com/data/xAPI&auth=Basic YjZjYWFlM2ZjNzUyOTk3OGRmYzIxNDBlMzQ2MjhmMDMxZTQ5NjUxYjo4ZTM2NzVjMjBhM2JmODIzZTAwNDIxMmZiNTExMmJjY2I1YWVkMDQ3&actor={"objectType":"Agent","name":["Dennis Hall"],"mbox":[{"mailto:dhall@videotron.ca"}]}®istration=0072356f-3de8-4792-ab8a-e2d8a3295db5&activity_id=6JEgR4URzlS_course_id
With the launch URL above, I'm only getting the SL config. data missing or incorrect message displayed.
Any help with this launch URL would be great!
@hallshouse you're not using valid JSON for the mbox, please refer back to the guide on learninglocker.net.
[{"mailto:dhall@videotron.ca"}]}
Yes I see that error which I had corrected in my launch code, but failed to correct in my text file. Sorry about that.
Here is the launch URL I just tried (based on the LL.net post): In Storyline, I'm only entering the project launch URL (which is what Articulate says to do): http://lrs.learning-templates.com/uploads/users/test/story.html In my browser I'm using the following URL (as is): http://lrs.learning-templates.com/uploads/users/test/story.html?endpont=http://lrs.learning-templates.com/data/xAPI&auth=Basic%20YzZjNzdhMmY1OWY4ZTQ4ZTA1YWE5MWYwNWM5YWQ3Nzc5ODkwZmUwZjplNjc4YjVjODBjYWM5ZGNmMTdjYjhiNTkzZmE1YjhiOGFhMTdmZDY4&actor={%22mbox%22:%22mailto:dhall@videotron.ca%22,%22name%22:%22Dennis%20Hall%22}®istration=0072356f-3de8-4792-ab8a-e2d8a3295db5&activity_id=6JEgR4URzlS_course_id
The result of using the above scenario is a 404 error displayed in the course and no communication with the LRS.
If you were to adjust the URL I pasted in my first comment and correct the typo in it, it would still not function.
Best Regards, Dennis Hall
Oddly, the full link (above) works for me. It doesn't show a full course, just a blank SL Player.
Works now!
Thanks for the feedback David:
If you are describing the URL I entered above, my LRS has not received any experience statements from the course. The last statement I have displayed is "1 day ago (Mon, Jun 1, 2015 6:04 PM)"
Best Regards, Dennis Hall
That link worked for me too. The activity id in your URL is not valid though, it should be a valid IRI.
Here is a link to the Storyline 2 blog post on LL if anyone wants it: http://learninglocker.net/2014/10/27/767/
@hallshouse the article above is what got me going!
Something we noticed with another project using this, was that the HTML5 version of the SL output does not work with LL (or any other LRS we tried). It wouldn't connect.
Another gotcha, is making sure you post the published course to a web server. I tried running it locally on xampp and it never worked correctly.
Hopefully this helps!
Changed my URI and it still did not work.
Finally – out of frustration – I just installed Moodle on my LMS VPS and used the Tin Can Launch plugin. It works fine now using the same information I copied from my Tin Can Query URL( the one you were looking at – that did not work for me).
Unfortunately, this causes me to rethink my business plan as I really do not want to use Moodle.
Best Regards,
Dennis Hall
phone_sm 450.461.3633
web_sm http://products-and-services.ca/ Products and Services.Canada favicon http://popular-networking.com/ Popular Networking LT_Logo_sm-32x30 http://learning-templates.com/ Learning Templates
From: Ryan Smith [mailto:notifications@github.com] Sent: Wednesday, June 03, 2015 05:33 To: LearningLocker/learninglocker Cc: Dennis Hall Subject: Re: [learninglocker] Storyline 2 - Object Description (#535)
That link worked for me too. The activity id in your URL is not valid though, it should be a valid IRI.
Here is a link to the Storyline 2 blog post on LL if anyone wants it: http://learninglocker.net/2014/10/27/767/
— Reply to this email directly or view it on GitHub https://github.com/LearningLocker/learninglocker/issues/535#issuecomment-108265947 . https://github.com/notifications/beacon/AKucsWnEIya37opP9gMVekv356nEqxfGks5oPsFAgaJpZM4Do6LN.gif
I can understand your frustrations, it's a shame Storeline 2 sends requests as if it were using IE8 all the time.
Please can you clear your "app/storage/logs/laravel.log" file, then reproduce the issue and paste the contents of the previously cleared file here.
As far as Storyline is concerned, all the Moodle launch plugin is generate the querystring URL. So the question is, what's different between the two URLs - the working one and the broken one?
Hi Ryan:
I have developed custom players and Widgets for Storyline and Captivate (using Flash and HTML5), however, beyond that, the only IE fact I had tested against and discovered to be true about Storyline is that it relies on IE to be installed on the local computer in order to preview and publish projects.
I’ve worked for LMS development houses 3 times in my career. I have a long history as a Learning Systems developer and have been an LMS expert from AICC, through all SCORM versions, and have successfully integrated a Skill Soft platform and a competitors LRS with a SharePoint LMS for the U.N. I have not had issues doing something as simple as this before. On the U.N. LRS, I ran Storyline courses without issue – using the articulate procedure.
Anyhow, needing to move forward…
Prior to making the project work in Moodle, my Laravel.log was a repetition of the following:
Stack trace:
[2015-06-02 13:33:35] local.ERROR: exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' in /var/www/learninglocker/bootstrap/compiled.php:5719
Then today, I got the following change (consistent with your statement):
[2015-06-03 13:38:54] local.ERROR: exception 'Locker\Helpers\Exceptions\Exception' with message 'activityId
is not a valid IRI in params. ' in /var/www/learninglocker/app/controllers/xapi/BaseController.php:108
Immediately after that I got this output:
[2015-06-03 13:40:09] local.ERROR: exception 'Locker\Helpers\Exceptions\Exception' with message 'activityId
is not a valid IRI in params. ' in /var/www/learninglocker/app/controllers/xapi/BaseController.php:108
Then later ( I believe around the time I was setting up Moodle):
[2015-06-03 15:39:05] local.ERROR: exception 'Locker\Helpers\Exceptions\NotFound' with message 'Could not find state with id http://tincanapi.co.uk/stateapikeys/registrations
' in /var/www/learninglocker/app/controllers/xapi/DocumentController.php:224
[2015-06-03 15:39:10] local.ERROR: exception 'InvalidArgumentException' with message 'Filter method [@getLrs] does not exist.' in /var/www/learninglocker/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:129
and…
Stack trace:
[2015-06-03 15:39:09] local.ERROR: exception 'Locker\Helpers\Exceptions\NotFound' with message 'Could not find state with id http://tincanapi.co.uk/stateapikeys/registrations
' in /var/www/learninglocker/app/controllers/xapi/DocumentController.php:224
After changing the Activity_id inside Storyline to “id.tincan.com/activity/tincan-prototypes/holiday_in-laws”, then clearing the log and running the course, here is the result:
[2015-06-03 18:40:32] local.ERROR: exception 'InvalidArgumentException' with message 'Filter method [@getLrs] does not exist.' in /var/www/learninglocker/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:129
Stack trace:
Inside Storyline, I have the following settings:
Activity ID: id.tincan.com/activity/tincan-prototypes/holiday_in-laws
Launch URL: http://lrs.learning-templates.com/uploads/users/test/story.html
In the Moodle Tin Can Launch Link Plugin, I have the following settings:
Endpoint: http://lrs.learning-templates.com/data/xAPI/ ( notice the retrun of the end / )
Basic login: c6c77a2f59f8e48e05aa91f05c9ad7779890fe0f (not encoded – straight from LL)
Basic Password: e678b5c80cac9dcf17cb8b593fa5b8b8aa17fd68 (not encoded – straight from LL)
Version: 1.0.0
Duration: 9999
Module settings: LRS integrated basic authentication
The Moodle course has nothing special except to select the Tin Can Launch Link in the Course Format > Activity Type drop-down.
For the record, I did try to launch the course using the following:
http://lrs.learning-templates.com/uploads/users/test/story.html?endpoint=http://lrs.learning-templates.com/data/xAPI&auth=Basic%20YjZjYWFlM2ZjNzUyOTk3OGRmYzIxNDBlMzQ2MjhmMDMxZTQ5NjUxYjo4ZTM2NzVjMjBhM2JmODIzZTAwNDIxMmZiNTExMmJjY2I1YWVkMDQ3&actor={"objectType":"Agent","name":["Dennis Hall"],"mbox":[{"mailto:dhall@videotron.ca"}]}®istration=0072356f-3de8-4792-ab8a-e2d8a3295db5&activity_id=http://id.tincan.com/activity/tincan-prototypes/holiday_in-laws
and got “Configuration data is missing or incorrect. Please try again.”
Best Regards,
Dennis Hall
phone_sm 450.461.3633
web_sm http://products-and-services.ca/ Products and Services.Canada favicon http://popular-networking.com/ Popular Networking LT_Logo_sm-32x30 http://learning-templates.com/ Learning Templates
From: Ryan Smith [mailto:notifications@github.com] Sent: Wednesday, June 03, 2015 12:53 To: LearningLocker/learninglocker Cc: Dennis Hall Subject: Re: [learninglocker] Storyline 2 - Object Description (#535)
I can understand your frustrations, it's a shame Storeline 2 sends requests as if it were using IE8 all the time.
Please can you clear your "app/storage/logs/laravel.log" file, then reproduce the issue and paste the contents of the previously cleared file here.
— Reply to this email directly or view it on GitHub https://github.com/LearningLocker/learninglocker/issues/535#issuecomment-108521559 . https://github.com/notifications/beacon/AKucsbLVl4ueXZKuF7Q7wwKZdi6w-fghks5oPyiGgaJpZM4Do6LN.gif
[2015-06-03 15:39:05] local.ERROR: exception 'Locker\Helpers\Exceptions\NotFound' with message 'Could not find state with id
http://tincanapi.co.uk/stateapikeys/registrations' in /var/www/learninglocker/app/controllers/xapi/DocumentController.php:224
This would have been generated when you launched an activity from Moodle for the first time for a given user. Moodle would request a state document that doesn't exist until the second time round for each user. Not sure if it should be an exception; the LRS should return 404 which I think LL does.
Thanks for that @hallshouse.
@garemoko we do throw a 404 exception for that, all exceptions are caught in the routes and the getStatusCode
method is called to return the required status code for the exception.
@garemoko does the Moodle plugin (or Storyline) utilise the POST data/xAPI/Basic/request
route? That route seems to be throwing the filter error (see snippet 1 below).
local.ERROR: exception 'InvalidArgumentException' with message 'Filter method [@getLrs] does not exist.'
Snippet 1 - Exception thrown from the BasicRequestController
@ryansmith94 Depending on how it's configured, yes Moodle might do. Storyline won't.
Ok, other than the incorrect activityid I can't see why there are problems with Storyline. None of those errors other than the activityid looked like they were caused by Storyline.
Even with the activity_id, I had only changed it to a the a path to the experience. Have you attempted the full launch link I provided at the end of my communication?
My goal is still to use this format and get out of Moodle only using LL and WP. Eventually, I want to create a WP Plugin that will create build the launch link.
I'm not sure if this is necessary, but I think you need to encode everything after the "?". https://www.articulate.com/tincanapi/
I also removed some of your brackets that were unnecessary.
URL Before Encoding:
http://lrs.learning-templates.com/uploads/users/test/story.html?endpoint=http://lrs.learning-templates.com/data/xAPI&auth=Basic%20YjZjYWFlM2ZjNzUyOTk3OGRmYzIxNDBlMzQ2MjhmMDMxZTQ5NjUxYjo4ZTM2NzVjMjBhM2JmODIzZTAwNDIxMmZiNTExMmJjY2I1YWVkMDQ3&actor={"objectType":"Agent","name":["Dennis Hall"],"mbox":["mailto:dhall@videotron.ca"]}®istration=0072356f-3de8-4792-ab8a-e2d8a3295db5&activity_id=http://id.tincan.com/activity/tincan-prototypes/holiday_in-laws
URL After Encoding:
http://lrs.learning-templates.com/uploads/users/test/story.html?endpoint%3Dhttp%3A%2F%2Flrs.learning-templates.com%2Fdata%2FxAPI%26auth%3DBasic%2520YjZjYWFlM2ZjNzUyOTk3OGRmYzIxNDBlMzQ2MjhmMDMxZTQ5NjUxYjo4ZTM2NzVjMjBhM2JmODIzZTAwNDIxMmZiNTExMmJjY2I1YWVkMDQ3%26actor%3D%7B%22objectType%22%3A%22Agent%22%2C%22name%22%3A%5B%22Dennis%20Hall%22%5D%2C%22mbox%22%3A%5B%22mailto%3Adhall%40videotron.ca%22%5D%7D%26registration%3D0072356f-3de8-4792-ab8a-e2d8a3295db5%26activity_id%3Dhttp%3A%2F%2Fid.tincan.com%2Factivity%2Ftincan-prototypes%2Fholiday_in-laws
With this I am at least getting a different error (404). Check this link for extra clues: https://www.articulate.com/tincanapi/ At this point, I'm wondering if it's a publish setting within SL.
To encode/decode URLs, I use this: http://meyerweb.com/eric/tools/dencoder/
Holly crap!!! David... You just got it. With the URLEncoded output, I added the slash at the end of the endpoint URL and it works. WHOO HOOO!!!!
Good-bye Moodle :)
FYI: I also just tried the non-URLEncoded version as follows:
http://lrs.learning-templates.com/uploads/users/test/story.html?endpoint=http://lrs.learning-templates.com/data/xAPI&auth=Basic%20YjZjYWFlM2ZjNzUyOTk3OGRmYzIxNDBlMzQ2MjhmMDMxZTQ5NjUxYjo4ZTM2NzVjMjBhM2JmODIzZTAwNDIxMmZiNTExMmJjY2I1YWVkMDQ3&actor={"objectType":"Agent","name":["Dennis Hall"],"mbox":["mailto:dhall@videotron.ca"]}®istration=0072356f-3de8-4792-ab8a-e2d8a3295db5&activity_id=http://id.tincan.com/activity/tincan-prototypes/holiday_in-laws
It works perfectly.
@ryansmith94 I would recommend updating the Storyline instructions as this was tested directly from the URL without using Moodle or Wordpress.
BTW: Without the / at the end of XAPI, it works in FF and Chrome. In IE11, I must have the / after XAPI. So it works in all browsers so far.
@hallshouse That's great! What do I need to update in the instructions? Step 7 does say to encode the URL parameters (see quote below).
You should also URL encode your url parameter values which you can do by using an online encoder. My Launch after encoding (copy the link address).
Does the URL work in FF and Chrome with the "/" at the end of "xAPI" too?
@ryansmith94 I agree it should be URL encoded. I did od this but posted the link in my previous reply for readability.
In your blog post it seemed I had to put all my full URL encoded launch URL in the Storyline Publish > Tin Can > Launch URL. It also seemed I could leave the Activity Id as the Articulate default. In reality, the Activity Id needed to be fully qualified (as you stated previously) You do not enter the request type (http://) in that field, but do enter the full path. Here is what I have in the Storyline publish settings: Inside Storyline, I have the following settings: Activity ID: id.tincan.com/activity/tincan-prototypes/holiday_in-laws Launch URL: http://lrs.learning-templates.com/uploads/users/test/story.html
Also, I would keep the trailing "/" after XAPI as this works across all browsers (so it's safer). I'll take care of this change in the manage.partial today and submit a pull request. On this subject, I would also like to update all the tables in LL to standardize them since I had made the change in the LRS partials. I'll take care of that today as well and submit another pull request.
If you want, I'll re-write your bog post this weekend and submit to you for you to replace the blog post.
@davidpesce no worries :+1:
seemed I could leave the Activity Id as the Articulate default. In reality, the Activity Id needed to be fully qualified
I'll update the blog post to reflect that this needs to be changed.
keep the trailing "/" after XAPI as this works across all browsers (so it's safer)
Agreed and the PRs sound good, give you a chance to practise making more PRs too :smile:
If you want, I'll re-write your bog post this weekend and submit to you for you to replace the blog post.
I don't think we need to re-write it, just provide a little extra information. I'll also link to this issue in the blog post in case people what further information.
Updated the blog post.
@hallshouse Awesome news! Glad I could help!!
Just realised I tagged @davidpesce instead of @hallshouse in my last comment, sorry.
Version 1.3.4
Steps to reproduce the bug
Expected behaviour Description should be displayed rather than the ActivityID IRI
Actual behaviour ActivityID is displayed as URL rather than description
Server information CentOS 7.0 x64
Client information OS: Widnows 8.1 Browser: Firefox (latest)
Additional information I'm not sure if this is a LL issue or a Storyline issue. When viewing the TC Golf course, I get statements like this:
When viewing the Articulate courses, I get statements like this: