LearningLocker / learninglocker

Learning Locker - The Open Source Learning Record Store. Started in 2014.
https://learningpool.com/solutions/learning-record-store-learning-locker/learning-locker-community-overview/
GNU General Public License v3.0
555 stars 276 forks source link

Storyline 2 - Object Description #535

Closed davidpesce closed 9 years ago

davidpesce commented 9 years ago

Version 1.3.4

Steps to reproduce the bug

  1. Launch content created with Articulate Storyline v2
  2. Go through various slides
  3. Check LL statements and only see the ActivityID displayed rather than the description
  4. Checking the MongoDB, the description does not appear to be stored.

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:

Admin User experienced Playing Golf | 21 hours ago (Mon, Mar 2, 2015 9:55 PM)

When viewing the Articulate courses, I get statements like this:

Admin User experienced http://6FVyxTN5JBq_course_id/6DUXi98D5qT | 4 days ago (Fri, Feb 27, 2015 1:45 AM)
davidpesce commented 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>
garemoko commented 9 years ago

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.

davidpesce commented 9 years ago

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.

https://community.articulate.com/discussions/articulate-storyline/articulate-storyline-tincan-api-change-activity-id-for-modules#reply-237465

I'm currently digging through the story.js file to see if there's anyway this can be hacked together.

fugu13 commented 9 years ago

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.

davidpesce commented 9 years ago

That's a bummer. Looks like I'll be creating some courses from scratch!

davidpesce commented 9 years ago

Closing, since this isn't an actual LL issue.

ryasmi commented 9 years ago

Thanks for reporting the issue and following our guidelines @davidpesce :+1: thanks for your input @garemoko. Glad this is resolved.

hallshouse commented 9 years ago

@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"}]}&registration=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!

ryasmi commented 9 years ago

@hallshouse you're not using valid JSON for the mbox, please refer back to the guide on learninglocker.net.

[{"mailto:dhall@videotron.ca"}]}

hallshouse commented 9 years ago

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}&registration=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

davidpesce commented 9 years ago

Oddly, the full link (above) works for me. It doesn't show a full course, just a blank SL Player.

davidpesce commented 9 years ago

Works now!

hallshouse commented 9 years ago

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

ryasmi commented 9 years ago

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/

davidpesce commented 9 years ago

@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!

hallshouse commented 9 years ago

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

ryasmi commented 9 years ago

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.

garemoko commented 9 years ago

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?

hallshouse commented 9 years ago

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:

0 /var/www/learninglocker/bootstrap/compiled.php(5036): Illuminate\Routing\RouteCollection->match(Object(Illuminate\Http\Request))

1 /var/www/learninglocker/bootstrap/compiled.php(5024): Illuminate\Routing\Router->findRoute(Object(Illuminate\Http\Request))

2 /var/www/learninglocker/bootstrap/compiled.php(5016): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))

3 /var/www/learninglocker/bootstrap/compiled.php(717): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))

4 /var/www/learninglocker/bootstrap/compiled.php(698): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request))

5 /var/www/learninglocker/bootstrap/compiled.php(7738): Illuminate\Foundation\Application->handle(Object(Illuminate\Http\Request), 1, true)

6 /var/www/learninglocker/bootstrap/compiled.php(8341): Illuminate\Session\Middleware->handle(Object(Illuminate\Http\Request), 1, true)

7 /var/www/learninglocker/bootstrap/compiled.php(8288): Illuminate\Cookie\Queue->handle(Object(Illuminate\Http\Request), 1, true)

8 /var/www/learninglocker/bootstrap/compiled.php(10953): Illuminate\Cookie\Guard->handle(Object(Illuminate\Http\Request), 1, true)

9 /var/www/learninglocker/bootstrap/compiled.php(659): Stack\StackedHttpKernel->handle(Object(Illuminate\Http\Request))

10 /var/www/learninglocker/public/index.php(49): Illuminate\Foundation\Application->run()

11 {main} [] []

[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:

0 /var/www/learninglocker/app/controllers/xapi/BaseController.php(85): Controllers\xAPI\BaseController->validateValue('activityId', 'holiday_in-laws', 'iri')

1 /var/www/learninglocker/app/controllers/xapi/DocumentController.php(270): Controllers\xAPI\BaseController->requiredValue('activityId', 'holiday_in-laws', 'iri')

2 /var/www/learninglocker/app/controllers/xapi/DocumentController.php(31): Controllers\xAPI\DocumentController->checkParams(Array, Array, Array)

3 /var/www/learninglocker/app/controllers/xapi/DocumentController.php(69): Controllers\xAPI\DocumentController->getShowData()

4 /var/www/learninglocker/app/controllers/xapi/BaseController.php(51): Controllers\xAPI\DocumentController->show()

5 /var/www/learninglocker/app/controllers/xapi/BaseController.php(43): Controllers\xAPI\BaseController->get()

6 [internal function]: Controllers\xAPI\BaseController->selectMethod()

7 /var/www/learninglocker/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(231): call_user_func_array(Array, Array)

8 /var/www/learninglocker/bootstrap/compiled.php(5816): Illuminate\Routing\Controller->callAction('selectMethod', Array)

9 /var/www/learninglocker/bootstrap/compiled.php(5804): Illuminate\Routing\ControllerDispatcher->call(Object(Controllers\xAPI\StateController), Object(Illuminate\Routing\Route), 'selectMethod')

10 /var/www/learninglocker/bootstrap/compiled.php(5003): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'Controllers\xAP...', 'selectMethod')

11 [internal function]: Illuminate\Routing\Router->Illuminate\Routing{closure}()

12 /var/www/learninglocker/bootstrap/compiled.php(5362): call_user_func_array(Object(Closure), Array)

13 /var/www/learninglocker/bootstrap/compiled.php(5028): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request))

14 /var/www/learninglocker/bootstrap/compiled.php(5016): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))

15 /var/www/learninglocker/bootstrap/compiled.php(717): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))

16 /var/www/learninglocker/bootstrap/compiled.php(698): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request))

17 /var/www/learninglocker/bootstrap/compiled.php(7738): Illuminate\Foundation\Application->handle(Object(Illuminate\Http\Request), 1, true)

18 /var/www/learninglocker/bootstrap/compiled.php(8341): Illuminate\Session\Middleware->handle(Object(Illuminate\Http\Request), 1, true)

19 /var/www/learninglocker/bootstrap/compiled.php(8288): Illuminate\Cookie\Queue->handle(Object(Illuminate\Http\Request), 1, true)

20 /var/www/learninglocker/bootstrap/compiled.php(10953): Illuminate\Cookie\Guard->handle(Object(Illuminate\Http\Request), 1, true)

21 /var/www/learninglocker/bootstrap/compiled.php(659): Stack\StackedHttpKernel->handle(Object(Illuminate\Http\Request))

22 /var/www/learninglocker/public/index.php(49): Illuminate\Foundation\Application->run()

23 {main} [] []

[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:

0 /var/www/learninglocker/app/controllers/xapi/DocumentController.php(69): Controllers\xAPI\DocumentController->documentResponse(Array)

1 /var/www/learninglocker/app/controllers/xapi/BaseController.php(51): Controllers\xAPI\DocumentController->show()

2 /var/www/learninglocker/app/controllers/xapi/BaseController.php(43): Controllers\xAPI\BaseController->get()

3 [internal function]: Controllers\xAPI\BaseController->selectMethod()

4 /var/www/learninglocker/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(231): call_user_func_array(Array, Array)

5 /var/www/learninglocker/bootstrap/compiled.php(5816): Illuminate\Routing\Controller->callAction('selectMethod', Array)

6 /var/www/learninglocker/bootstrap/compiled.php(5804): Illuminate\Routing\ControllerDispatcher->call(Object(Controllers\xAPI\StateController), Object(Illuminate\Routing\Route), 'selectMethod')

7 /var/www/learninglocker/bootstrap/compiled.php(5003): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'Controllers\xAP...', 'selectMethod')

8 [internal function]: Illuminate\Routing\Router->Illuminate\Routing{closure}()

9 /var/www/learninglocker/bootstrap/compiled.php(5362): call_user_func_array(Object(Closure), Array)

10 /var/www/learninglocker/bootstrap/compiled.php(5028): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request))

11 /var/www/learninglocker/bootstrap/compiled.php(5016): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))

12 /var/www/learninglocker/bootstrap/compiled.php(717): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))

13 /var/www/learninglocker/bootstrap/compiled.php(698): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request))

14 /var/www/learninglocker/bootstrap/compiled.php(7738): Illuminate\Foundation\Application->handle(Object(Illuminate\Http\Request), 1, true)

15 /var/www/learninglocker/bootstrap/compiled.php(8341): Illuminate\Session\Middleware->handle(Object(Illuminate\Http\Request), 1, true)

16 /var/www/learninglocker/bootstrap/compiled.php(8288): Illuminate\Cookie\Queue->handle(Object(Illuminate\Http\Request), 1, true)

17 /var/www/learninglocker/bootstrap/compiled.php(10953): Illuminate\Cookie\Guard->handle(Object(Illuminate\Http\Request), 1, true)

18 /var/www/learninglocker/bootstrap/compiled.php(659): Stack\StackedHttpKernel->handle(Object(Illuminate\Http\Request))

19 /var/www/learninglocker/public/index.php(49): Illuminate\Foundation\Application->run()

20 {main} [] []

[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:

0 /var/www/learninglocker/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(77): Illuminate\Routing\Controller->isInstanceFilter('@getLrs')

1 /var/www/learninglocker/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(45): Illuminate\Routing\Controller->parseFilter('@getLrs', Array)

2 /var/www/learninglocker/app/controllers/xapi/BasicRequestController.php(22): Illuminate\Routing\Controller->beforeFilter('@getLrs')

3 [internal function]: Controllers\xAPI\BasicRequestController->__construct(Object(Locker\Repository\Client\EloquentRepository))

4 /var/www/learninglocker/bootstrap/compiled.php(253): ReflectionClass->newInstanceArgs(Array)

5 /var/www/learninglocker/bootstrap/compiled.php(210): Illuminate\Container\Container->build('Controllers\xAP...', Array)

6 /var/www/learninglocker/bootstrap/compiled.php(585): Illuminate\Container\Container->make('Controllers\xAP...', Array)

7 /var/www/learninglocker/bootstrap/compiled.php(5811): Illuminate\Foundation\Application->make('Controllers\xAP...')

8 /var/www/learninglocker/bootstrap/compiled.php(5800): Illuminate\Routing\ControllerDispatcher->makeController('Controllers\xAP...')

9 /var/www/learninglocker/bootstrap/compiled.php(5003): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'Controllers\xAP...', 'store')

10 [internal function]: Illuminate\Routing\Router->Illuminate\Routing{closure}()

11 /var/www/learninglocker/bootstrap/compiled.php(5362): call_user_func_array(Object(Closure), Array)

12 /var/www/learninglocker/bootstrap/compiled.php(5028): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request))

13 /var/www/learninglocker/bootstrap/compiled.php(5016): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))

14 /var/www/learninglocker/bootstrap/compiled.php(717): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))

15 /var/www/learninglocker/bootstrap/compiled.php(698): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request))

16 /var/www/learninglocker/bootstrap/compiled.php(7738): Illuminate\Foundation\Application->handle(Object(Illuminate\Http\Request), 1, true)

17 /var/www/learninglocker/bootstrap/compiled.php(8341): Illuminate\Session\Middleware->handle(Object(Illuminate\Http\Request), 1, true)

18 /var/www/learninglocker/bootstrap/compiled.php(8288): Illuminate\Cookie\Queue->handle(Object(Illuminate\Http\Request), 1, true)

19 /var/www/learninglocker/bootstrap/compiled.php(10953): Illuminate\Cookie\Guard->handle(Object(Illuminate\Http\Request), 1, true)

20 /var/www/learninglocker/bootstrap/compiled.php(659): Stack\StackedHttpKernel->handle(Object(Illuminate\Http\Request))

21 /var/www/learninglocker/public/index.php(49): Illuminate\Foundation\Application->run()

22 {main} [] []

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"}]}&registration=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

garemoko commented 9 years ago

[2015-06-03 15:39:05] local.ERROR: exception 'Locker\Helpers\Exceptions\NotFound' with message 'Could not find state with idhttp://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.

ryasmi commented 9 years ago

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

garemoko commented 9 years ago

@ryansmith94 Depending on how it's configured, yes Moodle might do. Storyline won't.

ryasmi commented 9 years ago

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.

hallshouse commented 9 years ago

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.

davidpesce commented 9 years ago

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"]}&registration=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.

davidpesce commented 9 years ago

To encode/decode URLs, I use this: http://meyerweb.com/eric/tools/dencoder/

hallshouse commented 9 years ago

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"]}&registration=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.

ryasmi commented 9 years ago

@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?

hallshouse commented 9 years ago

@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.

ryasmi commented 9 years ago

@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.

ryasmi commented 9 years ago

Updated the blog post.

davidpesce commented 9 years ago

@hallshouse Awesome news! Glad I could help!!

ryasmi commented 9 years ago

Just realised I tagged @davidpesce instead of @hallshouse in my last comment, sorry.