Autoría | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Show the non-respondents to a questionnaire.
* @author Joseph Rézeau (copied from feedback plugin show_nonrespondents by original author Andreas Grabs)
* @copyright 2016 Mike Churchward (mike.churchward@poetopensource.org)
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package mod_questionnaire
*
*/
require_once("../../config.php");
require_once($CFG->dirroot.'/mod/questionnaire/locallib.php');
require_once($CFG->dirroot.'/mod/questionnaire/questionnaire.class.php');
require_once($CFG->libdir.'/tablelib.php');
// Get the params.
$id = required_param('id', PARAM_INT);
$subject = optional_param('subject', '', PARAM_CLEANHTML);
$message = optional_param('message', '', PARAM_CLEANHTML);
$format = optional_param('format', FORMAT_MOODLE, PARAM_INT);
$messageuser = optional_param_array('messageuser', false, PARAM_INT);
$action = optional_param('action', '', PARAM_ALPHA);
$selectedanonymous = optional_param('selectedanonymous', '', PARAM_ALPHA);
$perpage = optional_param('perpage', QUESTIONNAIRE_DEFAULT_PAGE_COUNT, PARAM_INT); // How many per page.
$showall = optional_param('showall', false, PARAM_INT); // Should we show all users?
$sid = optional_param('sid', 0, PARAM_INT);
$qid = optional_param('qid', 0, PARAM_INT);
$currentgroupid = optional_param('group', 0, PARAM_INT); // Groupid.
if (!isset($SESSION->questionnaire)) {
$SESSION->questionnaire = new stdClass();
}
$SESSION->questionnaire->current_tab = 'nonrespondents';
// Get the objects.
if ($id) {
if (! $cm = get_coursemodule_from_id('questionnaire', $id)) {
throw new \moodle_exception('invalidcoursemodule', 'mod_questionnaire');
}
if (! $course = $DB->get_record("course", array("id" => $cm->course))) {
throw new \moodle_exception('coursemisconf', 'mod_questionnaire');
}
if (! $questionnaire = $DB->get_record("questionnaire", array("id" => $cm->instance))) {
throw new \moodle_exception('invalidcoursemodule', 'mod_questionnaire');
}
}
if (!$context = context_module::instance($cm->id)) {
throw new \moodle_exception('badcontext', 'mod_questionnaire');
}
// We need the coursecontext to allow sending of mass mails.
if (!$coursecontext = context_course::instance($course->id)) {
throw new \moodle_exception('badcontext', 'mod_questionnaire');
}
require_course_login($course, true, $cm);
$url = new moodle_url('/mod/questionnaire/show_nonrespondents.php', array('id' => $cm->id));
$PAGE->set_url($url);
$questionnaire = new questionnaire($course, $cm, $sid, $questionnaire);
// Add renderer and page objects to the questionnaire object for display use.
$questionnaire->add_renderer($PAGE->get_renderer('mod_questionnaire'));
$questionnaire->add_page(new \mod_questionnaire\output\nonrespondentspage());
$resume = $questionnaire->resume;
$fullname = $questionnaire->respondenttype == 'fullname';
$sid = $questionnaire->sid;
if (($formdata = data_submitted()) && !confirm_sesskey()) {
throw new \moodle_exception('invalidsesskey', 'mod_questionnaire');
}
require_capability('mod/questionnaire:viewsingleresponse', $context);
// Anonymous questionnaire.
if (!$fullname) {
$nonrespondents = questionnaire_get_incomplete_users($cm, $sid);
$countnonrespondents = count($nonrespondents);
if ($resume) {
$countstarted = 0;
$countnotstarted = 0;
$params = ['questionnaireid' => $questionnaire->id, 'complete' => 'n'];
if ($startedusers = $DB->get_records('questionnaire_response', $params, '', 'userid')) {
$startedusers = array_keys($startedusers);
$countstarted = count($startedusers);
$countnotstarted = $countnonrespondents - $countstarted;
}
}
}
if ($action == 'sendmessage' && !empty($subject) && !empty($message)) {
if (!$fullname) {
switch ($selectedanonymous) {
case 'none':
$messageuser = '';
break;
case 'all':
$messageuser = $nonrespondents;
break;
case 'started':
$messageuser = $startedusers;
break;
case 'notstarted':
$messageuser = array_diff($nonrespondents, $startedusers);
}
}
$shortname = format_string($course->shortname,
true,
array('context' => context_course::instance($course->id)));
$strquestionnaires = get_string("modulenameplural", "questionnaire");
$htmlmessage = "<body id=\"email\">";
$link1 = $CFG->wwwroot.'/mod/questionnaire/view.php?id='.$cm->id;
$htmlmessage .= '<div class="navbar">'.
'<a target="_blank" href="'.$link1.'">'.format_string($questionnaire->name, true).'</a>'.
'</div>';
$htmlmessage .= $message;
$htmlmessage .= '</body>';
$good = 1;
if (is_array($messageuser)) {
foreach ($messageuser as $userid) {
$senduser = $DB->get_record('user', array('id' => $userid));
$eventdata = new \core\message\message();
$eventdata->courseid = $course->id;
$eventdata->name = 'message';
$eventdata->component = 'mod_questionnaire';
$eventdata->userfrom = $USER;
$eventdata->userto = $senduser;
$eventdata->subject = $subject;
$eventdata->fullmessage = html_to_text($htmlmessage);
$eventdata->fullmessageformat = FORMAT_PLAIN;
$eventdata->fullmessagehtml = $htmlmessage;
$eventdata->smallmessage = '';
$good = $good && message_send($eventdata);
}
if (!empty($good)) {
$msg = $questionnaire->renderer->heading(get_string('messagedselectedusers'));
} else {
$msg = $questionnaire->renderer->heading(get_string('messagedselectedusersfailed'));
}
$url = new moodle_url('/mod/questionnaire/view.php', array('id' => $cm->id));
redirect($url, $msg, 4);
exit;
}
}
// Get the responses of given user.
// Print the page header.
$PAGE->navbar->add(get_string('show_nonrespondents', 'questionnaire'));
$PAGE->set_heading(format_string($course->fullname));
$PAGE->set_title(format_string($questionnaire->name));
echo $questionnaire->renderer->header();
require('tabs.php');
$usedgroupid = false;
$sort = '';
$startpage = false;
$pagecount = false;
if ($fullname) {
// Print the main part of the page.
// Print the users with no responses
// Get the effective groupmode of this course and module.
$groupmode = groups_get_activity_groupmode($cm, $course);
$groupselect = groups_print_activity_menu($cm, $url->out(), true);
$mygroupid = groups_get_activity_group($cm);
// Preparing the table for output.
$baseurl = new moodle_url('/mod/questionnaire/show_nonrespondents.php');
$baseurl->params(array('id' => $cm->id, 'showall' => $showall));
$tablecolumns = array('userpic', 'fullname');
// Extra columns copied from participants view.
if (class_exists('\core_user\fields')) {
$extrafields = \core_user\fields::get_identity_fields(null, false);
} else {
$extrafields = get_extra_user_fields($context);
}
$tableheaders = array(get_string('userpic'), get_string('fullnameuser'));
if (in_array('email', $extrafields) || has_capability('moodle/course:viewhiddenuserfields', $context)) {
$tablecolumns[] = 'email';
$tableheaders[] = get_string('email');
}
if (!isset($hiddenfields['city'])) {
$tablecolumns[] = 'city';
$tableheaders[] = get_string('city');
}
if (!isset($hiddenfields['country'])) {
$tablecolumns[] = 'country';
$tableheaders[] = get_string('country');
}
if (!isset($hiddenfields['lastaccess'])) {
$tablecolumns[] = 'lastaccess';
$tableheaders[] = get_string('lastaccess');
}
if ($resume) {
$tablecolumns[] = 'status';
$tableheaders[] = get_string('status');
}
if (has_capability('mod/questionnaire:message', $context)) {
$tablecolumns[] = 'select';
$tableheaders[] = get_string('select');
}
$table = new flexible_table('questionnaire-shownonrespondents-'.$course->id);
$table->define_columns($tablecolumns);
$table->define_headers($tableheaders);
$table->define_baseurl($baseurl);
$table->sortable(true, 'lastname', SORT_DESC);
$table->set_attribute('cellspacing', '0');
$table->set_attribute('id', 'showentrytable');
$table->set_attribute('class', 'flexible generaltable generalbox');
$table->set_control_variables(array(
TABLE_VAR_SORT => 'ssort',
TABLE_VAR_IFIRST => 'sifirst',
TABLE_VAR_ILAST => 'silast',
TABLE_VAR_PAGE => 'spage'
));
$table->no_sorting('status');
$table->no_sorting('select');
$table->setup();
if ($table->get_sql_sort()) {
$sort = $table->get_sql_sort();
} else {
$sort = '';
}
// Get students in conjunction with groupmode.
if ($groupmode > 0) {
if ($mygroupid > 0) {
$usedgroupid = $mygroupid;
} else {
$usedgroupid = false;
}
} else {
$usedgroupid = false;
}
$nonrespondents = questionnaire_get_incomplete_users($cm, $sid, $usedgroupid);
if (is_array($nonrespondents) || is_object($nonrespondents)) {
$countnonrespondents = count($nonrespondents);
} else {
$countnonrespondents = 0;
}
$table->initialbars(false);
if ($showall) {
$startpage = false;
$pagecount = false;
} else {
$table->pagesize($perpage, $countnonrespondents);
$startpage = $table->get_page_start();
$pagecount = $table->get_page_size();
}
}
$nonrespondents = questionnaire_get_incomplete_users($cm, $sid, $usedgroupid, $sort, $startpage, $pagecount);
// Viewreports-start.
// Print the list of students.
$questionnaire->page->add_to_page('formarea', (isset($groupselect) ? $groupselect : ''));
$questionnaire->page->add_to_page('formarea', html_writer::tag('div', '', ['class' => 'clearer']));
$questionnaire->page->add_to_page('formarea', $questionnaire->renderer->box_start('left-align'));
$countries = get_string_manager()->get_list_of_countries();
$strnever = get_string('never');
$datestring = new stdClass();
$datestring->year = get_string('year');
$datestring->years = get_string('years');
$datestring->day = get_string('day');
$datestring->days = get_string('days');
$datestring->hour = get_string('hour');
$datestring->hours = get_string('hours');
$datestring->min = get_string('min');
$datestring->mins = get_string('mins');
$datestring->sec = get_string('sec');
$datestring->secs = get_string('secs');
if (!$nonrespondents) {
$questionnaire->page->add_to_page('formarea',
$questionnaire->renderer->notification(get_string('noexistingparticipants', 'enrol')));
} else {
$questionnaire->page->add_to_page('formarea', get_string('non_respondents', 'questionnaire'));
$questionnaire->page->add_to_page('formarea', ' ('.$countnonrespondents.')');
if (!$fullname) {
$questionnaire->page->add_to_page('formarea', ' ['.get_string('anonymous', 'questionnaire').']');
}
$questionnaire->page->add_to_page('formarea', html_writer::start_tag('form',
['class' => 'mform', 'action' => 'show_nonrespondents.php', 'method' => 'post', 'id' => 'questionnaire_sendmessageform']));
$buffering = false;
if ($fullname) {
// Since flexible tables only writes out directly, we need to start buffering in case anything gets written...
ob_start();
$buffering = true;
foreach ($nonrespondents as $nonrespondent) {
$user = $DB->get_record('user', array('id' => $nonrespondent));
// Userpicture and link to the profilepage.
$profileurl = $CFG->wwwroot.'/user/view.php?id='.$user->id.'&course='.$course->id;
$profilelink = '<strong><a href="'.$profileurl.'">'.fullname($user).'</a></strong>';
$data = array ($questionnaire->renderer->user_picture($user, array('courseid' => $course->id)), $profilelink);
if (in_array('email', $tablecolumns)) {
$data[] = $user->email;
}
if (!isset($hiddenfields['city'])) {
$data[] = $user->city;
}
if (!isset($hiddenfields['country'])) {
$data[] = (!empty($user->country)) ? $countries[$user->country] : '';
}
if ($user->lastaccess) {
$lastaccess = format_time(time() - $user->lastaccess, $datestring);
} else {
$lastaccess = get_string('never');
}
$data[] = $lastaccess;
if (has_capability('mod/questionnaire:message', $context)) {
// If questionnaire is set to "resume", look for saved (not completed) responses
// we use the alt attribute of the checkboxes to store the started/not started value!
$checkboxaltvalue = '';
if ($resume) {
if ($DB->record_exists('questionnaire_response', ['questionnaireid' => $questionnaire->id,
'userid' => $nonrespondent, 'complete' => 'n']) ) {
$data[] = get_string('started', 'questionnaire');
$checkboxaltvalue = 1;
} else {
$data[] = get_string('not_started', 'questionnaire');
$checkboxaltvalue = 0;
}
}
$data[] = '<input type="checkbox" class="usercheckbox" name="messageuser[]" value="'.
$user->id.'" alt="'.$checkboxaltvalue.'" />';
}
$table->add_data($data);
}
if (isset($table)) {
$questionnaire->page->add_to_page('formarea', $questionnaire->renderer->flexible_table($table, $buffering));
} else if ($buffering) {
ob_end_clean();
}
$allurl = new moodle_url($baseurl);
if ($showall) {
$allurl->param('showall', 0);
$questionnaire->page->add_to_page('formarea',
$questionnaire->renderer->container(html_writer::link($allurl,
get_string('showperpage', '', QUESTIONNAIRE_DEFAULT_PAGE_COUNT)), array(), 'showall'));
} else if ($countnonrespondents > 0 && $perpage < $countnonrespondents) {
$allurl->param('showall', 1);
$questionnaire->page->add_to_page('formarea', $questionnaire->renderer->container(html_writer::link($allurl,
get_string('showall', '', $countnonrespondents)), array(), 'showall'));
}
if (has_capability('mod/questionnaire:message', $context)) {
$questionnaire->page->add_to_page('formarea',
$questionnaire->renderer->box_start('mdl-align')); // Selection buttons container.
$questionnaire->page->add_to_page('formarea', '<div class="buttons">');
$questionnaire->page->add_to_page('formarea',
'<input type="button" id="checkall" class="btn btn-secondary" value="'.get_string('selectall').'" /> ');
$questionnaire->page->add_to_page('formarea',
'<input type="button" id="checknone" class="btn btn-secondary" value="'.get_string('deselectall').'" /> ');
if ($resume) {
if ($perpage >= $countnonrespondents) {
$questionnaire->page->add_to_page('formarea',
'<input type="button" id="checkstarted" class="btn btn-secondary" value="' .
get_string('checkstarted', 'questionnaire').'" />'."\n");
$questionnaire->page->add_to_page('formarea',
'<input type="button" id="checknotstarted" class="btn btn-secondary" value="'.
get_string('checknotstarted', 'questionnaire').'" />'."\n");
}
}
$questionnaire->page->add_to_page('formarea', '</div>');
$questionnaire->page->add_to_page('formarea', $questionnaire->renderer->box_end());
if ($action == 'sendmessage' && !is_array($messageuser)) {
$questionnaire->page->add_to_page('formarea',
$questionnaire->renderer->notification(get_string('nousersselected', 'questionnaire')));
}
}
} else {// Anonymous questionnaire.
if (has_capability('mod/questionnaire:message', $context)) {
$questionnaire->page->add_to_page('formarea', '<fieldset>');
$questionnaire->page->add_to_page('formarea', '<legend>'.get_string('send_message_to', 'questionnaire').'</legend>');
$checked = ($selectedanonymous == '' || $selectedanonymous == 'none') ? 'checked = "checked"' : '';
$questionnaire->page->add_to_page('formarea',
' <input type="radio" name="selectedanonymous" value="none" id="none" '.$checked.' />
<label for="none">'.get_string('none').'</label>');
$checked = ($selectedanonymous == 'all') ? 'checked = "checked"' : '';
$questionnaire->page->add_to_page('formarea',
'<input type="radio" name="selectedanonymous" value="all" id="nonrespondents" '.$checked.' />
<label for="all">'.get_string('all', 'questionnaire').'</label>');
if ($resume) {
if ($countstarted > 0) {
$checked = ($selectedanonymous == 'started') ? 'checked = "checked"' : '';
$questionnaire->page->add_to_page('formarea',
'<input type="radio" name="selectedanonymous" value="started" id="started" '.$checked.' />
<label for="started">'.get_string('status').': '.
get_string('started', 'questionnaire').' ('.$countstarted.')</label>');
}
if ($countnotstarted > 0) {
if ($selectedanonymous == 'notstarted') {
$checked = 'checked = "checked"';
} else {
$checked = '';
}
$checked = ($selectedanonymous == 'notstarted') ? 'checked = "checked"' : '';
$questionnaire->page->add_to_page('formarea',
'<input type="radio" name="selectedanonymous" value="notstarted" id="notstarted" '.$checked.' />
<label for="notstarted">'.get_string('status').': '.
get_string('not_started', 'questionnaire').' ('.$countnotstarted.')</label>');
}
}
if ($action == 'sendmessage' && $selectedanonymous == 'none') {
$questionnaire->page->add_to_page('formarea',
$questionnaire->renderer->notification(get_string('nousersselected', 'questionnaire')));
}
$questionnaire->page->add_to_page('formarea', '</fieldset>');
}
}
if (has_capability('mod/questionnaire:message', $context)) {
// Message editor.
// Prepare data.
$questionnaire->page->add_to_page('formarea', '<fieldset class="clearfix">');
if ($action == 'sendmessage' && (empty($subject) || empty($message))) {
$questionnaire->page->add_to_page('formarea', $questionnaire->renderer->notification(get_string('allfieldsrequired')));
}
$questionnaire->page->add_to_page('formarea',
'<legend class="ftoggler">'.get_string('send_message', 'questionnaire').'</legend>');
$id = 'message' . '_id';
$subjecteditor = ' <input type="text" id="questionnaire_subject" class="form-control" size="65"
maxlength="255" name="subject" value="'.$subject.'" />';
$format = '';
$editor = editors_get_preferred_editor();
$editor->use_editor($id, questionnaire_get_editor_options($context));
$texteditor = html_writer::tag('div', html_writer::tag('textarea', $message,
array('id' => $id, 'name' => "message", 'class' => "form-control", 'rows' => '10', 'cols' => '60')));
$questionnaire->page->add_to_page('formarea', '<input type="hidden" name="format" value="'.FORMAT_HTML.'" />');
// Print editor.
$table = new html_table();
$table->align = array('left', 'left');
$table->data[] = array( '<strong>'.get_string('subject', 'questionnaire').'</strong>', $subjecteditor);
$table->data[] = array('<strong>'.get_string('messagebody').'</strong>', $texteditor);
$questionnaire->page->add_to_page('formarea', html_writer::table($table));
// Send button.
$questionnaire->page->add_to_page('formarea', $questionnaire->renderer->box_start('mdl-left'));
$questionnaire->page->add_to_page('formarea', '<div class="buttons">');
$questionnaire->page->add_to_page('formarea', '<input type="submit" name="send_message" class="btn btn-secondary" value="' .
get_string('send', 'questionnaire').'" />');
$questionnaire->page->add_to_page('formarea', '</div>');
$questionnaire->page->add_to_page('formarea', $questionnaire->renderer->box_end());
$questionnaire->page->add_to_page('formarea', '<input type="hidden" name="sesskey" value="'.sesskey().'" />');
$questionnaire->page->add_to_page('formarea', '<input type="hidden" name="action" value="sendmessage" />');
$questionnaire->page->add_to_page('formarea', '<input type="hidden" name="id" value="'.$cm->id.'" />');
$questionnaire->page->add_to_page('formarea', '</fieldset>');
$questionnaire->page->add_to_page('formarea', html_writer::end_tag('form'));
// Include the needed js.
$module = array('name' => 'mod_questionnaire', 'fullpath' => '/mod/questionnaire/module.js');
$PAGE->requires->js_init_call('M.mod_questionnaire.init_sendmessage', null, false, $module);
}
}
$questionnaire->page->add_to_page('formarea', $questionnaire->renderer->box_end());
// Finish the page.
echo $questionnaire->renderer->render($questionnaire->page);
echo $questionnaire->renderer->footer();
// Log this questionnaire show non-respondents action.
$context = context_module::instance($questionnaire->cm->id);
$anonymous = $questionnaire->respondenttype == 'anonymous';
$event = \mod_questionnaire\event\non_respondents_viewed::create(array(
'objectid' => $questionnaire->id,
'anonymous' => $anonymous,
'context' => $context
));
$event->trigger();