public function discsubscribers_action()
 {
     global $OUTPUT, $USER, $DB, $COURSE, $PAGE;
     require_once dirname(dirname(__DIR__)) . '/repository/discussion.php';
     require_once dirname(dirname(__DIR__)) . '/lib/userselector/discussion/existing.php';
     require_once dirname(dirname(__DIR__)) . '/lib/userselector/discussion/potential.php';
     $discussionid = required_param('discussionid', PARAM_INT);
     $edit = optional_param('edit', -1, PARAM_BOOL);
     // Turn editing on and off.
     $url = $PAGE->url;
     $url->param('discussionid', $discussionid);
     if ($edit !== 0) {
         $url->param('edit', $edit);
     }
     $PAGE->set_url($url);
     $discussion = $DB->get_record('hsuforum_discussions', array('id' => $discussionid), '*', MUST_EXIST);
     $forum = $PAGE->activityrecord;
     $course = $COURSE;
     $cm = $PAGE->cm;
     $context = $PAGE->context;
     $repo = new \hsuforum_repository_discussion();
     if (hsuforum_is_forcesubscribed($forum)) {
         throw new coding_exception('Cannot manage discussion subscriptions when subscription is forced');
     }
     $currentgroup = groups_get_activity_group($cm);
     $options = array('forum' => $forum, 'discussion' => $discussion, 'currentgroup' => $currentgroup, 'context' => $context);
     $existingselector = new \hsuforum_userselector_discussion_existing('existingsubscribers', $options);
     $subscriberselector = new \hsuforum_userselector_discussion_potential('potentialsubscribers', $options);
     if (data_submitted()) {
         require_sesskey();
         $subscribe = (bool) optional_param('subscribe', false, PARAM_RAW);
         $unsubscribe = (bool) optional_param('unsubscribe', false, PARAM_RAW);
         /** It has to be one or the other, not both or neither */
         if (!($subscribe xor $unsubscribe)) {
             print_error('invalidaction');
         }
         if ($subscribe) {
             $users = $subscriberselector->get_selected_users();
             foreach ($users as $user) {
                 $repo->subscribe($discussion->id, $user->id);
             }
         } else {
             if ($unsubscribe) {
                 $users = $existingselector->get_selected_users();
                 foreach ($users as $user) {
                     $repo->unsubscribe($discussion->id, $user->id);
                 }
             }
         }
         $subscriberselector->invalidate_selected_users();
         $existingselector->invalidate_selected_users();
         redirect($PAGE->url);
     }
     $strsubscribers = get_string('discussionsubscribers', 'hsuforum');
     // This works but it doesn't make a good navbar, would have to change the settings menu.
     // $PAGE->settingsnav->find('discsubscribers', navigation_node::TYPE_SETTING)->make_active();
     $PAGE->navbar->add(shorten_text(format_string($discussion->name)), new moodle_url('/mod/hsuforum/discuss.php', array('d' => $discussion->id)));
     $PAGE->navbar->add($strsubscribers);
     $PAGE->set_title($strsubscribers);
     $PAGE->set_heading($COURSE->fullname);
     if (has_capability('mod/hsuforum:managesubscriptions', $context)) {
         if ($edit != -1) {
             $USER->subscriptionsediting = $edit;
         }
         if (!empty($USER->subscriptionsediting)) {
             $string = get_string('turneditingoff');
             $edit = "off";
         } else {
             $string = get_string('turneditingon');
             $edit = "on";
         }
         $url = $PAGE->url;
         $url->param('edit', $edit);
         $PAGE->set_button($OUTPUT->single_button($url, $string, 'get'));
     } else {
         unset($USER->subscriptionsediting);
     }
     $output = $OUTPUT->heading($strsubscribers);
     if (empty($USER->subscriptionsediting)) {
         $output .= $this->renderer->subscriber_overview($existingselector->get_repo()->get_subscribed_users($forum, $discussion, $context, $currentgroup), $discussion->name, $forum, $course);
     } else {
         $output .= $this->renderer->subscriber_selection_form($existingselector, $subscriberselector);
     }
     return $output;
 }
예제 #2
0
/**
 * Adds user to the subscriber list
 *
 * @param int $userid
 * @param int $forumid
 * @param context_module|null $context Module context, may be omitted if not known or if called for the current module set in page.
 */
function hsuforum_subscribe($userid, $forumid, $context = null)
{
    global $DB, $PAGE;
    require_once __DIR__ . '/repository/discussion.php';
    $repo = new hsuforum_repository_discussion();
    $repo->unsubscribe_all($forumid, $userid);
    if ($DB->record_exists("hsuforum_subscriptions", array("userid" => $userid, "forum" => $forumid))) {
        return true;
    }
    $sub = new stdClass();
    $sub->userid = $userid;
    $sub->forum = $forumid;
    $result = $DB->insert_record("hsuforum_subscriptions", $sub);
    if (!$context) {
        // Find out forum context. First try to take current page context to save on DB query.
        if ($PAGE->cm && $PAGE->cm->modname === 'hsuforum' && $PAGE->cm->instance == $forumid && $PAGE->context->contextlevel == CONTEXT_MODULE && $PAGE->context->instanceid == $PAGE->cm->id) {
            $context = $PAGE->context;
        } else {
            $cm = get_coursemodule_from_instance('hsuforum', $forumid);
            $context = context_module::instance($cm->id);
        }
    }
    $params = array('context' => $context, 'objectid' => $result, 'relateduserid' => $userid, 'other' => array('forumid' => $forumid));
    $event = \mod_hsuforum\event\subscription_created::create($params);
    $event->trigger();
    return $result;
}