Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by まじん ぜんだ -
Number of replies: 11

お世話になっています。まじんと申します。

Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になってしまいました。
mdl_choice_answersにはデータがあるので表示の問題のようです。


choice/lib.php 

function choice_get_response_data($choice, $cm, $groupmode, $onlyactive) {

    $allresponses[0] = get_enrolled_users($context, 'mod/choice:choose', $currentgroup,
            user_picture::fields('u', $extrafields), null, 0, 0, $onlyactive);
で戻りが0件なのが原因のようです。
(バージョンアップ前のクローンで試したところ取得できていました。)

学生のパーミッションを確認しましたが、'mod/choice:choose'は許可されていました。

バージョンアップでデータベースが破損したと思いますが、どの辺を確認すればよろしいでしょうか?あまり更新がないテーブルであれば、古いものからコピーすれば動くようにならないかと考えています。
どなたかお助けください。

Average of ratings: -
In reply to まじん ぜんだ

Re: Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by Mitsuhiro Yoshida -
Picture of Developers Picture of Translators

よろしければ、以下の内容をお教えください。

  • PHPのバージョン
  • データベースエンジンの種類およびバージョン (例 MariaDB 10.3.24)
  • Moodleプログラムのカスタマイズ (独自修正) の有無
  • 非標準プラグイン (https://moodle.org/plugins/) のインストールの有無

また、以下の設定により画面にエラー等が表示されるかどうかご確認ください。

  1. Moodleにサイト管理者としてログインする。
  2. 「管理 > サイト管理 > 開発 > デバッグ」に移動する。
  3. 「デバッグメッセージ debug」プルダウンメニューで「DEVELOPER: 開発者のための特別Moodleデバッグメッセージ」を選択する。
  4. 「デバックメッセージを表示する debugdisplay」を有効 (チェック) にする。
  5. 「変更を保存する」をクリックする。
In reply to Mitsuhiro Yoshida

Re: Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by まじん ぜんだ -
吉田さん、レスありがとうございます。
PHPのバージョン:7.2
データベースエンジンの種類およびバージョン (例 MariaDB 10.3.24):mariadb-5.5
Moodleプログラムのカスタマイズ (独自修正) の有無:無し
非標準プラグイン (https://moodle.org/plugins/) のインストールの有無:以下を追加
blocks/analytics_graphs
blocks/autoattend
blocks/community
blocks/completion_progress
blocks/course_contacts
blocks/participants
blocks/people
blocks/turnitin
blocks/xp
mod/autoattendmod
mod/checklist
mod/choicegroup
mod/questionnaire
mod/turnitintooltwo
plagiarism/turnitin
lib/editor/atto/plugins/morebackcolors
lib/editor/atto/plugins/morefontcolors
lib/editor/atto/plugins/wordimport
question/type/ddmatch

デバック表示しても何も表示されませんでした。
念のため仮想環境でクローンを作り、Moodle3.9.2にもアップグレードしてみましたが現象は変わりませんでした。
In reply to Mitsuhiro Yoshida

Re: Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by まじん ぜんだ -
プログラムを追っかけていくと以下のコードで意味不明な動きになりました。$neededに値がセットされれば解決しそうなのですが・・・。
何が原因かわかるでしょうか?

lib/accesslib.php
get_with_capability_join()
  :
foreach ($access[$cap] as $roleid => $perm) {<br /> if ($perm == CAP_PROHIBIT) {<br /> unset($needed[$cap][$roleid]);<br /> $prohibited[$cap][$roleid] = true;<br /> } else if ($perm == CAP_ALLOW and empty($prohibited[$cap][$roleid])) {<br /> $needed[$cap][$roleid] = true;<br /> echo "$$$$$";<br /> var_dump($needed);<br /> }
}
echo "#####";
var_dump($needed);
===実行結果============

$$
$$$array(1) {<br /> ["mod/choice:choose"]=> array(1) {<br /> [5]=> bool(true)<br /> }
}
$$$$$array(1) {<br /> ["mod/choice:choose"]=> array(2) {<br /> [5]=> bool(true)<br /> [4]=> bool(true)<br /> }
}
$$
$$$array(1) {<br /> ["mod/choice:choose"]=> array(3) {<br /> [5]=> bool(true)<br /> [4]=> bool(true)<br /> [3]=> bool(true)<br /> }
}
$$$$$array(1) {<br /> ["mod/choice:choose"]=> array(4) {<br /> [5]=> bool(true)<br /> [4]=> bool(true)<br /> [3]=> bool(true)<br /> [10]=> bool(true)<br /> }
}
#####NULL
In reply to まじん ぜんだ

Re: Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by まじん ぜんだ -
lib/accesslib.phpが大幅に変更されていますね。
3.8.2は、$needed = array();

3.8.5と3.9では、$needed =[];
になっています。
php.iniの互換性に関する設定でしょうか。
In reply to まじん ぜんだ

Re: Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by まじん ぜんだ -
Moodle3.8.2のlib/accesslib.php内のget_with_capability_join関数のみをコピー(元の関数はリネーム)したところ件数も投票回答も正しく表示されましたが、原因がよくわかりません・・。
Average of ratings: お役立ち度: ★★★★★★★ (1)
In reply to まじん ぜんだ

Re: Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by Mitsuhiro Yoshida -
Picture of Developers Picture of Translators

Moodle 3.8.2 (Build: 20200309) と 3.8.5+ (Build: 20200918) を比較してみましたが、投票 (choice) モジュールに関しましては大幅には変わっていないようです。

# git rev-list -n 1 --before="2020-03-10 00:00" origin/MOODLE_38_STABLE
1bbace8bd0cd4b56dd62b71d281f90e36b5ae16b

# git checkout 1bbace8bd0cd4b56dd62b71d281f90e36b5ae16b

# git diff --stat --color MOODLE_38_STABLE ..1bbace8bd0cd4b56dd62b71d281f90e36b5ae16b
# git diff MOODLE_38_STABLE ..1bbace8bd0cd4b56dd62b71d281f90e36b5ae16b > 385_diff.txt

diff --cc mod/choice/lang/en/choice.php
index 0288cb1e014,0288cb1e014..a56b121a5d0
--- a/mod/choice/lang/en/choice.php
+++ b/mod/choice/lang/en/choice.php
@@@ -88,7 -88,7 +88,7 @@@ $string['limitanswers'] = 'Limit the nu
  $string['modulename'] = 'Choice';
  $string['modulename_help'] = 'The choice activity module enables a teacher to ask a single question and offer a selection of possible responses.
 
--Choice results may be published after students have answered, after a certain date, or not at all. Results may be published with student names or anonymously.
++Choice results may be published after students have answered, after a certain date, or not at all. Results may be published with student names or anonymously (though teachers always see student names and their responses).
 
  A choice activity may be used
 
diff --cc mod/choice/report.php
index 7810b338c9e,7810b338c9e..9c9ea4c55c9
--- a/mod/choice/report.php
+++ b/mod/choice/report.php
@@@ -101,7 -101,7 +101,9 @@@
          require_once("$CFG->libdir/odslib.class.php");
 
      /// Calculate file name
--        $filename = clean_filename("$course->shortname ".strip_tags(format_string($choice->name,true))).'.ods';
++        $shortname = format_string($course->shortname, true, array('context' => $context));
++        $choicename = format_string($choice->name, true, array('context' => $context));
++        $filename = clean_filename("$shortname " . strip_tags($choicename)) . '.ods';
      /// Creating a workbook
          $workbook = new MoodleODSWorkbook("-");
      /// Send HTTP headers
@@@ -160,7 -160,7 +162,9 @@@
          require_once("$CFG->libdir/excellib.class.php");
 
      /// Calculate file name
--        $filename = clean_filename("$course->shortname ".strip_tags(format_string($choice->name,true))).'.xls';
++        $shortname = format_string($course->shortname, true, array('context' => $context));
++        $choicename = format_string($choice->name, true, array('context' => $context));
++        $filename = clean_filename("$shortname " . strip_tags($choicename)) . '.xls';
      /// Creating a workbook
          $workbook = new MoodleExcelWorkbook("-");
      /// Send HTTP headers
@@@ -215,7 -215,7 +219,9 @@@
 
      // print text file
      if ($download == "txt" && has_capability('mod/choice:downloadresponses', $context)) {
--        $filename = clean_filename("$course->shortname ".strip_tags(format_string($choice->name,true))).'.txt';
++        $shortname = format_string($course->shortname, true, array('context' => $context));
++        $choicename = format_string($choice->name, true, array('context' => $context));
++        $filename = clean_filename("$shortname " . strip_tags($choicename)) . '.txt';
 
          header("Content-Type: application/download\n");
          header("Content-Disposition: attachment; filename=\"$filename\"");

get_with_capability_join() 関数に関しましては2020年3月9日にMoodle 3.8.2 (Build: 20200309) がリリースされた後、2020年5月6日に以下のように修正が加えられているようです。

[MDL-68402 accesslib: fix get_with_capability_join logic -  moodle/moodle@4508f85]
https://github.com/moodle/moodle/commit/4508f85b7b9c064d10d76a9dcad43f16f5919bb9#diff-9b2de23daa1efd203cac9cc1fd5f972d

In reply to Mitsuhiro Yoshida

Re: Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by まじん ぜんだ -
確認ありがとうございます。
原因はわかりませんが、以下の2行をlib/accesslib.phpのget_with_capability_join関数内に追加したところ、表示されえるようになりました。
===
    // Make lists of roles that are needed and prohibited in this context.
    $needed = []; // One of these is enough.
    $prohibited = []; // Must not have any of these.
    foreach ($caps as $cap) {
        if (empty($access[$cap])) {
            continue;
        }
$needed["debug"] = true; //2020.09.22 mmaeda
        foreach ($access[$cap] as $roleid => $perm) {
            if ($perm == CAP_PROHIBIT) {
                unset($needed[$cap][$roleid]);
                $prohibited[$cap][$roleid] = true;
            } else if ($perm == CAP_ALLOW and empty($prohibited[$cap][$roleid])) {
                $needed[$cap][$roleid] = true;

            }
        }
unset($needed["debug"]); //2020.09.22 mmaeda
  
===
 なぜか、こうしないとforeachを抜けると$neededが空っぽでした。
php.iniの設定が関係するでしょうか。 原因がわかりましたら教えてください。
In reply to まじん ぜんだ

Re: Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by Mitsuhiro Yoshida -
Picture of Developers Picture of Translators

> php.iniの設定が関係するでしょうか。

php.iniの設定は関係していないと思います。

もし、現在お使いのPHPが7.2.1以下の場合、以下のPHP 7.2のバグが影響しているような気もします。

[PHP :: Bug #75653 :: array_values don't work on empty array]
https://bugs.php.net/bug.php?id=75653

[PHP: PHP 7 ChangeLog]
https://www.php.net/ChangeLog-7.php#PHP_7_2



In reply to Mitsuhiro Yoshida

Re: Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by まじん ぜんだ -
php-7.2.0-2.el7.remi.x86_64
でした。
バージョン上げて試してみます!
In reply to Mitsuhiro Yoshida

Re: Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by まじん ぜんだ -
吉田さん
php-7.4.10-1.el7.remi.x86_64
にバージョンアップしたところ正常動作しました。
ありがとうございました!
Average of ratings: お役立ち度: ★★★★★★★ (1)
In reply to まじん ぜんだ

Re: Moodleを3.8.2から3.8.5にアップデートしたら投票や小テストが0件になりました。

by まじん ぜんだ -
if-elseの中身を入れ替えれば追加の2行がなくても動きましたが、ますます訳が分からなくなりました。
//$needed["debug"] = true; //mmaeda
        //foreach ($access[$cap] as $roleid => $perm) {
            //if ($perm == CAP_PROHIBIT) {
                //unset($needed[$cap][$roleid]);
                //$prohibited[$cap][$roleid] = true;
            //} else if ($perm == CAP_ALLOW and empty($prohibited[$cap][$roleid])) {
                //$needed[$cap][$roleid] = true;
            //}
        //}
        foreach ($access[$cap] as $roleid => $perm) {
            if ($perm == CAP_ALLOW and empty($prohibited[$cap][$roleid])) {
                $needed[$cap][$roleid] = true;
            } else if ($perm == CAP_PROHIBIT) {
                unset($needed[$cap][$roleid]);
                $prohibited[$cap][$roleid] = true;
            }
        }
//unset($needed["debug"]); //debug