完了トラッキングのデフォルト値を設定

完了トラッキングのデフォルト値を設定

- Shinji Kawano の投稿
返信数: 4

立て続けの質問で恐縮ですが、何卒、アドバイスいただけないかと思っております。

現在、moodle3.4にて開発を行っております。


各活動モジュールの完了トラッキングについて

デフォルトでは「条件を満たした場合、活動完了を表示する」を選択した状態にしたいと思っております。

初期値で設定するところがなかったので、プログラムに直接改修をかけたいと思っております。

(ひょっとして、画面からできるのでしょうか?)


courseフォルダのmoodleform_mod.phpに「standard_coursemodule_elements()」という関数があり

ここが完了トラッキングなどの要素を書き出しているかと思いますので

ここで、例えば

$mform->setDefault('completion', COMPLETION_TRACKING_AUTOMATIC);

のように完了トラッキングのセレクトボックスの初期値をCOMPLETION_TRACKING_AUTOMATIC(value=2)にしようとしておりますが

一向に初期値に設定が入りません。

おそらく、どこかでリセットされてしまっているようなことになっているのではないかと思っておりますが

処理を追いかけきれずに困っております。


なにか良い手法はありませんでしょうか?

何卒、ご教授のほど、よろしくお願いいたします。

Shinji Kawano への返信

Re: 完了トラッキングのデフォルト値を設定

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

下記プログラム修正をお試しください。

修正対象プログラム:
course/moodleform_mod.php

修正箇所:
651行目

[ 修正前 ]
            $trackingdefault = COMPLETION_TRACKING_NONE;
            // If system and activity default is on, set it.
            if ($CFG->completiondefault && $this->_features->defaultcompletion) {

[ 修正後 ]

//            $trackingdefault = COMPLETION_TRACKING_NONE;
            $trackingdefault = COMPLETION_TRACKING_AUTOMATIC;
            // If system and activity default is on, set it.
            if ($CFG->completiondefault && $this->_features->defaultcompletion) {


評点平均:お役立ち度: ★☆☆☆☆☆☆ (1)
Mitsuhiro Yoshida への返信

Re: 完了トラッキングのデフォルト値を設定

- udagawa mitsuru の投稿

うだがわです。

自分も以前から気になっていたので調べてみました。

course/moodleform_mod.php の651行目から下記のようになっています。

            $trackingdefault = COMPLETION_TRACKING_NONE;
            // If system and activity default is on, set it.
            if ($CFG->completiondefault && $this->_features->defaultcompletion) {
                $hasrules = plugin_supports('mod', $this->_modname, FEATURE_COMPLETION_HAS_RULES, true);
                $tracksviews = plugin_supports('mod', $this->_modname, FEATURE_COMPLETION_TRACKS_VIEWS, true);
                if ($hasrules || $tracksviews) {
                    $trackingdefault = COMPLETION_TRACKING_AUTOMATIC;
                } else {
                    $trackingdefault = COMPLETION_TRACKING_MANUAL;
                }
            }

 mod_forum は FEATURE_COMPLETION_HAS_RULES と FEATURE_COMPLETION_TRACKS_VIEWS が両方とも true なのでここで最終的に $trackingdefault = COMPLETION_TRACKING_AUTOMATIC セットされるはずで、実際にその値がセットされていることも確認できました。

そしてその後に

            $mform->addElement('select', 'completion', get_string('completion', 'completion'),
                array(COMPLETION_TRACKING_NONE=>get_string('completion_none', 'completion'),
                COMPLETION_TRACKING_MANUAL=>get_string('completion_manual', 'completion')));
            $mform->setDefault('completion', $trackingdefault);
            $mform->addHelpButton('completion', 'completion', 'completion');

と続くのですが、ここに COMPLETION_TRACKING_AUTOMATIC は無く、setDefault() で指定されているものの、実際にはセットされていません。(getOption()すると2が帰ってくるので$mformにはセットされている)

しばらくあとで

            // Automatic option only appears if possible
if ($gotcompletionoptions) {
$mform->getElement('completion')->addOption(
get_string('completion_automatic', 'completion'),
COMPLETION_TRACKING_AUTOMATIC);
}

となり、リストに COMPLETION_TRACKING_AUTOMATIC が追加されるようです。

問題はここからで、ここで $mform->getElement('completion')->setSelected(COMPLETION_TRACKING_AUTOMATIC) としても変わりなく、前の方にある setDefault() を消しても変わりがありません。おそらくどこかで COMPLETION_TRACKING_MANUAL で上書きされているのだと思われますがまだ調査中です。

評点平均: お役立ち度: ★★★★★★★ (1)
udagawa mitsuru への返信

Re: 完了トラッキングのデフォルト値を設定

- udagawa mitsuru の投稿

うだがわです。

course/modedit.php の63行目で prepare_new_moduleinfo_data() を呼んでいるのですが、ここから帰ってくる $data を 142行目の $mform->set_data($data) で上書きしている点に問題があります。一連の処理のどこが間違っているのかまではわかりませんが、 $data に 「"completion" => 1」 という内容が含まれており、それが上書きされるために常に  COMPLETION_TRACKING_MANUAL が選択される状態になっています。これ以上は理由が分からないのでMoodle Trackerに投げてみます。

とりあえず問題を迂回するのであれば下記のようにcourse/modedit.php の142行目に unset() を追記しておけば大丈夫そうです。

$mformclassname = 'mod_'.$module->name.'_mod_form';
$mform = new $mformclassname($data, $cw->section, $cm, $course);
unset($data->completion);
$mform->set_data($data);
評点平均: お役立ち度: ★★★★★★★ (1)
udagawa mitsuru への返信

Re: 完了トラッキングのデフォルト値を設定

- udagawa mitsuru の投稿

うだがわです。

なんとなく見えてきたのでメモがわりに記載しておきます。
Moodle 3.3 からコースごとに「デフォルト活動完了」という設定が追加されています。この設定画面[コース管理]の[コース完了]にあります。
ここでデフォルト活動完了の設定を活動ごとに設定変更することができます。複数の活動を一括で設定変更することも可能ですが、その場合は手動での活動完了にしか対応していないものが含まれていた場合には自動は選択できなくなります。おそらくこの場所でコースごとに設定変更するのが既定のやり方です。

このデフォルト設定を行っていない(course_completion_defaults テーブルに記録が無い)場合に COMPLETION_TRACKING_MANUAL が設定され、前述のように活動モジュールから得た情報から COMPLETION_TRACKING_AUTOMATIC に対応していると判断された場合でもこの設定が上書きされる点に問題があります。(completion/classes/manager.php の get_default_completion())

パッチを書くのが面倒なのでMoodle HQに任せたいのですが、DBにエントリが無い場合のデフォルト値を活動モジュールを見て決定するようにするか、DBにエントリが無い場合は get_default_completion() の中で $data->completion を unset() するのが妥当ではないかと思います。
後者なら簡単ですので、前に書いた unset() は削除して、get_default_completion() に unset() を追加するのがとりあえずの対応になりそうです。(ただしデフォルト設定画面での表示が"なし"になってしまう)

            if ($CFG->completiondefault) {
$completion = new \completion_info(get_fast_modinfo($course->id)->get_course());
if ($completion->is_enabled() && plugin_supports('mod', $module->name, FEATURE_MODEDIT_DEFAULT_COMPLETION, true)) {
$data->completion = COMPLETION_TRACKING_MANUAL;
unset($data->completion);
$data->completionview = 1;
}
}
評点平均: お役立ち度: ★★★★★★★ (1)