public function test_tag_discussion() { global $DB, $USER, $SITE, $CFG; require_once $CFG->dirroot . '/tag/lib.php'; $this->resetAfterTest(true); $this->setAdminUser(); // Create the generator object and do standard checks. $generator = self::getDataGenerator()->get_plugin_generator('mod_forumng'); // Create course. $record = new stdClass(); $record->shortname = 'testcourse'; $course = self::getDataGenerator()->create_course($record); // Create groups. $group1 = $this->get_new_group($course->id); $group2 = $this->get_new_group($course->id); // Create forum. $forumrecord = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum = mod_forumng::get_from_id($forumrecord->id, mod_forumng::CLONE_DIRECT, true); // Set use tag. $CFG->usetags = true; // Set forum to tag enabling. $this->assertTrue($CFG->usetags); $this->assertEquals(true, $forum->get_tags_enabled()); // Start a discussion in forum (group1). $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group1->id; $record->userid = $USER->id; $record->timestart = time(); $ids1 = $generator->create_discussion($record); // Start a second discussion in forum (group1). $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group1->id; $record->userid = $USER->id; $record->timestart = time(); $ids2 = $generator->create_discussion($record); // Start a third discussion in forum (group2). $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group2->id; $record->userid = $USER->id; $record->timestart = time(); $ids3 = $generator->create_discussion($record); // Set up tags in each discussion. $discussionid = $ids1[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings($discussion::NOCHANGE, $discussion::NOCHANGE, $discussion::NOCHANGE, $discussion::NOCHANGE, $discussion::NOCHANGE, array('tag1', 'tag2', 'tag3')); $tags1 = $discussion->get_tags(); $this->assertCount(3, $tags1); $discussion1 = $discussion; $discussionid = $ids2[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings(mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, array('tag1', 'tag2')); $tags2 = $discussion->get_tags(); $this->assertCount(2, $tags2); $discussion2 = $discussion; $discussionid = $ids3[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings(mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, array('tag1')); $tags3 = $discussion->get_tags(); $this->assertCount(1, $tags3); $discussion3 = $discussion; // Create a discussion with no tags for later use. $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group2->id; $record->userid = $USER->id; $record->timestart = time(); $ids4 = $generator->create_discussion($record); // Get id of 'tag1'. $tagid = array_search('tag1', $tags3); // Get all tags and check on numbers for each tag. $tagsused = $forum->get_tags_used(); $this->assertCount(3, $tagsused); $tagsused1 = $forum->get_tags_used($group1->id); $this->assertCount(3, $tagsused1); $tagsused2 = $forum->get_tags_used($group2->id); $this->assertCount(1, $tagsused2); $this->assertArrayHasKey($tagid, $tagsused2); $this->assertObjectHasAttribute('displayname', $tagsused2[$tagid]); $this->assertObjectHasAttribute('count', $tagsused2[$tagid]); $this->assertEquals('tag1', $tagsused2[$tagid]->displayname); $this->assertEquals(1, $tagsused2[$tagid]->count); // Get all discussions featuring 'tag1'. $list = $forum->get_discussion_list(mod_forumng::ALL_GROUPS, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist = $list->get_normal_discussions(); $this->assertCount(3, $taggedlist); // Get all discussions featuring 'tag1'.for group1. $list1 = $forum->get_discussion_list($group1->id, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist1 = $list1->get_normal_discussions(); $this->assertCount(2, $taggedlist1); // Get all discussions featuring 'tag1'.for group2. $list2 = $forum->get_discussion_list($group2->id, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist2 = $list2->get_normal_discussions(); $this->assertCount(1, $taggedlist2); // Get all discussions featuring 'tag3'.for group2 - which should be none. $tagid = array_search('tag3', $tags1); $list = $forum->get_discussion_list($group2->id, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist = $list->get_normal_discussions(); $this->assertCount(0, $taggedlist); // Set tags specifically for group 1. $forumng = new stdClass(); $forumng->settags = array('g1 vamp', 'g1 zomb', 'g1 mumm', 'g1 damm'); $forumng->id = $forum->get_id(); $forumng->instance = $forum->get_id(); $forumng->tags = 1; forumng_update_instance($forumng); $context = $forum->get_context(); mod_forumng::set_group_tags($forum->get_id(), $group1->id, $forumng->settags); $tagsused1 = $forum::get_set_tags($forumng->id, $group1->id); $this->assertCount(4, $tagsused1); // Set tags for group 2 (should return main set tags also). $g2tags = array('g2 ghost', 'g2 ghoul', 'g2 googl', 'g2 welf', 'g2 gobb'); mod_forumng::set_group_tags($forum->get_id(), $group2->id, $g2tags); $tagsused2 = $forum::get_set_tags($forumng->id, $group2->id); $this->assertCount(9, $tagsused2); $tagsused3 = $forum::get_set_tags($forumng->id); $this->assertCount(4, $tagsused3); // Test that group only tags can be returned. $tagsused1 = $forum::get_set_tags($forumng->id, $group1->id, true); $this->assertCount(4, $tagsused1); $tagsused2 = $forum::get_set_tags($forumng->id, $group2->id, true); $this->assertCount(5, $tagsused2); // Need to test permanently delete. $discussionid = $ids4[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings(mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, array('t1', 't2', 't3')); $tags4 = $discussion->get_tags(); $this->assertCount(3, $tags4); $discussion4 = $discussion; // Delete discussion. $discussion4->permanently_delete(false); $this->assertFalse($DB->get_record('forumng_discussions', array('id' => $discussion->get_id()))); $this->assertEmpty($DB->get_records('tag_instance', array('itemid' => $discussion->get_id(), 'itemtype' => 'forumng discussions'))); // Test group tag setting. $user2 = $this->get_new_user(); $this->setUser($user2); mod_forumng::set_group_tags($forumng->id, $group1->id, array('t1', 'tnew')); $tagsused = $forum::get_set_tags($forumng->id, $group1->id, true); $this->assertCount(2, $tagsused); mod_forumng::set_group_tags($forumng->id, $group1->id, array('t1')); $tagsused = $forum::get_set_tags($forumng->id, $group1->id, true); $this->assertCount(1, $tagsused); // Create a new forum and add same group tags. $forumrecord2 = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum2 = mod_forumng::get_from_id($forumrecord2->id, mod_forumng::CLONE_DIRECT, true); mod_forumng::set_group_tags($forumrecord2->id, $group1->id, array('t1')); $tagsused = $forum::get_set_tags($forumrecord2->id, $group1->id, true); $this->assertCount(1, $tagsused); // Create a new forum and add same group tags (should use another user). $forumrecord2 = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum2 = mod_forumng::get_from_id($forumrecord2->id, mod_forumng::CLONE_DIRECT, true); mod_forumng::set_group_tags($forumrecord2->id, $group1->id, array('t1')); $tagsused = $forum::get_set_tags($forumrecord2->id, $group1->id, true); $this->assertCount(1, $tagsused); // Create a new forum and add same group tags (should fail as ou of users). $forumrecord2 = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum2 = mod_forumng::get_from_id($forumrecord2->id, mod_forumng::CLONE_DIRECT, true); $this->setExpectedException('moodle_exception'); mod_forumng::set_group_tags($forumrecord2->id, $group1->id, array('t1')); // Do not add any tests after this point as exception called above. }
$customdata = array('options' => array(), 'id' => $cmid, 'groups' => $groups, 'tags' => $managedtags, 'fid' => $fid, 'params' => $urlparams); // Set up page. $pagename = get_string('editsettags', 'forumngfeature_edittags'); $url = new moodle_url('/mod/forumng/feature/edittags/managetags.php', $urlparams); $out = $forum->init_page($url, $pagename); $mform = new mod_forumng_managetags_form($url, $customdata); if ($mform->is_cancelled()) { // Form is cancelled, redirect back to the discussion. redirect('../../view.php?' . $forum->get_link_params(mod_forumng::PARAM_PLAIN)); } else { if ($fromform = $mform->get_data()) { foreach ($groups as $group) { $settagsindex = 'settags_' . $group->id; if (isset($fromform->{$settagsindex})) { if ($group->id) { mod_forumng::set_group_tags($forum->get_id(), $group->id, $fromform->{$settagsindex}); } else { tag_set('forumng', $fid, $fromform->{$settagsindex}, 'mod_forumng', $context->id); } } } redirect('../../view.php?' . $forum->get_link_params(mod_forumng::PARAM_PLAIN)); } else { $navigation = array(); print $out->header(); $mform->display(); // Log request. $params = array('context' => $forum->get_context(), 'objectid' => $forum->get_id(), 'other' => array('url' => 'managetags.php?' . $forum->get_link_params(mod_forumng::PARAM_PLAIN), 'groupid' => $groupid)); $event = \forumngfeature_edittags\event\tags_edited::create($params); $event->add_record_snapshot('course_modules', $forum->get_course_module()); $event->add_record_snapshot('course', $forum->get_course());
protected function after_execute() { global $DB, $CFG; // Add forumng related files, no need to match by // itemname (just internally handled context) $this->add_related_files('mod_forumng', 'intro', null); // Add post related files, matching by itemname = 'forumng_post' $this->add_related_files('mod_forumng', 'message', 'forumng_post'); $this->add_related_files('mod_forumng', 'attachment', 'forumng_post'); $this->add_related_files('mod_forumng', 'draft', 'forumng_draft'); // Now fix the lastpostid for each discussion // TODO Does this work on MySQL? No idea. $DB->execute("\nUPDATE {forumng_discussions} SET lastpostid=(\n SELECT\n MAX(id)\n FROM\n {forumng_posts} fp\n WHERE\n fp.discussionid = {forumng_discussions}.id\n AND fp.oldversion=0\n AND fp.deleted=0\n) WHERE forumngid = ?", array($this->forumngid)); require_once $CFG->dirroot . '/mod/forumng/mod_forumng.php'; // Create search index if user data restored. if ($this->get_setting_value('userinfo') && mod_forumng::search_installed()) { mod_forumng::search_update_all(false, $this->get_courseid(), $this->task->get_moduleid(), $this->get_task()->get_progress()); } // See what $this->task->get_moduleid() contains, then check master|clone. // If we have the module id we can use that to get the cm. if ($cmid = $this->task->get_moduleid()) { // Check to see whether forum is shared or a clone. if ($this->shared) { // Master. // Get the ID number - probably from the course_modules table using $this->task->get_moduleid() in a query. $cm = $DB->get_record('course_modules', array('id' => $cmid), '*', MUST_EXIST); $idnumber = $cm->idnumber; // Check for any other forumng module instances using the same ID number - . // if any then add _1 to end (if already has _number at end then increment that number e.g. _2). $newidnumber = $this->get_new_idnumber($idnumber); // Set new idnumber. $cm->idnumber = $newidnumber; $DB->update_record('course_modules', $cm); } else { if ($this->type === 'clone') { // Clone. $cm = $DB->get_record('course_modules', array('id' => $cmid), '*', MUST_EXIST); $forumng = $DB->get_record('forumng', array('id' => $cm->instance), '*', MUST_EXIST); // If clone get original cmid ID number, if exists and has AUTO_ prefix, // If exists and has AUTO_ prefix. if (!empty($forumng->originalcmid)) { $originalcm = $DB->get_record_sql('select * from {course_modules} where module = (select id from {modules} where name = ?) and id = ?', array('forumng', $forumng->originalcmid)); $strippedidnumber = $originalcm->idnumber; // If exists and has AUTO_ prefix. $idnumber = $this->strip_auto_from_idnumber($originalcm->idnumber); if ($idnumber != $originalcm->idnumber) { $strippedidnumber = $idnumber; // We have an AUTO_ prefix. // Do we have a valid suffix. $suffix = $this->get_possible_suffix($originalcm->idnumber, '_'); if ($suffix != 0) { // We have a valid suffix. // Remove the suffix from the idnumber by getting the last '_' . $strippedidnumber = $this->remove_suffix($idnumber, '_'); } // Place auto back in. $strippedidnumber = 'AUTO_' . $strippedidnumber; // Get cmid for all forumng module instances (joining to forumng table to ensure we get only master forums) // that have matching idnumber (regardless of their _number suffix). $cms = $DB->get_records_sql('select cm.id as cmid, cm.idnumber from {course_modules} cm inner join {forumng} f on cm.instance = f.id where cm.idnumber like ? and f.shared = ? and cm.module = (select id from {modules} where name = ?) order by cmid desc', array($strippedidnumber . '%', 1, 'forumng')); // Set originalcmid field. $forumng->originalcmid = $this->get_cmid_for_forumng_idnumbers($strippedidnumber, $cms); if ($forumng->originalcmid) { $DB->update_record('forumng', $forumng); } } } } } } if (!empty($this->grouptags)) { foreach ($this->grouptags as $groupid => $tags) { mod_forumng::set_group_tags($this->forumngid, $groupid, $tags); } } }