🎓

Moodleの小テストの作文(Essay)問題を必須回答にしたい

に公開

Moodleの小テストには作文(Essay)問題があります。

次のような文字の入力制限のある問題を作りたいとします。

  • 必須入力とし、空白での提出は許されない。
  • 最大文字数は300文字以内

例えばこんな感じの問題を作るとしましょう。

文字数制限のある問題のサンプル

Moodleの作文問題の設定画面には次のようなオプションがあります。

作文問題の設定

テキスト必須:学生はテキストを入力する必要があります。
最小ワード数:(これを1以上にすることもできます)
最大ワード数:300 (有効にする)

これらを設定することで、要件に合う動作をする作文問題が作れそうな気がしますが。残念ながらこれらの設定はMoodle 4.5では全く機能しません。(5.0では未確認)
しかも、この「ワード数」というのは英語の単語をベースにカウントされるので、日本語ではうまく機能しません。でたらめな数字を返してきます。
日本語の場合だとワード数ではなく文字数にして欲しいところ。しかし句読点なども文字数としてカウントされたりすると「。」だけ入力して提出されてしまうので、やはり日本語に正しく対応するには難しそうではある。

そこでどうするか回避策を考えてみました。

1. 空白で提出されたら、評定時にその提出を削除する

作文問題の空白チェック機能がないので、せめて問題に「空白で提出してはダメよ」と注意喚起するしかないでしょう。それでも空白で提出してしまう学生がいたら、その提出を削除して再提出を求める方法です。

2. 空白チェックのJavaScriptを埋め込む

テーマやテンプレートにカスタムJavaScriptを追加し、提出ボタンが押されたときにオンラインテキスト欄が空であれば警告を出すようにする方法です。これはMoodleのサイト管理者の権限が必要です。

Moodleの作文問題のtextareには div.que.essay というラベルが付けられています。Submitボタンが押されたタイミングで、Form内のdiv.que.essayのtextareaの文字数をカウントし、0ならばアラートを表示し、次に進めないようにする方法です。

小テストのレイアウトは1ページに作文問題が1問の場合や、複数並ぶ場合もあるので、それらの条件に合うように次のようなスクリプトを作成する。

<script>
document.addEventListener('DOMContentLoaded', function () {
  const submitBtn = document.querySelector('input[type="submit"]');
  if (!submitBtn) return;

  submitBtn.addEventListener('click', function (e) {
    // 作文問題のtextareaを特定(essayタイプは通常 qtype_essay クラスを持つ)
    const essayFields = document.querySelectorAll('.qtype_essay_editor textarea');
    let emptyFound = false;

    essayFields.forEach(field => {
      if (field.value.trim() === '') {
        emptyFound = true;
      }
    });
    if (emptyFound) {
      e.preventDefault();
      alert('作文問題は必須です。空欄のままでは提出できません。');
    }
  });
});
</script>

JavaScriptは、管理者でログインし、サイト管理 > アピアランス > 追加HTML のヘッダー部に貼り付ける。

追加のHTML

3. 小テストの作文問題を使用せず、課題モジュールを使う

問題のすり替えのようですが、小テストの作文問題は手軽に作成できる反面、きめ細かい制約を入れることはどうやら難しそうです。ならば、作文問題は小テストを使わず課題モジュールを使う方が得策な場合もあるでしょう。

というわけで、小テストの作文問題を必須回答にしたり文字制限をつける方法は現状では限界がありそうです。
Moodleの標準機能として早く実装して欲しいものです。

Discussion