コースコンテンツのバックアップとリストアに関する件で質問があります。
現在、2つのMoodleを管理運用しています(テスト用と本番用です)。
利用方法としては、下記の通りです
①テスト用moodleに学習コンテンツや小テストを掲載→ ②その内容をバックアップダウンロード→ ③本番用moodleにリストア→ ④本番公開
学習コンテンツや小テストについては定期的に掲載数を増やしていっています。
そのため、テストmoodleでは新規に掲載したもののみをバックアップし、本番サイトでリストアを行っているのですが、
本番サイトの「問題バンク」を確認したところ、選択したもの以外(一部同じコースで登録されている別カテゴリの問題)もリストアされてしまっていました。
そのため、ダブリで登録されてしまう問題が一部発生しています。
※そのコースに登録のあるすべての問題ではなく、一部の問題のみです。
(おそらく、テスト/本番のいづれかで問題内容や項目名が変わったものと思われるもの。)
バックアップまたは、リストアする際に、選択したコンテンツのみの問題バンクがバックアップ/リストアされるようにするにはどうしたらよろしいでしょうか?
テストサイトでコース管理者によって掲載、内容確認 → 本番リストア、利用者活用可能
という風に、運営しているのですがより効率的な運営方法はございますでしょうか?
ご教示いただけると幸いです。
> バックアップまたは、リストアする際に、選択したコンテンツのみの問題バンクがバックアップ/リストアされるようにするにはどうしたらよろしいでしょうか?
現在のところ、最新の開発版 (Moodle 4.0dev) でも問題バンクの特定の問題のみを指定したリストアはサポートされていないようです。
> テストサイトでコース管理者によって掲載、内容確認 → 本番リストア、利用者活用可能という風に、運営しているのですがより効率的な運営方法はございますでしょうか?
テスト用moodleでの問題作成時、問題名に問題のバージョンを付加されてはいかがでしょうか。例えば「Moodleの設定方法 (20210601)」のように日付をバージョンとして付加できます。同じ問題を修正する場合、「Moodleの設定方法 (20210601-01)」のようにマイナー番号 (子番号) を付加しても良いのかもしれません。または一旦テスト用moodleで作成した問題には修正を加えないという運用も可能かと思います。
既存の問題の問題名、問題テキスト等を修正した場合、当該問題のデータベーステーブル (mdl_question) 内レコードの「version」の内容が新たに書き換えられるため、仮に問題名が同じであっても、リストア時には「新しい問題」として扱われるようです。
具体的にはMoodle 3.9.7+ (Build: 20210511) でしたら、backup/util/dbops/restore_dbops.class.phpの683行目あたりでリストア元で作成したバックアップデータ内の問題レコードの「stamp」および「version」がリストア先のデータと合致するか否かで新しい問題としてリストアするか否か判断しているようです。
// 2b) Match, mark qcat to be mapped and iterate over each q, matching by stamp and version
} else {
self::set_backup_ids_record($restoreid, 'question_category', $category->id, $matchcat->id, $targetcontext->id);
$questions = self::restore_get_questions($restoreid, $category->id);
// Collect all the questions for this category into memory so we only talk to the DB once.
$questioncache = $DB->get_records_sql_menu("SELECT ".$DB->sql_concat('stamp', "' '", 'version').", id
FROM {question}
WHERE category = ?", array($matchcat->id));
foreach ($questions as $question) {
if (isset($questioncache[$question->stamp." ".$question->version])) {
$matchqid = $questioncache[$question->stamp." ".$question->version];
} else {
$matchqid = false;
}
// 5a) No match, check if user can add q
if (!$matchqid) {
// 6a) User can, mark the q to be created
if ($canadd) {
// Nothing to mark, newitemid means create