Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
  • 한국 커뮤니티
0

Limit the use of learning applications

Explorer ,
Jul 23, 2017 Jul 23, 2017

Thinking since a few weeks about this constellations and try some things whenever finding time for it. And surely also searched here and in the web in general for the issue. Perhaps time to ask the community?

Principle scenario: A learning-application build with Captivate (for background-compatibility with colleagues in Captivate 8). As anybody here know this can be exported in different Formats. Let's forget all but
a. HTML5 for direct use on a Webserver or even local and
b. the same Version as SCORM-Export for use in LMS.

Thinking about two features that counts access of a unique export, regardless if used on different browsers on different computers or in an LMS or not.

Detail scenario 1: Users enter their name (or are set via LMS) when starting the learn-application. Every user gets a personal certificate with his name at the end. The application has to work only with a given number of named users. For example 20 persons with 20 different names can use it; if person 21 tries, it has to break up.

Detail scenario 2: Just count any access of the application. Means if a unique user start it 5 times (and get only 1 certificate) this counts as 5, if another one gets his certificate at first time this counts 1. When a given number of access is reached the application shows a message and breaks up (or even not start at all).

I know this is far behind of standard-features of captivate. And I even know that it is tricky and even suspect perhaps impossible.

Anyway, solutions, in every working form, are welcome.

Myself tried httprequests for a counter on a server. So far this works: Captivate (i mean the export from it) sends Data including a unique ID of the export via javascript to a php-file on a server wich sets an counter down. NOT working is getting this value back to captivate to check if it is still >= 0. Obvious a problem of same-origin-policy. I try to understand to work with JSON now. But nethertheless, even if i get this working, it only solves scenario 2 above.

So again: Perhaps someone with advance skills has an idea ore even solved one ore both describes constellations.

517
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jul 28, 2017 Jul 28, 2017

Perhaps let's make this question a bit clearer:

A learning-application build with captivate. It's use has to be limited regardless if used on different browsers on different computers or in an LMS or not. Export in HTML5.

Scenario 1: Users enter their name (or are set via LMS) when starting the learn-application. Every user gets a personal certificate with his name at the end. The application has to work only with a given number of named users. After this number is reached, it has not be used by another user more.

Scenario 2: Just count any access of the application. When a given number of access is reached the application shows a message and breaks up.

I look forward to ideas to one ore both of this scenarios.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jul 29, 2017 Jul 29, 2017

I doubt you'll get an answer in the Captivate forum. Both scenarios have to happen outside of Captivate. To me the easiest way would be by using a LMS, because it is a typical LMS functionality.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jul 30, 2017 Jul 30, 2017

That such things are only part of an lms was my first - and second - thought too.

But there are companies wich sells HTML5 or SCORM-Exports to use stand alone or in the lms of their clients with tiered pricing for the number of users.
I would wonder if the limitation is not controlled in a way.


Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jul 30, 2017 Jul 30, 2017

Each way of deployment can be cotrolled, by LMS or by server slide programming? But I doubt very much that a combination of all types of deployment could be controlled and limited.  There are apps (Moodle has one I believe) that allow to transfer data once a standalone app has access to the server, but it needs to be the same server. You are talking about something more complicated.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guide ,
Jul 31, 2017 Jul 31, 2017

On the LMS side, that's one big advantage and use of an LMS - is restricting uses. That's usually done via manual enrollments, but it depends on the system. There's no way to do that in Captivate natively. Something has to handle the registration and 'serving' of the published learning.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 01, 2017 Aug 01, 2017

OK, first: Thanks for the ideas and comments!

We are running a little bit in circles. Sure, a LMS provides Scenario 1.

And sure, ...

There's no way to do that in Captivate natively

means: There is no function in Captivate itself now for this. Right.
But I'm not sure that there is absolutely no way to solve this for now. Have some rough ideas in mind, but am not able to program it for myself.

by server slide programming

should be indeed the solution. My own try had gone in this direction and had failed till now. Perhaps I only do not understand the acces to the captivate variables and/or the JSON-Thing, that's why I asked for help. For me it feels that I - or we - are not far from somewhat working.

So: Is there anybody who can write a javascript-code that ...

1 sets own Captivate Variabe "known_user" to "no"
2 sets own Captivate Variable "LicCounter" to "0" (numeric)
3 Post the value of cpQuizInfoStudentName to a PHP-File on a different server. Lets say https://exampleserver.org/checklicence.php
4 ... and wait for responseText from the PHP with 2 values separated with "|"
[PHP-Procedere is clear and working or at least known as working]
5 switch to Captivate screen, let's say "010 - False 1 (no connection)" after 15 Seconds with no response

6 Set Variabe "known_user" to the value of the first data-part of responseText

7 Set Variable "LicCounter" to the value of the second data-part of responseText

6 switch to next Captivate screen, let's say "002 Feedback licence check"

... wich will be placed on a button in the first ("001") screen?
Here the user will be informed that it will be checked on a different server if he can proceed before.

From screen "002 Feedback licence check" I would inform ("You are a known User, proceed", "you are not a known user and there are no licences for new users left", "You are a new user and there are $$LicCounter$$ Lincences left. Please proceed") and show buttons wich lead to appropriate Screens.

If a get a working sample of the numbered java-script code I will try standalone HTML5 and a SCORM-LMS-Import and inform if the problem can be solved in this way. So we all know more after it.
If someone know for sure that this thing can no way work: OK, that would be an anwser too.

Nethertheless: Other ideas bejond a server-side-solution as outlined are still welcome. We do not know if such a script that sets captivate-variables from a far server is possible and perhaps we also have overlook a far easier solution.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Advisor ,
Aug 01, 2017 Aug 01, 2017

Yes... that can be done with JavaScript and server-side PHP.  However... it's not very secure.  Ideally, you'd want to secure access to the Cp content before they're actually viewing it.... like through a membership site where paid members have limited/special access to content.  Why?  Because once you can see the Cp content, you can use the JavaScript API to bypass any sort of license counter.  Your average user will not know how to do this, but a tech savvy one would have no problem doing this.  It all depends on how secure you want your content.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 01, 2017 Aug 01, 2017

Thanks Jim. It is already used in a constellation you describe as "more secure". But in this case an already available LMS of a customer can not be used.
The unsolved question is if it is possible to give away SCORM or HTML5 - Files for use in an enviroment wich you are not able to control with any - if not perfect - limitation on it. You think it should work in a not-really-secure way wich I outlined. OK, so I will again "fight"* with the code and try to make it work ...

* I'm no real programmer, that's why I use authoring tools

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 02, 2017 Aug 02, 2017
LATEST

OK, on the same server it works now. Downward the code on the button described above for everyone who is interested.

http://example.de/example.php sends back "teststudendname|8" - just for a test for future handle names and counters - wich is indeed showed in the HTML5-Export when it's on the same server.

countid is the ID of the individual Test-Export for one customer. Send to the php for the database

cpQuizInfoStudentName is the captivate/SCORM-Variable for the User-Name. If there are licences left or the user is known in the database (to come) as used the app before it will be the same as transmitted to the php, else it will be "no licence" e.g. given back from the php in his 1st data.

lizenzok will be the number on licences left or just a boolean transmittet by the php in his 2nd data.

It goes on slow - because of lack of knownledge and time of mine, but it goes on! And it goes better with the feedback signals in this forum than with someone I wanted to pay for a solution who said "no problem!" ... and never heard again.

More (for a different server) when I made it working.
Help to force this outcome or hints to "bad ideas" in the code below still gladly accepted!

//check if window.cpAPIInterface is available

if(window.cpAPIInterface)

{

    //check if window.cpAPIEventEmitter is available

    if(window.cpAPIEventEmitter)

    {

        //add a listener to CPAPI_INTERACTIVEITEMSUBMIT event

        window.cpAPIEventEmitter.addEventListener("CPAPI_INTERACTIVEITEMSUBMIT",function(e)

                                                                    {

// Eigentliche Funktion ANFANG

function createReqObj() {

  brws = navigator.appName; 

  if(brws == "Microsoft Internet Explorer"){

      rq = new ActiveXObject("Microsoft.XMLHTTP");

  } else {

      rq = new XMLHttpRequest();

      return rq; }

}

rqo = createReqObj();

function PostRequest() {

   var cp= document.Captivate;

   cp.cpEIGetValue("m_VarHandle");

   result1 = m_VarHandle.countid;

   result2 = m_VarHandle.cpQuizInfoStudentName;

    rqo.open ('POST', 'http://example.de/example.php', true);

                rqo.onreadystatechange = receive;

    rqo.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');

    Feld1 = "licence_id=" ;

    Feld2 = "test_Name=" ;

    rqo.send (Feld1 + result1 + "&" + Feld2  + result2);

}

function receive() {

    if(rqo.readyState == 4 && rqo.status == 200){

          var ergeb = rqo.responseText;

        var WHATtoDO = ergeb.indexOf("|");

        if (WHATtoDO > 1) {       

              elements = ergeb.split("|");

                                      m_VarHandle.cpQuizInfoStudentName = elements[0];

                                      m_VarHandle.lizenzok = parseInt(elements[1]);

                                      cp.cpEISetValue("m_VarHandle");

                                      document.Captivate = cp;

        }

    }

}

PostRequest();

// Eigentliche Funktion ENDE

                                                                    });

    }

}

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Resources
Help resources