/** * Get the users subscribed to the discussion * * @param stdClass $forum * @param stdClass $discussion * @param context_module $context * @param int $groupid * @param null|string $fields * @param array $search * @param string $sort * @return array */ public function get_subscribed_users($forum, $discussion, context_module $context, $groupid = 0, $fields = null, array $search = array(), $sort = 'u.lastname ASC, u.firstname ASC') { global $CFG; if ($forum->forcesubscribe == HSUFORUM_DISALLOWSUBSCRIBE or $forum->type == 'single' or hsuforum_is_forcesubscribed($forum)) { return array(); } if (is_null($fields)) { $fields = "u.id,\n u.alternatename,\n u.username,\n u.firstname,\n u.firstnamephonetic,\n u.lastname,\n u.lastnamephonetic,\n u.maildisplay,\n u.mailformat,\n u.maildigest,\n u.middlename,\n u.imagealt,\n u.email,\n u.emailstop,\n u.city,\n u.country,\n u.lastaccess,\n u.lastlogin,\n u.picture,\n u.timezone,\n u.theme,\n u.lang,\n u.trackforums,\n u.mnethostid"; } list($esql, $params) = get_enrolled_sql($context, '', $groupid, true); $params['discussionid'] = $discussion->id; $where = ''; if (!empty($search)) { $where .= ' AND ' . $search[0]; $params = array_merge($params, $search[1]); } $results = $this->get_db()->get_records_sql("\n SELECT {$fields}\n FROM {user} u\n JOIN ({$esql}) je ON je.id = u.id\n JOIN {hsuforum_subscriptions_disc} s ON s.userid = u.id\n WHERE s.discussion = :discussionid{$where}\n ORDER BY {$sort}\n ", $params); // Guest user should never be subscribed to a forum. unset($results[$CFG->siteguest]); return $results; }
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; }
/** * Adds module specific settings to the settings block * * @param settings_navigation $settings The settings navigation object * @param navigation_node $forumnode The node to add module settings to */ function hsuforum_extend_settings_navigation(settings_navigation $settingsnav, navigation_node $forumnode) { global $USER, $PAGE, $CFG, $DB; $config = get_config('hsuforum'); $forumobject = $DB->get_record("hsuforum", array("id" => $PAGE->cm->instance)); if (empty($PAGE->cm->context)) { $PAGE->cm->context = context_module::instance($PAGE->cm->instance); } // for some actions you need to be enrolled, beiing admin is not enough sometimes here $enrolled = is_enrolled($PAGE->cm->context, $USER, '', false); $activeenrolled = is_enrolled($PAGE->cm->context, $USER, '', true); $canmanage = has_capability('mod/hsuforum:managesubscriptions', $PAGE->cm->context); $subscriptionmode = hsuforum_get_forcesubscribed($forumobject); $cansubscribe = $activeenrolled && $subscriptionmode != HSUFORUM_FORCESUBSCRIBE && ($subscriptionmode != HSUFORUM_DISALLOWSUBSCRIBE || $canmanage); $discussionid = optional_param('d', 0, PARAM_INT); $viewingdiscussion = ($PAGE->url->compare(new moodle_url('/mod/hsuforum/discuss.php'), URL_MATCH_BASE) and $discussionid); if (!is_guest($PAGE->cm->context)) { $forumnode->add(get_string('export', 'hsuforum'), new moodle_url('/mod/hsuforum/route.php', array('contextid' => $PAGE->cm->context->id, 'action' => 'export')), navigation_node::TYPE_SETTING, null, null, new pix_icon('i/export', get_string('export', 'hsuforum'))); } $forumnode->add(get_string('viewposters', 'hsuforum'), new moodle_url('/mod/hsuforum/route.php', array('contextid' => $PAGE->cm->context->id, 'action' => 'viewposters')), navigation_node::TYPE_SETTING, null, null, new pix_icon('t/preview', get_string('viewposters', 'hsuforum'))); if ($canmanage) { $mode = $forumnode->add(get_string('subscriptionmode', 'hsuforum'), null, navigation_node::TYPE_CONTAINER); $allowchoice = $mode->add(get_string('subscriptionoptional', 'hsuforum'), new moodle_url('/mod/hsuforum/subscribe.php', array('id' => $forumobject->id, 'mode' => HSUFORUM_CHOOSESUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING); $forceforever = $mode->add(get_string("subscriptionforced", "hsuforum"), new moodle_url('/mod/hsuforum/subscribe.php', array('id' => $forumobject->id, 'mode' => HSUFORUM_FORCESUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING); $forceinitially = $mode->add(get_string("subscriptionauto", "hsuforum"), new moodle_url('/mod/hsuforum/subscribe.php', array('id' => $forumobject->id, 'mode' => HSUFORUM_INITIALSUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING); $disallowchoice = $mode->add(get_string('subscriptiondisabled', 'hsuforum'), new moodle_url('/mod/hsuforum/subscribe.php', array('id' => $forumobject->id, 'mode' => HSUFORUM_DISALLOWSUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING); switch ($subscriptionmode) { case HSUFORUM_CHOOSESUBSCRIBE: // 0 $allowchoice->action = null; $allowchoice->add_class('activesetting'); break; case HSUFORUM_FORCESUBSCRIBE: // 1 $forceforever->action = null; $forceforever->add_class('activesetting'); break; case HSUFORUM_INITIALSUBSCRIBE: // 2 $forceinitially->action = null; $forceinitially->add_class('activesetting'); break; case HSUFORUM_DISALLOWSUBSCRIBE: // 3 $disallowchoice->action = null; $disallowchoice->add_class('activesetting'); break; } } else { if ($activeenrolled) { switch ($subscriptionmode) { case HSUFORUM_CHOOSESUBSCRIBE: // 0 $notenode = $forumnode->add(get_string('subscriptionoptional', 'hsuforum')); break; case HSUFORUM_FORCESUBSCRIBE: // 1 $notenode = $forumnode->add(get_string('subscriptionforced', 'hsuforum')); break; case HSUFORUM_INITIALSUBSCRIBE: // 2 $notenode = $forumnode->add(get_string('subscriptionauto', 'hsuforum')); break; case HSUFORUM_DISALLOWSUBSCRIBE: // 3 $notenode = $forumnode->add(get_string('subscriptiondisabled', 'hsuforum')); break; } } } if ($cansubscribe) { if (hsuforum_is_subscribed($USER->id, $forumobject)) { $linktext = get_string('unsubscribe', 'hsuforum'); } else { $linktext = get_string('subscribe', 'hsuforum'); } $url = new moodle_url('/mod/hsuforum/subscribe.php', array('id' => $forumobject->id, 'sesskey' => sesskey())); $forumnode->add($linktext, $url, navigation_node::TYPE_SETTING); } if ($viewingdiscussion) { require_once __DIR__ . '/lib/discussion/subscribe.php'; $subscribe = new hsuforum_lib_discussion_subscribe($forumobject, $PAGE->cm->context); if ($subscribe->can_subscribe()) { $subscribeurl = new moodle_url('/mod/hsuforum/route.php', array('contextid' => $PAGE->cm->context->id, 'action' => 'subscribedisc', 'discussionid' => $discussionid, 'sesskey' => sesskey(), 'returnurl' => $PAGE->url)); if ($subscribe->is_subscribed($discussionid)) { $linktext = get_string('unsubscribedisc', 'hsuforum'); } else { $linktext = get_string('subscribedisc', 'hsuforum'); } $forumnode->add($linktext, $subscribeurl, navigation_node::TYPE_SETTING); } } if (has_capability('mod/hsuforum:viewsubscribers', $PAGE->cm->context)) { $url = new moodle_url('/mod/hsuforum/subscribers.php', array('id' => $forumobject->id)); $forumnode->add(get_string('showsubscribers', 'hsuforum'), $url, navigation_node::TYPE_SETTING); $discsubscribers = ($viewingdiscussion or optional_param('action', '', PARAM_ALPHA) == 'discsubscribers'); if ($discsubscribers && !hsuforum_is_forcesubscribed($forumobject) && $discussionid) { $url = new moodle_url('/mod/hsuforum/route.php', array('contextid' => $PAGE->cm->context->id, 'action' => 'discsubscribers', 'discussionid' => $discussionid)); $forumnode->add(get_string('showdiscussionsubscribers', 'hsuforum'), $url, navigation_node::TYPE_SETTING, null, 'discsubscribers'); } } if (!isloggedin() && $PAGE->course->id == SITEID) { $userid = guest_user()->id; } else { $userid = $USER->id; } $hascourseaccess = $PAGE->course->id == SITEID || can_access_course($PAGE->course, $userid); $enablerssfeeds = !empty($config->enablerssfeeds) && !empty($config->enablerssfeeds); if ($enablerssfeeds && $forumobject->rsstype && $forumobject->rssarticles && $hascourseaccess) { if (!function_exists('rss_get_url')) { require_once "{$CFG->libdir}/rsslib.php"; } if ($forumobject->rsstype == 1) { $string = get_string('rsssubscriberssdiscussions', 'hsuforum'); } else { $string = get_string('rsssubscriberssposts', 'hsuforum'); } $url = new moodle_url(rss_get_url($PAGE->cm->context->id, $userid, "mod_hsuforum", $forumobject->id)); $forumnode->add($string, $url, settings_navigation::TYPE_SETTING, null, null, new pix_icon('i/rss', '')); } }
hsuforum_subscribe($user->id, $forum->id); } } hsuforum_forcesubscribe($forum->id, HSUFORUM_INITIALSUBSCRIBE); redirect($returnto, get_string("everyoneisnowsubscribed", "hsuforum"), 1); break; case HSUFORUM_DISALLOWSUBSCRIBE: // 3 hsuforum_forcesubscribe($forum->id, HSUFORUM_DISALLOWSUBSCRIBE); redirect($returnto, get_string("noonecansubscribenow", "hsuforum"), 1); break; default: print_error(get_string('invalidforcesubscribe', 'hsuforum')); } } if (hsuforum_is_forcesubscribed($forum)) { redirect($returnto, get_string("everyoneisnowsubscribed", "hsuforum"), 1); } $info = new stdClass(); $info->name = fullname($user); $info->forum = format_string($forum->name); if (hsuforum_is_subscribed($user->id, $forum->id)) { if (is_null($sesskey)) { // we came here via link in email $PAGE->set_title($course->shortname); $PAGE->set_heading($course->fullname); echo $OUTPUT->header(); echo $OUTPUT->confirm(get_string('confirmunsubscribe', 'hsuforum', format_string($forum->name)), new moodle_url($PAGE->url, array('sesskey' => sesskey())), new moodle_url('/mod/hsuforum/view.php', array('f' => $id))); echo $OUTPUT->footer(); exit; }
/** * Form definition * * @return void */ function definition() { global $OUTPUT, $USER, $DB; $config = get_config('hsuforum'); $mform =& $this->_form; $course = $this->_customdata['course']; $cm = $this->_customdata['cm']; $coursecontext = $this->_customdata['coursecontext']; $modcontext = $this->_customdata['modcontext']; $forum = $this->_customdata['forum']; $post = $this->_customdata['post']; $edit = $this->_customdata['edit']; $thresholdwarning = $this->_customdata['thresholdwarning']; $mform->addElement('html', '<div class="fcontainer">'); // If there is a warning message and we are not editing a post we need to handle the warning. if (!empty($thresholdwarning) && !$edit) { // Here we want to display a warning if they can still post but have reached the warning threshold. if ($thresholdwarning->canpost) { $message = get_string($thresholdwarning->errorcode, $thresholdwarning->module, $thresholdwarning->additional); $mform->addElement('html', $OUTPUT->notification($message)); } } $mform->addElement('text', 'subject', get_string('subject', 'hsuforum'), 'size="48"'); $mform->setType('subject', PARAM_TEXT); $mform->addRule('subject', get_string('required'), 'required', null, 'client'); $mform->addRule('subject', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); $mform->addElement('editor', 'message', get_string('message', 'hsuforum'), null, self::editor_options($modcontext, empty($post->id) ? null : $post->id)); $mform->setType('message', PARAM_RAW); $mform->addRule('message', get_string('required'), 'required', null, 'client'); if (isset($forum->id) && hsuforum_is_forcesubscribed($forum)) { $mform->addElement('static', 'subscribemessage', get_string('subscription', 'hsuforum'), get_string('everyoneissubscribed', 'hsuforum')); $mform->addElement('hidden', 'subscribe'); $mform->setType('subscribe', PARAM_INT); $mform->addHelpButton('subscribemessage', 'subscription', 'hsuforum'); } else { if (isset($forum->forcesubscribe) && $forum->forcesubscribe != HSUFORUM_DISALLOWSUBSCRIBE || has_capability('moodle/course:manageactivities', $coursecontext)) { $options = array(); $options[0] = get_string('subscribestop', 'hsuforum'); $options[1] = get_string('subscribestart', 'hsuforum'); $mform->addElement('select', 'subscribe', get_string('subscription', 'hsuforum'), $options); $mform->addHelpButton('subscribe', 'subscription', 'hsuforum'); } else { if ($forum->forcesubscribe == HSUFORUM_DISALLOWSUBSCRIBE) { $mform->addElement('static', 'subscribemessage', get_string('subscription', 'hsuforum'), get_string('disallowsubscribe', 'hsuforum')); $mform->addElement('hidden', 'subscribe'); $mform->setType('subscribe', PARAM_INT); $mform->addHelpButton('subscribemessage', 'subscription', 'hsuforum'); } } } if (!empty($forum->maxattachments) && $forum->maxbytes != 1 && has_capability('mod/hsuforum:createattachment', $modcontext)) { // 1 = No attachments at all $mform->addElement('filemanager', 'attachments', get_string('attachment', 'hsuforum'), null, self::attachment_options($forum)); $mform->addHelpButton('attachments', 'attachment', 'hsuforum'); } if (empty($post->id) && has_capability('moodle/course:manageactivities', $coursecontext)) { // hack alert $mform->addElement('checkbox', 'mailnow', get_string('mailnow', 'hsuforum')); } if (!empty($config->enabletimedposts) && !$post->parent && has_capability('mod/hsuforum:viewhiddentimedposts', $coursecontext)) { // hack alert $mform->addElement('header', 'displayperiod', get_string('displayperiod', 'hsuforum')); $mform->addElement('date_selector', 'timestart', get_string('displaystart', 'hsuforum'), array('optional' => true)); $mform->addHelpButton('timestart', 'displaystart', 'hsuforum'); $mform->addElement('date_selector', 'timeend', get_string('displayend', 'hsuforum'), array('optional' => true)); $mform->addHelpButton('timeend', 'displayend', 'hsuforum'); } else { $mform->addElement('hidden', 'timestart'); $mform->setType('timestart', PARAM_INT); $mform->addElement('hidden', 'timeend'); $mform->setType('timeend', PARAM_INT); $mform->setConstants(array('timestart' => 0, 'timeend' => 0)); } if ($groupmode = groups_get_activity_groupmode($cm, $course)) { // hack alert $groupdata = groups_get_activity_allowed_groups($cm); $groupcount = count($groupdata); $groupinfo = array(); $modulecontext = context_module::instance($cm->id); // Check whether the user has access to all groups in this forum from the accessallgroups cap. if ($groupmode == VISIBLEGROUPS || has_capability('moodle/site:accessallgroups', $modulecontext)) { // Only allow posting to all groups if the user has access to all groups. $groupinfo = array('0' => get_string('allparticipants')); $groupcount++; } $contextcheck = has_capability('mod/hsuforum:movediscussions', $modulecontext) && empty($post->parent) && $groupcount > 1; if ($contextcheck) { foreach ($groupdata as $grouptemp) { $groupinfo[$grouptemp->id] = $grouptemp->name; } $mform->addElement('select', 'groupinfo', get_string('group'), $groupinfo); $mform->setDefault('groupinfo', $post->groupid); $mform->setType('groupinfo', PARAM_INT); } else { if (empty($post->groupid)) { $groupname = get_string('allparticipants'); } else { $groupname = format_string($groupdata[$post->groupid]->name); } $mform->addElement('static', 'groupinfo', get_string('group'), $groupname); } } if (!empty($forum->anonymous) and $post->userid == $USER->id and has_capability('mod/hsuforum:revealpost', $modcontext)) { $mform->addElement('advcheckbox', 'reveal', get_string('reveal', 'hsuforum')); $mform->addHelpButton('reveal', 'reveal', 'hsuforum'); } if (!empty($forum->allowprivatereplies) and !empty($post->parent) and has_capability('mod/hsuforum:allowprivate', $modcontext)) { if ($post->userid != $USER->id) { $mform->addElement('hidden', 'privatereply', 0); $mform->setType('privatereply', PARAM_INT); } else { $parentauthorid = $DB->get_field('hsuforum_posts', 'userid', array('id' => $post->parent), MUST_EXIST); $mform->addElement('advcheckbox', 'privatereply', get_string('privatereply', 'hsuforum'), null, null, array(0, $parentauthorid)); $mform->addHelpButton('privatereply', 'privatereply', 'hsuforum'); } } //------------------------------------------------------------------------------- // buttons if (isset($post->edit)) { // hack alert $submit_string = get_string('savechanges'); } else { $submit_string = get_string('posttoforum', 'hsuforum'); } $this->add_action_buttons(false, $submit_string); $mform->addElement('hidden', 'course'); $mform->setType('course', PARAM_INT); $mform->addElement('hidden', 'forum'); $mform->setType('forum', PARAM_INT); $mform->addElement('hidden', 'discussion'); $mform->setType('discussion', PARAM_INT); $mform->addElement('hidden', 'parent'); $mform->setType('parent', PARAM_INT); $mform->addElement('hidden', 'userid'); $mform->setType('userid', PARAM_INT); $mform->addElement('hidden', 'groupid'); $mform->setType('groupid', PARAM_INT); $mform->addElement('hidden', 'edit'); $mform->setType('edit', PARAM_INT); $mform->addElement('hidden', 'reply'); $mform->setType('reply', PARAM_INT); $mform->addElement('html', '</div>'); }