From 06904c98d0b949c37d52c30725aad4f8dbab1bd9 Mon Sep 17 00:00:00 2001 From: Dan Marsden Date: Mon, 18 Dec 2017 09:36:11 +1300 Subject: [PATCH] Fix #281 Copy Moodle 3.3 messaging tool into attendance to allow multi-user messaging. --- message.html | 59 +++++++++++++++ messageselect.php | 181 ++++++++++++++++++++++++++++++++++++++++++++++ renderer.php | 4 +- 3 files changed, 241 insertions(+), 3 deletions(-) create mode 100644 message.html create mode 100644 messageselect.php diff --git a/message.html b/message.html new file mode 100644 index 0000000..6ee95fb --- /dev/null +++ b/message.html @@ -0,0 +1,59 @@ +
+ + + + + box_start(); ?> + + + + + + + + + + + + +
+ : + + +
+ '; + ?> +
+ + +
+ box_end(); ?> + + emailto[$id])) { + foreach ($SESSION->emailto[$id] as $user) { + echo ''; + // Check to see if we should be showing the email address. + if ($user->maildisplay == 0) { // 0 = don't display my email to anyone. + echo ''; + } + } + else { + echo ''; + } + ?> +
'.fullname($user,true).'' . get_string('emaildisplayhidden') . ''; + } else { + echo ''.$user->email.''; + } + if (empty($user->email)) { + $error = get_string('emailempty'); + } + if (!empty($error)) { + echo $OUTPUT->pix_icon('t/emailno', $error); + unset($error); + } + echo '
'.get_string('nousersyet').'
+
\ No newline at end of file diff --git a/messageselect.php b/messageselect.php new file mode 100644 index 0000000..604d8f4 --- /dev/null +++ b/messageselect.php @@ -0,0 +1,181 @@ +. + +/** + * Copied from Moodle 3.3 messageselect.php - allows sending messages to multiple users. + * + * @copyright 1999 Martin Dougiamas http://dougiamas.com + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @package core_user + */ +require_once('../../config.php'); +require_once($CFG->dirroot.'/message/lib.php'); +$id = required_param('id', PARAM_INT); +$messagebody = optional_param('messagebody', '', PARAM_CLEANHTML); +$send = optional_param('send', '', PARAM_BOOL); +$preview = optional_param('preview', '', PARAM_BOOL); +$edit = optional_param('edit', '', PARAM_BOOL); +$returnto = optional_param('returnto', '', PARAM_LOCALURL); +$format = optional_param('format', FORMAT_MOODLE, PARAM_INT); +$deluser = optional_param('deluser', 0, PARAM_INT); +$url = new moodle_url('/user/messageselect.php', array('id' => $id)); +if ($messagebody !== '') { + $url->param('messagebody', $messagebody); +} +if ($send !== '') { + $url->param('send', $send); +} +if ($preview !== '') { + $url->param('preview', $preview); +} +if ($edit !== '') { + $url->param('edit', $edit); +} +if ($returnto !== '') { + $url->param('returnto', $returnto); +} +if ($format !== FORMAT_MOODLE) { + $url->param('format', $format); +} +if ($deluser !== 0) { + $url->param('deluser', $deluser); +} +$PAGE->set_url($url); +if (!$course = $DB->get_record('course', array('id' => $id))) { + print_error('invalidcourseid'); +} +require_login($course); +$coursecontext = context_course::instance($id); // Course context. +$systemcontext = context_system::instance(); // SYSTEM context. +require_capability('moodle/course:bulkmessaging', $coursecontext); +if (empty($SESSION->emailto)) { + $SESSION->emailto = array(); +} +if (!array_key_exists($id, $SESSION->emailto)) { + $SESSION->emailto[$id] = array(); +} +if ($deluser) { + if (array_key_exists($id, $SESSION->emailto) && array_key_exists($deluser, $SESSION->emailto[$id])) { + unset($SESSION->emailto[$id][$deluser]); + } +} +if (empty($SESSION->emailselect[$id]) || $messagebody) { + $SESSION->emailselect[$id] = array('messagebody' => $messagebody); +} +$messagebody = $SESSION->emailselect[$id]['messagebody']; +$count = 0; +if ($data = data_submitted()) { + require_sesskey(); + $namefields = get_all_user_name_fields(true); + foreach ($data as $k => $v) { + if (preg_match('/^(user|teacher)(\d+)$/', $k, $m)) { + if (!array_key_exists($m[2], $SESSION->emailto[$id])) { + if ($user = $DB->get_record_select('user', "id = ?", array($m[2]), 'id, '. + $namefields . ', idnumber, email, mailformat, lastaccess, lang, '. + 'maildisplay, auth, suspended, deleted, emailstop, username')) { + $SESSION->emailto[$id][$m[2]] = $user; + $count++; + } + } + } + } +} +if ($course->id == SITEID) { + $strtitle = get_string('sitemessage'); + $PAGE->set_pagelayout('admin'); +} else { + $strtitle = get_string('coursemessage'); + $PAGE->set_pagelayout('incourse'); +} +$link = null; +if (has_capability('moodle/course:viewparticipants', $coursecontext) || + has_capability('moodle/site:viewparticipants', $systemcontext)) { + $link = new moodle_url("/user/index.php", array('id' => $course->id)); +} +$PAGE->navbar->add(get_string('participants'), $link); +$PAGE->navbar->add($strtitle); +$PAGE->set_title($strtitle); +$PAGE->set_heading($strtitle); +echo $OUTPUT->header(); + +if ($count) { + if ($count == 1) { + $heading = get_string('addedrecip', 'moodle', $count); + } else { + $heading = get_string('addedrecips', 'moodle', $count); + } + echo $OUTPUT->heading($heading); +} +if (!empty($messagebody) && !$edit && !$deluser && ($preview || $send)) { + require_sesskey(); + if (count($SESSION->emailto[$id])) { + if (!empty($preview)) { + echo '
+ + + + +'; + echo "

".get_string('previewhtml')."

"; + echo "
\n".format_text($messagebody, $format)."\n
\n"; + echo '

'."\n"; + echo '

'; + echo "\n
"; + } else if (!empty($send)) { + $fails = array(); + foreach ($SESSION->emailto[$id] as $user) { + if (!message_post_message($USER, $user, $messagebody, $format)) { + $user->fullname = fullname($user); + $fails[] = get_string('messagedselecteduserfailed', 'moodle', $user); + }; + } + if (empty($fails)) { + echo $OUTPUT->heading(get_string('messagedselectedusers')); + unset($SESSION->emailto[$id]); + unset($SESSION->emailselect[$id]); + } else { + echo $OUTPUT->heading(get_string('messagedselectedcountusersfailed', 'moodle', count($fails))); + echo ''; + } + echo '

'.get_string('backtoparticipants').'

'; + } + echo $OUTPUT->footer(); + exit; + } else { + echo $OUTPUT->notification(get_string('nousersyet')); + } +} +echo '

'.get_string("keepsearching").''. + ((count($SESSION->emailto[$id])) ? ', '.get_string('usemessageform') : '').'

'; +if ((!empty($send) || !empty($preview) || !empty($edit)) && (empty($messagebody))) { + echo $OUTPUT->notification(get_string('allfieldsrequired')); +} +if (count($SESSION->emailto[$id])) { + require_sesskey(); + require("message.html"); +} +$PAGE->requires->yui_module('moodle-core-formchangechecker', + 'M.core_formchangechecker.init', + array(array( + 'formid' => 'theform' + )) +); +$PAGE->requires->string_for_js('changesmadereallygoaway', 'moodle'); +echo $OUTPUT->footer(); \ No newline at end of file diff --git a/renderer.php b/renderer.php index 93a19a4..d08b4f6 100644 --- a/renderer.php +++ b/renderer.php @@ -1177,8 +1177,6 @@ class mod_attendance_renderer extends plugin_renderer_base { if ($bulkmessagecapability) { // Require that the user can bulk message users. // Display check boxes that will allow the user to send a message to the students that have been checked. $output = html_writer::empty_tag('input', array('name' => 'sesskey', 'type' => 'hidden', 'value' => sesskey())); - $output .= html_writer::empty_tag('input', array('name' => 'formaction', 'type' => 'hidden', - 'value' => 'messageselect.php')); $output .= html_writer::empty_tag('input', array('name' => 'id', 'type' => 'hidden', 'value' => $COURSE->id)); $output .= html_writer::empty_tag('input', array('name' => 'returnto', 'type' => 'hidden', 'value' => s(me()))); $output .= html_writer::table($table).html_writer::tag('div', get_string('users').': '.count($reportdata->users));; @@ -1187,7 +1185,7 @@ class mod_attendance_renderer extends plugin_renderer_base { 'value' => get_string('messageselectadd'), 'class' => 'btn btn-secondary')), array('class' => 'buttons')); - $url = new moodle_url('/user/action_redir.php'); + $url = new moodle_url('/mod/attendance/messageselect.php'); return html_writer::tag('form', $output, array('action' => $url->out(), 'method' => 'post')); } else { return html_writer::table($table).html_writer::tag('div', get_string('users').': '.count($reportdata->users));