try {
if ($this->action === 'scormcloud') {
- $scormURL = ScormCloud::send($url, 'toolbox_' . $this->type . '_' . $this->entry->id, true);
+ $scormURL = ScormCloud::send($url, 'toolbox_' . $this->type . '_' . $this->entry->id);
$body .= "<br><br>";
$body .= __('Le package peut ĂȘtre testĂ© sur SCORM Cloud : <a href=":url">:url</a>', ['url' => $scormURL]);
}
$vdir->copyDirectory(resource_path('elearningmedia/dist/css'), 'css');
$vdir->copyDirectory(resource_path('elearningmedia/dist/js'), 'js');
if ($type === 'pdf') {
- $vdir->copyDirectory(resource_path('pdfjs-legacy-min'), 'pdfjs');
- $css = file_get_contents(resource_path('pdfjs-legacy-min/web/viewer.css'));
+ $vdir->copyDirectory(resource_path('pdfjs-legacy'), 'pdfjs');
+ $css = file_get_contents(resource_path('pdfjs-legacy/web/viewer.css'));
$css .= 'body{--sidebar-width:400px;}';
$css .= '#openFile,#pageRotateCw,#pageRotateCcw,#pageRotateCcw + .horizontalToolbarSeparator{display:none !important;}';
$css .= '#viewBookmark,#print,#download{display:none !important}';
namespace App\Models;
+use App\Fields\SCORMVersion;
use App\Http\Controllers\Admin\Operations\ELearningPackage\ImportOperation;
use App\Http\Controllers\Admin\Operations\ELearningPackage\PreviewOperation;
use App\Http\Controllers\Admin\Operations\ELearningPackage\DownloadOperation;
use App\Models\Base\ToolboxModel;
+use App\Models\Traits\SCORMVersionTrait;
use App\Services\WorkshopV2;
use App\SubForms\ElearningPackageContent;
use Cubist\Backpack\Magic\Fields\BunchOfFieldsMultiple;
class ELearningPackage extends ToolboxModel
{
+ use SCORMVersionTrait;
+
protected $table = 'elearning_package';
protected $_options = ['name' => 'elearning-package',
parent::setFields();
$this->addField('title', Text::class, __('Titre'), ['column' => true]);
+ $this->addField(['name' => 'scorm_version',
+ 'label' => __('Version SCORM'),
+ 'column' => true,
+ 'type' => SCORMVersion::class,
+ 'default' => Version::SCORM_2004,
+ 'database_default' => Version::SCORM_2004,
+ ]
+ );
$this->addField('description', Textarea::class, __('Description'));
$this->addOwnerField();
$data = ['title' => $this->title, 'description' => $this->description, 'modules' => $modules];
$vdir->file_put_contents('data.js', 'const DATA=' . json_encode($data) . ';');
- $vdir->file_put_contents('imsmanifest.xml', new Manifest($this->title, Version::SCORM_2004, $organization, 'PACKAGE_' . $this->id));
+ $vdir->file_put_contents('imsmanifest.xml', new Manifest($this->title, $this->scorm_version, $organization, 'PACKAGE_' . $this->id));
$vdir->copyDirectory(resource_path('elearningpackage/dist/css'), 'css');
$vdir->copyDirectory(resource_path('elearningpackage/dist/js'), 'js');
$vdir->copyDirectory(resource_path('elearningpackage/dist/fonts'), 'fonts');
$workshop = new WorkshopV2($user);
$workshop->installBook($id, $tmp, [], 'scorm');
- if(file_exists($tmp.'/imsmanifest.xml')) {
+ if (file_exists($tmp . '/imsmanifest.xml')) {
unlink($tmp . '/imsmanifest.xml');
}
$vdir->copyDirectory($tmp, $basePath);
return null;
}
$quiz->compile($tmp, true);
- if(file_exists($tmp.'/imsmanifest.xml')) {
+ if (file_exists($tmp . '/imsmanifest.xml')) {
unlink($tmp . '/imsmanifest.xml');
}
$vdir->copyDirectory($tmp, $basePath);
}
$file = $f->getPath();
$title = ELearningMedia::compileFromFile($file, $tmp, '', $organization, 'MEDIA_' . $media_file);
- if(file_exists($tmp.'/imsmanifest.xml')) {
+ if (file_exists($tmp . '/imsmanifest.xml')) {
unlink($tmp . '/imsmanifest.xml');
}
$vdir->copyDirectory($tmp, $basePath);
}
$media->compile($tmp);
- if(file_exists($tmp.'/imsmanifest.xml')) {
+ if (file_exists($tmp . '/imsmanifest.xml')) {
unlink($tmp . '/imsmanifest.xml');
}
}
}
- if(file_exists($tmp.'/imsmanifest.xml')) {
+ if (file_exists($tmp . '/imsmanifest.xml')) {
unlink($tmp . '/imsmanifest.xml');
}
$vdir->copyDirectory($tmp, $basePath);
}
}, 1000);
} else if (window.type === 'pdf') {
- var interval = setInterval(function () {
- try {
- var pdfViewer = document.getElementById('player').contentWindow.PDFViewerApplication.pdfViewer;
- var total = pdfViewer.pagesCount;
- var current = pdfViewer._currentPageNumber;
- if (total > 0 && current / total >= pc) {
- markComplete(interval);
+ var playerIframe = document.getElementById('player');
+ playerIframe.addEventListener('load', function () {
+ var playerWindow = playerIframe.contentWindow;
+
+
+ var interval = setInterval(function () {
+ console.log('Check pdf progress');
+ try {
+ var app = playerWindow.PDFViewerApplication;
+ if (app === undefined || app === null) {
+ return;
+ }
+ var pdfViewer = app.pdfViewer;
+ if (pdfViewer === undefined || pdfViewer === null) {
+ return;
+ }
+
+ var total = pdfViewer.pagesCount;
+ var current = pdfViewer._currentPageNumber;
+ if (total > 0 && current / total >= pc) {
+ markComplete(interval);
+ }
+
+ } catch (e) {
+ console.error('Error while updating pdf course status');
+ console.error(e);
}
- } catch (e) {
-
- }
- },1000);
+ }, 1000);
+ });
}
player.on('ready', function () {
}
function scormSecondsToTimeInterval(diff) {
- var diff = Math.round(diff);
+ diff = Math.round(diff);
var h = Math.floor(diff / 3600);
diff = diff % 3600;
var m = Math.floor(diff / 60);
if (isNaN(score100)) {
score100 = -1;
}
- console.log(score100, completed, score);
if (score100 > 0) {
- setScormValue('cmi.score.raw', score100);
- setScormValue('cmi.score.scaled', score100 / 100);
- setScormValue('cmi.score.min', 0);
- setScormValue('cmi.score.max', 100);
+ setSCORMScore(score100, 100, 0, score100 / 100);
}
if (!isNaN(score100) && score100 > 0) {
setScormValue('success_status', 'passed');
} else {
setScormValue('success_status', 'unknown');
}
- setScormValue('status', completed ? 'completed' : 'incomplete');
+ setScormValue('status', completed ? 'completed' : 'incomplete',true);
}
function getModuleData(id) {
$('title').text(DATA.title);
$('tbody').html('');
-
$.each(DATA.modules, function (k, v) {
var s = window.savedState[v.id];
var lock = '';
var lockstatus = 'none';
var lockCol = '';
if (v.lock) {
- console.log(v.lock);
lock = 'data-lock="';
lockstatus = 'unlocked';
lockCol = getSpriteIcon('lock-unlocked');
}, GetDiagnostic: function (code) {
return '';
}, _log: function (log) {
- console.log('SCORM facade : ' + log);
+ console.log('SCORM facade ('+currentModule.id+') : ' + log);
},
};
import {SCORM} from "pipwerks-scorm-api-wrapper";
+window.SCORM__ = SCORM;
window.pako = require('pako');
window.SCORM_INITED = false;
'exit': 'cmi.exit',
};
+window.scormVersion = function () {
+ return SCORM.version;
+}
+
window.initScorm = function () {
if (SCORM_INITED) {
return;
SCORM_INITED = true;
try {
if (SCORM.init()) {
+ console.info('SCORM OK');
+ console.info(SCORM.API.getHandle());
SCORM_OK = true;
}
} catch (e) {
window.setSCORMLocation = function (location) {
let json = JSON.stringify(location);
- console.log(json);
let deflate = pako.deflate(json);
- console.log(deflate);
let b64 = bytesArrToBase64(deflate);
- console.log(b64);
- return setScormValue('location', b64);
+ return setScormValue('suspend_data', b64);
};
window.setSCORMScore = function (score, max, min, scaled) {
if (cmi == '') {
return null;
}
- return SCORM.get(cmi);
+ var res = SCORM.get(cmi);
+ console.info('get SCORM value `' + cmi + '` : ' + res);
+ return res;
};
window.getScormLocation = function (defaultLocation) {
if (!SCORM_OK) {
return defaultLocation;
}
- var currentLocation = getScormValue('location');
+ var currentLocation = getScormValue('suspend_data');
if (currentLocation.indexOf('[') === -1 && currentLocation.indexOf('{') === -1) {
// Maybe a zipped string
try {
currentLocation = pako.inflate(base64ToBytesArr(currentLocation), {to: 'string'})
- console.log(currentLocation);
} catch (e) {
console.warn('Unable to uncompress the data');
currentLocation = '';
return res;
}
-window.setScormValue = function (elementName, value) {
+window.setScormValue = function (elementName, value, save) {
if (!SCORM_OK) {
return;
}
- var cmi = _cmi(elementName);
+ let cmi = _cmi(elementName);
if (cmi == '') {
return false;
}
- var result = SCORM.set(cmi, value);
- return result;
+ console.info('set SCORM value `' + cmi + '` : ' + value);
+ let res = SCORM.set(cmi, value);
+ if (save === true) {
+ SCORM.save();
+ }
+ return res;
};
if (!SCORM_OK) {
return;
}
+ setScormValue('status', "completed", true);
scormExit();
};
scormClose();
}
+window.scormComplete = function () {
+ scormMarkAsComplete();
+ finishScorm();
+}
+
window.scormClose = function () {
parent.close();
top.close();
};
window.scormSecondsToTimeInterval = function (diff) {
- var diff = Math.round(diff);
- var h = Math.floor(diff / 3600);
+ diff = Math.round(diff);
+ let h = Math.floor(diff / 3600);
diff = diff % 3600;
- var m = Math.floor(diff / 60);
- var s = diff % 60;
+ let m = Math.floor(diff / 60);
+ let s = diff % 60;
return 'PT' + h + 'H' + m + 'M' + s + 'S';
};