diff --git a/course/lib.php b/course/lib.php index 1ba8ff98853c7..9ceefb57fe013 100644 --- a/course/lib.php +++ b/course/lib.php @@ -2046,40 +2046,43 @@ function move_courses($courseids, $categoryid) { $newparent = context_coursecat::instance($category->id); $i = 1; - foreach ($courseids as $courseid) { - if ($dbcourse = $DB->get_record('course', array('id' => $courseid))) { - $course = new stdClass(); - $course->id = $courseid; - $course->category = $category->id; - $course->sortorder = $category->sortorder + MAX_COURSES_IN_CATEGORY - $i++; - if ($category->visible == 0) { - // Hide the course when moving into hidden category, do not update the visibleold flag - we want to get - // to previous state if somebody unhides the category. - $course->visible = 0; - } - - $DB->update_record('course', $course); - - // Store the context. - $context = context_course::instance($course->id); - - // Update the course object we are passing to the event. - $dbcourse->category = $course->category; - $dbcourse->sortorder = $course->sortorder; + list($where, $params) = $DB->get_in_or_equal($courseids); + $dbcourses = $DB->get_records_select('course', 'id ' . $where, $params); + foreach ($dbcourses as $dbcourse) { + $course = new stdClass(); + $course->id = $dbcourse->id; + $course->category = $category->id; + $course->sortorder = $category->sortorder + MAX_COURSES_IN_CATEGORY - $i++; + if ($category->visible == 0) { + // Hide the course when moving into hidden category, do not update the visibleold flag - we want to get + // to previous state if somebody unhides the category. + $course->visible = 0; + } + + $DB->update_record('course', $course); + + // Store the context. + $context = context_course::instance($course->id); + + // Update the course object we are passing to the event. + $dbcourse->category = $course->category; + $dbcourse->sortorder = $course->sortorder; + if (isset($course->visible)) { + $dbcourse->visible = $course->visible; + } + + // Trigger a course updated event. + $event = \core\event\course_updated::create(array( + 'objectid' => $course->id, + 'context' => $context, + 'other' => array('shortname' => $dbcourse->shortname, + 'fullname' => $dbcourse->fullname) + )); + $event->add_record_snapshot('course', $dbcourse); + $event->set_legacy_logdata(array($course->id, 'course', 'move', 'edit.php?id=' . $course->id, $course->id)); + $event->trigger(); - // Trigger a course updated event. - $event = \core\event\course_updated::create(array( - 'objectid' => $course->id, - 'context' => $context, - 'other' => array('shortname' => $dbcourse->shortname, - 'fullname' => $dbcourse->fullname) - )); - $event->add_record_snapshot('course', $dbcourse); - $event->set_legacy_logdata(array($course->id, 'course', 'move', 'edit.php?id=' . $course->id, $course->id)); - $event->trigger(); - - $context->update_moved($newparent); - } + $context->update_moved($newparent); } fix_course_sortorder(); cache_helper::purge_by_event('changesincourse'); diff --git a/course/tests/courselib_test.php b/course/tests/courselib_test.php index ce02969780430..dc68f3401fcc1 100644 --- a/course/tests/courselib_test.php +++ b/course/tests/courselib_test.php @@ -1429,6 +1429,9 @@ public function test_course_updated_event() { // Create a category we are going to move this course to. $category = $this->getDataGenerator()->create_category(); + // Create a hidden category we are going to move this course to. + $categoryhidden = $this->getDataGenerator()->create_category(array('visible' => 0)); + // Catch the update events. $sink = $this->redirectEvents(); @@ -1447,11 +1450,18 @@ public function test_course_updated_event() { // Return the moved course information from the DB. $movedcourse = $DB->get_record('course', array('id' => $course->id), '*', MUST_EXIST); + // Now move the course to the hidden category, this will also trigger an event. + move_courses(array($course->id), $categoryhidden->id); + + // Return the moved course information from the DB. + $movedcoursehidden = $DB->get_record('course', array('id' => $course->id), '*', MUST_EXIST); + // Now we want to set the sortorder back to what it was before fix_course_sortorder() was called. The reason for // this is because update_course() and move_courses() call fix_course_sortorder() which alters the sort order in // the DB, but it does not set the value of the sortorder for the course object passed to the event. $updatedcourse->sortorder = $sortorder; $movedcourse->sortorder = $category->sortorder + MAX_COURSES_IN_CATEGORY - 1; + $movedcoursehidden->sortorder = $categoryhidden->sortorder + MAX_COURSES_IN_CATEGORY - 1; // Capture the events. $events = $sink->get_events(); @@ -1479,6 +1489,17 @@ public function test_course_updated_event() { $this->assertEventLegacyData($movedcourse, $event); $expectedlog = array($movedcourse->id, 'course', 'move', 'edit.php?id=' . $movedcourse->id, $movedcourse->id); $this->assertEventLegacyLogData($expectedlog, $event); + + $event = $events[2]; + $this->assertInstanceOf('\core\event\course_updated', $event); + $this->assertEquals('course', $event->objecttable); + $this->assertEquals($movedcoursehidden->id, $event->objectid); + $this->assertEquals(context_course::instance($movedcoursehidden->id)->id, $event->contextid); + $this->assertEquals($movedcoursehidden, $event->get_record_snapshot('course', $movedcoursehidden->id)); + $this->assertEquals('course_updated', $event->get_legacy_eventname()); + $this->assertEventLegacyData($movedcoursehidden, $event); + $expectedlog = array($movedcoursehidden->id, 'course', 'move', 'edit.php?id=' . $movedcoursehidden->id, $movedcoursehidden->id); + $this->assertEventLegacyLogData($expectedlog, $event); } /**