SCORM-Pakete sind auch Kursinhalte, warum sollten wir sie in Open edX® anders behandeln?

Kurserstellung mit Open edX und SCORM XBlock

SCORM-Pakete sind auch Kursinhalte, warum sollten wir sie in Open edX® anders behandeln?

SCORM ist im Bereich des E-Learnings ein weitverbreitetes und gerne genutztes Format. Open edX® verfügt über eine Integration namens, edx_xblock_scorm die es ermöglicht, SCORM-Pakete schnell und einfach in einen Open edX® Kurs einzubinden.

Wir von Abstract haben das Paket schon oft in vielen Projekten eingesetzt und bisher sehr gute Erfahrungen gemacht. Aber auch das beste Tool hat Schwächen, welche wir erkannt haben und beheben wollten.

cross icon

Das Problem

Die Verwendung von SCORM XBlocks in Open edX® war bisher immer mit vielen Einschränkungen verbunden:

  • Es gab keine Vorschau in Studio.
  • Es war bisher nicht möglich, einen Kurs, welcher SCORM-Pakete im OLX-Format beinhaltete, verlustfrei zu importieren/exportieren (bisher gehen die SCORM-Daten beim Import/Export verloren).
  • Es gab Konflikte mit HTTP/HTTPS-Umgebungen.

Light bulb icon

Die Idee

SCORM-Pakete sind Bestandteile eines Kurses. Kursautoren erwarten zu Recht, dass Kurse, die SCORM-Pakete beinhalten, problemlos und verlustfrei exportiert und importiert werden können.

Wir verfügen bereits über die erforderliche Schnittstelle im Bereich "Dateien & Uploads" der Kurse, sodass das Hochladen von Dateien in das Studio XBlock Edit-Modal nicht mehr erforderlich wäre. So könnten wir komprimierte SCORM-Dateien in der MongoDB speichern und sie bei Bedarf auf dem Standardspeicher extrahieren.

SCORM-Pakete könnten auf diese Weise in Kurse eingebunden werden, sodass diese dann verlustfrei und problemlos exportiert und/oder importiert werden können.

Challanges icon

Die Herausforderungen

Die erste Herausforderung war es, mit den Kursdateien in der MongoDB interagieren und die SCORM-Pakete in den plattformkonfigurierten Dateispeicher extrahieren zu können. Grundsätzlich ist es von Vorteil, dass die SCORM-Datei beim Import/Export komprimiert bleibt, aber damit sie dem Browser zur Verfügung gestellt werden kann, muss die Datei extrahiert werden. Wir haben dafür den Django-Standardspeicher verwendet (welcher normalerweise für Open edX® Installationen Amazon S3 ist).

Während der Arbeiten mussten wir jedoch feststellen, dass die eigentliche Herausforderung darin bestand, Inhalte aus einer anderen Domain laden zu können, da S3-Dateien üblicherweise nicht in der LMS-/CMS-Domain veröffentlicht werden. Allerdings war es nicht leich, eine passende Lösung zu finden.

Alle Versuche, CORS-Header oder Content-Security-Policy (insbesondere die frame-src und frame-ancestors) zu konfigurieren, erwiesen sich als vergeblich.

Der Grund dafür, dass SCORM-Pakete nicht in der Lage sind, die LMS-API zu erreichen, lag in den Beschränkungen des Browserübergreifenden JavaScripts (Same-Origin Policy). In modernen Browsern ist es nicht möglich, dass ein JavaScript Code, der in einem IFrame läuft, auf Frames einer anderen Domain zugreifen kann. So gelten zum Beispiel subdomain.domain.com und domain.com als unterschiedliche Domains.

Browser-Architekten haben die `Window.PostMessage'-Methode speziell für diese Aufgabe entwickelt:

Die `Window.PostMessage'-Methode ermöglicht auf sichere Weise die Kommunikation zwischen Window-Objects, z. B. einer Webseite und einem von ihr erzeugten Pop-up oder zwischen einer Webseite und einem darin eingebetteten IFrames.

Das heißt, wenn wir wollen, dass Frames auf verschiedenen Domains miteinander kommunizieren, brauchen wir einen JavaScript Code-Snippet, der auf beiden Frames läuft und die Kommunikation regelt, oder beide Frames müssen die gleiche Domain haben.

Wie sieht das in unserem Fall aus?

Aktuell wird diese Struktur vom SCORM XBlock dargestellt:

  • Ein IFrame zur Steuerung von Inhalten, die entweder eingebettet oder in einem neuen Pop-up-Fenster ("Outer-Frame") angezeigt werden sollen.
  • Ein IFrame zum Laden der SCORM-Indexseite ("Inner-Frame").
  • Die SCORM-Indexseite zum Einbetten von Inhalten über IFrames.

Leider enthält der SCORM-Standard keinen Post-Message-Hook.

Einige weitere nützliche Ressourcen zu diesem Thema:

  • In diesem Artikel wird eine derartige SCORM-Run-Time Umgebung mit verschachtelten Frames gut beschrieben zusammen mit der Art und Weise, wie das SCORM-Paket die LMS JavaScript API findet.
  • In diesem Artikel wird erklärt, wie die JavaScript Same-Origin-Policy übergangen werden kann bzw. das Problem und die möglichen Ansätze, die zu einer proprietären Lösung führen.

Tools icon

Ein erster Versuch

Im ersten Ansatz ging es um das dynamische Einfügen eines Skriptblocks in die extrahierte HTML-Indexdatei des SCORM-Pakets, der die JavaScript Document-Object-Domain auf eine gemeinsame Top-Level-Domain setzen soll.

coding

Dieser Ansatz hatte viele Nachteile:

  • Die Speicherung der Dateien muss sich in derselben Top-Level-Domain befinden (z.B. lms.example.com und storage.example.com)
  • Die Bearbeitung des SCORM-Pakets war erforderlich. Diese Operation kann kompliziert sein und möglicherweise Konflikte erzeugen, die schwer zu verhindern und zu bereinigen sind.

Die Lösung bestand darin, domainübergreifende JavaScript-Beschränkungen vollständig zu vermeiden, indem die Inhalte des SCORM-Pakets von der Plattform selbst bereitgestellt werden.

Implementation icon

Die funktionierende Lösung

Wir mussten einen Weg finden, die Dateien des SCORM-Pakets von derselben Domain wie das LMS/CMS zu nutzen (je nachdem, wo es gezeigt wird). Wir haben uns für eine Lösung entschieden, bei der die komprimierte Datei zusammen mit den Kursdaten und dem extrahierten Inhalt auf dem konfigurierten Django-Speicher abgelegt wird. Die extrahierten Dateien stellen wir dann über eine Django-Ansicht zur Verfügung, sodass sie vom Browser so angezeigt werden können, als stammten sie aus derselben Domain wie das gesamte LMS/CMS. Open edX® enthält seit Hawthorn ein Plugin-System, welches uns die Möglichkeit gibt, Django-Anwendungen einfach hinzuzufügen, damit wir alles haben, was wir für eine nahtlose Integration unseres Codes benötigen.

Die Interaktion mit den Dateien in der MongoDB konnte durch die Verwendung der Open edX® Contentstore-Abstraktion vereinfacht werden. Diese ermöglichte eine praktische und sehr schnelle Schnittstelle zum Filtern und Abrufen von kursbezogenen Dateien im GridFS MongoDB-Speicher. GridFS stellt auch kostenlose md5-Hashes der hochgeladenen Pakete zur Verfügung, womit wir leicht überprüfen können, ob das SCORM-Paket auf dem Dateispeicher extrahiert werden muss (wenn dieselbe SCORM-Datei in zwei Kurse hochgeladen wird, extrahieren wir sie nur einmal).

code icon

Überprüfung von Code

Wir legen großen Wert auf automatisiertes Testen und ständige Anpassung: Dadurch können Entwickler ihre Software fehlerfrei und problemlos wartungsfähig halten. abstract_scorm_xblock führt Tests bei jeder Push- und jeder Pull-Anfrage durch, um sicherzustellen, dass ein Entwickler keine Fehler einarbeitet, die zu Konflikten führen könnten, wenn eine neue Open edX® Version veröffentlicht wird.

Hier können Sie den Code sehen:

https://github.com/Abstract-Tech/abstract-scorm-xblock

Wir konnten endlich eine Version 1.0.0 des SCORM XBlocks auf PyPI veröffentlichen.

Read here the english Version of this article: https://abstract-technology.com/lab/articles/working-with-scorm-xblock

Teilen auf

Share |

Zu gleichen Themen

Kommentare

comments powered by Disqus