توليد حزمة SCORM برمجيًا
يمكنك إنتاج حزمة SCORM دون أداة تأليف: ابنِ الدورة بيانات عبر واجهة برمجية، ثم اطلبها ملف zip. ومع Underlayer لا يتطلّب ذلك سوى بضعة أوامر curl: أنشئ الدورة، واملأ شاشاتها، وصدِّرها بصيغة SCORM 2004 أو 1.2 لنظام إدارة التعلّم (LMS) الذي ينتظرها.
باختصار
POST /api/v1/courses، وأضف شاشاتها وعناصرها بطلب PATCH، ثم يعيد لك GET /api/v1/courses/{id}/scorm?version=scorm2004 (أو scorm12) الحزمةَ نفسها. يتطلّب التصدير عبر الواجهة البرمجية خطة Scale، أمّا التصدير من لوحة التحكم فمتاح في كل الخطط.لماذا تولّد حزم SCORM بالشيفرة؟
تُنتج أدوات التأليف حزمة واحدة في كل مرة، وباليد. وهذا لا يصلح حين تأتي الدورات من مكان آخر، كتوثيق المنتج نفسه، أو فهرس في قاعدة بيانات، أو مسار ترجمة، أو مسودة كتبها الذكاء الاصطناعي. ولا يصلح أيضًا حين يحتاج نظام LMS لدى العميل إلى حزمة جديدة كلما تغيّر المحتوى. أمّا توليد الحزمة بالشيفرة فيُبقي الدورة بيانات تتتبّع إصداراتها، وتقارن بينها، وتعيد بناءها.
1. ابنِ الدورة
الدورة قائمة من الشاشات، والشاشة قائمة من العناصر: عنوان، أو فقرة، أو سؤال اختبار. أنشئ الدورة، ثم أرسل شاشاتها. ولا يلزمك للبدء سوى العنوان.
curl -X POST https://underlayerhq.com/api/v1/courses \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{ "title": "Refund policy" }'curl -X PATCH https://underlayerhq.com/api/v1/courses/c_123 \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"screens": [
{ "id": "s_intro", "title": "The basics", "blocks": [
{ "id": "b_h", "type": "heading", "text": "Refunds in 30 seconds", "level": "h2" },
{ "id": "b_p", "type": "text", "text": "Agents can refund up to $200 without approval." }
]},
{ "id": "s_quiz", "title": "Quick check", "blocks": [
{ "id": "b_q", "type": "quiz_single_choice",
"question": "What can you refund without approval?",
"options": [
{ "id": "o1", "label": "Up to $50", "correct": false },
{ "id": "o2", "label": "Up to $200", "correct": true }
] }
]}
]
}'curl -X PATCH https://underlayerhq.com/api/v1/courses/c_123 \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{ "passingScore": 70 }'passingScore هي النسبة المئوية من الإجابات الصحيحة التي يحتاجها المتعلّم لينجح، وعلى أساسها تُبلِغ الحزمة عن النجاح أو الرسوب. ويضمّ مرجع العناصر كل أنواع العناصر مع مثال يعمل لكلٍّ منها. ابدأ منه، فالعنصر الذي فيه حقل مكتوب خطأً يُحفظ دون أي رسالة خطأ، ثم يظهر فارغًا.
2. صدِّر الحزمة
يعيد مسار التصدير ملف zip نفسه، مبنيًا من بيانات الدورة الحالية في تلك اللحظة:
curl -L -H "Authorization: Bearer sk_live_..." \
"https://underlayerhq.com/api/v1/courses/c_123/scorm?version=scorm2004" \
-o refund-policy.zipversion:scorm2004(الطبعة الرابعة، وهي الافتراضية) أوscorm12. استخدم 1.2 حين يستورد نظام LMS حزمة 2004 لكنه لا يسجّل الإكمال أبدًا، وتشرح الفروق بينهما سبب ذلك.lang: حزّم إحدى الترجمات بدل اللغة المصدر، لعميل يحتاج إلى الدورة بلغته.track=1: اجعل الحزمة تُبلِغك أنت أيضًا بجلسات التشغيل، لا نظام LMS وحده (راجع الخطوة 3).
يتطلّب التصدير عبر الواجهة البرمجية خطة Scale أو ما فوقها، ويتلقّى مفتاح بيئة التجربة أو خطة Build الرمز 403 مع plan_required. أمّا التصدير من صفحة الدورة في لوحة التحكم فمتاح في كل الخطط.
ما الذي يحتويه ملف zip
الحزمة مكتفية بذاتها: محتوى الدورة، ومعه نسخة مستقلة من المشغّل نفسه الذي يستخدمه التضمين، فتعمل كلها من نطاق نظام LMS نفسه. والدورة كلها وحدة SCO واحدة، لأنها تحتفظ بالحالة عبر الشاشات (الدرجة المتراكمة، وشاشة النتائج، والتفرّع)، وهذا يحتاج إلى جلسة واحدة متصلة. وتُبلَّغ الشاشات بوصفها علامات cmi.location، فيستأنف المتعلّمون من حيث توقّفوا.
يتلقّى نظام LMS الإكمال، والنجاح أو الرسوب، والدرجة النهائية، والوقت المستغرق، وعلامة للاستئناف، وتفاعلًا واحدًا لكل سؤال مُقيَّم مع إجابة المتعلّم عنه.
3. لا تخسر التحليلات
لا تُبلِغ حزمة SCORM عادةً إلا نظام LMS الذي يشغّلها، فيختفي هؤلاء المتعلّمون من تحليلاتك أنت. أمّا التصدير مع track=1 فيرسل أيضًا أحداث المشاهدة والإجابة والإكمال إلى Underlayer، مربوطةً بمعرّف المتعلّم في نظام LMS نفسه. وإن استخدمت معرّفات متّسقة، يلتقي نشاط المتعلّم في نظام LMS لدى العميل بنشاطه في منتجك، وتُطلَق أحداث ويب هوك لديك كالمعتاد. ويبقى سجل SCORM في نظام LMS هو السجل المعتمد.
في الاتجاه المعاكس: استيراد حزمة
والاتجاه المعاكس يعمل أيضًا، لترحيل مكتبة كاملة دفعةً واحدة. أرسل ملف zip تعُد إليك دورة في حالة مسودة، ومعها meta.kind الذي يُخبر عملية الترحيل الآلية هل استُعيدت الحزمة كما هي أم جزئيًا فقط:
curl -X POST -H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/zip" \
--data-binary @course.zip \
"https://underlayerhq.com/api/v1/courses/import/scorm"الحزمة التي صدّرها Underlayer تعود كما هي تمامًا (roundtrip). أمّا الحزمة القادمة من أداة تأليف أخرى فتعود بهيكلها ونصوصها المقروءة وما أمكن قراءته من بيانات الاختبارات (salvaged)، أي الأسئلة المأخوذة من QTI ومن بيانات الدورة التي تُضمِّنها Rise وStoryline وCaptivate وiSpring. ولا تُخمَّن الإجابات الصحيحة أبدًا.
أخطاء يقع فيها كثيرون
- ابنِ أولًا وصدِّر أخيرًا: تُصنع الحزمة من الدورة كما هي لحظة التصدير، فأعد التصدير بعد كل تغيير.
- اختر الإصدار الذي يتعامل معه نظام LMS فعلًا. وإن لم تكن متأكدًا، فولِّد الاثنين ودع العميل يجرّب 2004 أولًا.
- إن كنت تصدّر مع track=1، فاستخدم معرّفات المتعلّمين نفسها في منتجك وفي نظام LMS، وإلا فلن يلتقي السجلّان.
- لا تتوقّع درجات من التفاعلات غير المُقيَّمة. فعناصر المطابقة والنقاط الساخنة تفاعلية لكنها لا تُقيَّم، ولهذا تطابق الدرجة في نظام LMS دائمًا ما رآه المتعلّم.