3

tl;dr; mysqlまたは公式のmoodle apiを介してコースモジュールを介してコースモジュールインスタンスを取得しようとしています。最終的に私の解決策はかなりくだらないように思えるので、アドバイスをお願いします。

こんにちはムードルの人々

mdl_course_modules の各行に対応するコース モジュール インスタンスを取得しようとしています。このコンテキストのインスタンスは、mdl_quiz、mdl_wiki、またはその他の course_modules インスタンスからの単一の行になります。

私はいくつかのことを試しましたが、私が期待していたのは次のとおりでした:

function get_all_course_modules($course_id) {
   global $DB;
   $course = $DB->get_record('course', array('id' => $course_id));
   $mod_info = get_fast_modinfo($course);
}

$mod_info からコース モジュールのインスタンスを取得できませんでした。

そこで、代わりにカスタム mysql を実行しようとしましたが、

SELECT course.id, course.fullname, cm.course, cm.section, m.name 
 FROM mdl_course AS course 
 JOIN mdl_course_modules AS cm ON cm.course = course.id
 JOIN mdl_modules AS m ON m.id = cm.module 
 JOIN CONCAT('mdl_', m.name) AS module_type ON ...somethingsomething
 WHERE course.id = 2;

SQL はまだ完成していません。さまざまなコース モジュールのすべてを事前に知っているわけではないという事実に出くわしました。つまり、course_module の名前を動的に使用して、参加するインスタンス テーブルを選択する必要があります。可能性のあるすべてのコースモジュールインスタンステーブルでLEFT JOINするだけですが、それには永遠に時間がかかり、誰かが新しいコースモジュールインスタンスを入れると機能しなくなります.

現在、次のことを行っています。

 $result = array();
$course_mods = get_course_mods($course_id);

if($course_mods) {
    foreach($course_mods as $course_mod) {
        $DB->get_records_sql('some sql that selects the instance');
    }
}

return $result;

この最後のコードは最終的に機能し、$course_mod->instance、$course_mod->mod_name などの $course_mod 変数からクエリを動的に作成できるようになります。

でも、これは厳しそうですね。course_module インスタンスをより簡単な方法で取得することに成功した人はいますか??

ありがとう!!

4

1 に答える 1

1

これは、コースモジュールインスタンスを取得するために私が最終的に使用した関数です。それほどきれいではありませんが、何でも構いません。

function get_all_course_modules($course_id) {
global $DB;
$course_mods = get_course_mods($course_id);
$result = array();
if($course_mods) {
    foreach($course_mods as $course_mod) {
        $course_mod->course_module_instance = $DB->get_record($course_mod->modname, array('id' =>$course_mod->instance ));
        $result[$course_mod->id] = $course_mod;
    }
}
return $result;
}
于 2016-08-12T11:00:29.857 に答える