לאחר שייבאתי קורסים מפלטפורמת Moodle בגרסה 3.9 לפלטפורמה בגרסה 4.4, נתקלתי בבעיה בחלק מהשאלות בבחנים. כאשר ניסיתי לערוך את השאלות, קיבלתי את הודעת השגיאה הבאה:
Coding error detected, it must be fixed by a programmer: Invalid context id specified context::instance_by_id()
עדכון: פתרון יותר קצר ואלגנטי נמצא בפוסט הזה.
כאשר נכנסתי לבוחן, כל מה שהיה לי הוא cmid=565
בכתובת ה-URL, ולכן הייתי צריכה שאילתה שתביא לי את כל המידע הנחוץ על סמך נתון זה בלבד.
לאחר בדיקה מעמיקה בקוד, גיליתי שהשגיאה נובעת מכך שהשאלה לא מוגדרת כראוי תחת קטגוריה במאגר השאלות. ניסיתי להעביר את השאלה ידנית לקטגוריה כלשהי על מנת שהיא תירשם בבסיס הנתונים, אך העברת השאלה לא גרמה ל-ID של הקטגוריה להיכנס כראוי לבסיס הנתונים.
החלטתי להכניס ידנית את ה-ID של הקטגוריה החסרה ישירות לבסיס הנתונים. לשם כך, היה עלי לאתר את קטגוריית ברירת המחדל של הקורס ולהוסיף אליה את השאלות. זה אולי נראה כמו פתרון פשוט מדי, אבל בפועל, הוא היה בדיוק הפתרון הנכון שאיפשר לערוך את השאלות בהצלחה.
בזכות עזרה של AI, הצלחתי למצוא את הטבלאות הרלוונטיות, ויצרתי שאילתה שהחזירה לי את המידע הנחוץ. לאחר מכן, עם עוד קצת עזרה, יצרתי שאילתה נוספת שגם עדכנה את הרשומות של השאלות הרלוונטיות.
להלן השאילתה:
-- שלב 1: אחזור ה-ID של הקורס ושל ה-instance שקשור אליו
WITH course_info AS (
SELECT cm.course, cm.instance
FROM mdl_course_modules cm
WHERE cm.id = 1729
),
-- שלב 2: אחזור ה-ID של הבוחן שקשור לקורס ול-instance
quiz_info AS (
SELECT q.id AS quiz_id
FROM mdl_quiz q
JOIN course_info ci ON q.id = ci.instance
),
-- שלב 3: אחזור הקטגוריות של השאלות ומידע על ההקשר שלהן
question_categories AS (
SELECT qc.*
FROM mdl_question_categories qc
WHERE qc.id IN (
SELECT qbe.questioncategoryid
FROM mdl_quiz_slots qs
JOIN mdl_question_references qr ON qr.component = 'mod_quiz' AND qr.questionarea = 'slot' AND qr.itemid = qs.id
JOIN mdl_question_bank_entries qbe ON qbe.id = qr.questionbankentryid
WHERE qs.quizid IN (SELECT quiz_id FROM quiz_info)
)
),
-- שלב 4: אחזור ה-IDs של השאלות שקשורות לבוחן
quiz_questions AS (
SELECT q.id AS questionid
FROM mdl_quiz qz
JOIN mdl_quiz_slots qs ON qs.quizid = qz.id
JOIN mdl_question_references qr ON qr.component = 'mod_quiz'
AND qr.questionarea = 'slot'
AND qr.itemid = qs.id
JOIN mdl_question_versions qv ON qv.questionbankentryid=qr.questionbankentryid
JOIN mdl_question q ON q.id = qv.questionid
WHERE qz.id IN (SELECT quiz_id FROM quiz_info)
ORDER BY qs.slot
)
-- שלב 5: עדכון השדה category בטבלת mdl_question
UPDATE mdl_question q
SET q.category = (
SELECT qc.id
FROM question_categories qc
)
WHERE q.id IN (SELECT questionid FROM quiz_questions);
כעת, אסביר את השאילתה:
- שלב 1: אנו מתחילים באחזור ה-ID של הקורס וה-instance (מזהה הייחודי של מודול הקורס) הקשורים אליו, לפי ה-ID של המודול בקורס (1729 במקרה זה).
- שלב 2: אנו מאחסנים את ה-ID של הבוחן שקשור לקורס ול-instance הנוכחי.
- שלב 3: בשלב זה, אנו מאחזרים את הקטגוריות של השאלות ומידע על ההקשר שלהן מתוך טבלת השאלות, בהתבסס על ה-quiz_id שהשגנו בשלב 2.
- שלב 4: אנו אוספים את ה-IDs של השאלות שקשורות לבוחן, על מנת לדעת אילו שאלות יש לעדכן.
- שלב 5: לבסוף, אנו מעדכנים את השדה category בטבלת השאלות (mdl_question) עבור השאלות שזוהו בשלב 4, תוך שימוש ב-ID של הקטגוריה שנמצאה בשלב 3.
בסופו של דבר, פתרון זה הוכיח את עצמו כיעיל ואיפשר לי לתקן את השאלות עבור מנהלי הקורסים, כך שהם יוכלו להמשיך לעבוד ללא תקלות נוספות.
