コード例 #1
0
 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.
 }
コード例 #2
0
$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());
コード例 #3
0
 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);
         }
     }
 }