По первым трем пунктам всё понятно.
По ошибке тоже понятно, не может найти запись в базе данных, хотя она существует, если во втором курсе создан модуль. Но на этапе добавления повторяющихся промежутков времени выскакивает ошибка Debug info
У меня, наконец-то, получилось воспроизвести эту ошибку. Ковыряние в коде привело вот к этому фрагменту в файле teacherview.controller.php:
while ($slot->starttime <= $data->timeend - $slot->duration * 60) {
$conflicts = scheduler_get_conflicts($scheduler->id, $data->timestart, $data->timestart + $slot->duration * 60, $data->teacherid, 0, SCHEDULER_ALL, false);
if ($conflicts) {
if (!$data->forcewhenoverlap) {
print_string('conflictingslots', 'scheduler');
echo '<ul>';
foreach ($conflicts as $aconflict) {
$sql = 'SELECT c.fullname, c.shortname, s.name as schedname, sl.starttime '
.'FROM {course} c, {scheduler} s, {scheduler_slots} sl '
.'WHERE s.course = c.id AND sl.schedulerid = s.id AND sl.id = :conflictid';
$conflictinfo = $DB->get_record_sql($sql, array('conflictid' => $aconflict->id));
$msg = $output->userdate($conflictinfo->starttime) . ', ' . $output->usertime($conflictinfo->starttime) . ': ';
$msg .= s($conflictinfo->schedname). ' '.get_string('incourse', 'scheduler') . ' ';
$msg .= $conflictinfo->shortname . ' - ' . $conflictinfo->fullname;
echo html_writer::tag('li', $msg);
}
echo '</ul><br/>';
} else { // we force, so delete all conflicting before inserting
foreach ($conflicts as $conflict) {
$cslot = $scheduler->get_slot($conflict->id);
$cslot->delete();
}
}
}
if (!$conflicts || $data->forcewhenoverlap) {
$DB->insert_record('scheduler_slots', $slot, false, true);
$countslots++;
}
$slot->starttime += ($slot->duration + $data->break) * 60;
$data->timestart += ($slot->duration + $data->break) * 60;
scheduler_get_conflicts выводит все конфликты - совпадающие по времени промежутки. Дальше, если есть конфликты if ($conflicts), проверяем включено ли принудительное добавление if (!$data->forcewhenoverlap) и выводим список конфликтов print_string и echo, после чего } else {// we force, so delete all conflicting before inserting удаляем слоты $cslot->delete() и только после этих манипуляций при условии, что нет конфликтов или включено принудительное добавление if (!$conflicts || $data->forcewhenoverlap) добавляем слоты $DB->insert_record.
Имхо, тут логика нарушена. Ну, вывели, что есть конфликты, но принудиловка то отключена !$data->forcewhenoverlap, и что мы будем удалять? Слоты то не добавлены.
Я думаю должно быть так: если нет конфликтов или включено прнудительное добавление, то слоты добавляем принудительно. Во всех остальных случаях выводим список конфликтов, удаляем (если есть что удалять), выводим сообщение и т. д.
Попробуйте это кусок кода заменить на нижеследующий и поэкспериментировать. Потом «доложите»
while ($slot->starttime <= $data->timeend - $slot->duration * 60) {
$conflicts = scheduler_get_conflicts($scheduler->id, $data->timestart, $data->timestart + $slot->duration * 60, $data->teacherid, 0, SCHEDULER_ALL, false);
if (!$conflicts || $data->forcewhenoverlap) {
$DB->insert_record('scheduler_slots', $slot, false, true);
$countslots++;
} else {
if (!$data->forcewhenoverlap) {
print_string('conflictingslots', 'scheduler');
echo '<ul>';
foreach ($conflicts as $aconflict) {
$sql = 'SELECT c.fullname, c.shortname, s.name as schedname, sl.starttime '
.'FROM {course} c, {scheduler} s, {scheduler_slots} sl '
.'WHERE s.course = c.id AND sl.schedulerid = s.id AND sl.id = :conflictid';
$conflictinfo = $DB->get_record_sql($sql, array('conflictid' => $aconflict->id));
$msg = $output->userdate($conflictinfo->starttime) . ', ' . $output->usertime($conflictinfo->starttime) . ': ';
$msg .= s($conflictinfo->schedname). ' '.get_string('incourse', 'scheduler') . ' ';
$msg .= $conflictinfo->shortname . ' - ' . $conflictinfo->fullname;
echo html_writer::tag('li', $msg);
}
echo '</ul><br/>';
} else { // we force, so delete all conflicting before inserting
foreach ($conflicts as $conflict) {
$cslot = $scheduler->get_slot($conflict->id);
$cslot->delete();
}
}
}
$slot->starttime += ($slot->duration + $data->break) * 60;
$data->timestart += ($slot->duration + $data->break) * 60;
С таким кодом у меня ошибки не было (может потом будет )
Вот без включения принудительного добавления (forcewhenoverlap установлен в NO):
А это при включении forcewhenoverlap:
ЗЫ: это баг и нужно писать разработчику плагина.