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/>./*** The main report page for a questionnaire.** @package mod_questionnaire* @copyright 2016 Mike Churchward (mike.churchward@poetgroup.org)* @author Mike Churchward* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later**/require_once("../../config.php");require_once($CFG->dirroot.'/mod/questionnaire/questionnaire.class.php');$instance = optional_param('instance', false, PARAM_INT); // Questionnaire ID.$action = optional_param('action', 'vall', PARAM_ALPHA);$sid = optional_param('sid', null, PARAM_INT); // Survey id.$rid = optional_param('rid', false, PARAM_INT);$type = optional_param('type', '', PARAM_ALPHA);$byresponse = optional_param('byresponse', false, PARAM_INT);$individualresponse = optional_param('individualresponse', false, PARAM_INT);$currentgroupid = optional_param('group', 0, PARAM_INT); // Groupid.$user = optional_param('user', '', PARAM_INT);$outputtarget = optional_param('target', 'html', PARAM_ALPHA); // Default 'html'. Could be 'pdf'.$userid = $USER->id;switch ($action) {case 'vallasort':$sort = 'ascending';break;case 'vallarsort':$sort = 'descending';break;default:$sort = 'default';}if ($instance === false) {if (!empty($SESSION->instance)) {$instance = $SESSION->instance;} else {throw new \moodle_exception('requiredparameter', 'mod_questionnaire');}}$SESSION->instance = $instance;$usergraph = get_config('questionnaire', 'usergraph');if (! $questionnaire = $DB->get_record("questionnaire", array("id" => $instance))) {throw new \moodle_exception('incorrectquestionnaire', 'mod_questionnaire');}if (! $course = $DB->get_record("course", array("id" => $questionnaire->course))) {throw new \moodle_exception('coursemisconf', 'mod_questionnaire');}if (! $cm = get_coursemodule_from_instance("questionnaire", $questionnaire->id, $course->id)) {throw new \moodle_exception('invalidcoursemodule', 'mod_questionnaire');}require_course_login($course, true, $cm);$questionnaire = new questionnaire($course, $cm, 0, $questionnaire);// Add renderer and page objects to the questionnaire object for display use.$questionnaire->add_renderer($PAGE->get_renderer('mod_questionnaire'));if ($outputtarget == 'pdf') {if ($action == 'vresp') {$questionnaire->add_page(new \mod_questionnaire\output\responsepagepdf());} else {$questionnaire->add_page(new \mod_questionnaire\output\reportpagepdf());}} else { // Default to HTML.$questionnaire->add_page(new \mod_questionnaire\output\reportpage());}// If you can't view the questionnaire, or can't view a specified response, error out.$context = context_module::instance($cm->id);if (!$questionnaire->can_view_all_responses() && !$individualresponse) {// Should never happen, unless called directly by a snoop...throw new \moodle_exception('nopermissions', 'mod_questionnaire');}$questionnaire->canviewallgroups = has_capability('moodle/site:accessallgroups', $context);$sid = $questionnaire->survey->id;$url = new moodle_url($CFG->wwwroot.'/mod/questionnaire/report.php');if ($instance) {$url->param('instance', $instance);}$url->param('action', $action);if ($type) {$url->param('type', $type);}if ($byresponse || $individualresponse) {$url->param('byresponse', 1);}if ($user) {$url->param('user', $user);}if ($action == 'dresp') {$url->param('action', 'dresp');$url->param('byresponse', 1);$url->param('rid', $rid);$url->param('individualresponse', 1);}if ($currentgroupid !== null) {$url->param('group', $currentgroupid);}$PAGE->set_url($url);$PAGE->set_context($context);if ($outputtarget == 'print') {$PAGE->set_pagelayout('popup');}// Tab setup.if (!isset($SESSION->questionnaire)) {$SESSION->questionnaire = new stdClass();}$SESSION->questionnaire->current_tab = 'allreport';// Get all responses for further use in viewbyresp and deleteall etc.// All participants.$respsallparticipants = $questionnaire->get_responses();$SESSION->questionnaire->numrespsallparticipants = count ($respsallparticipants);$SESSION->questionnaire->numselectedresps = $SESSION->questionnaire->numrespsallparticipants;// Available group modes (0 = no groups; 1 = separate groups; 2 = visible groups).$groupmode = groups_get_activity_groupmode($cm, $course);$questionnairegroups = '';$groupscount = 0;$SESSION->questionnaire->respscount = 0;$SESSION->questionnaire_surveyid = $sid;if ($groupmode > 0) {if ($groupmode == 1) {$questionnairegroups = groups_get_all_groups($course->id, $userid);}if ($groupmode == 2 || $questionnaire->canviewallgroups) {$questionnairegroups = groups_get_all_groups($course->id);}if (!empty($questionnairegroups)) {$groupscount = count($questionnairegroups);foreach ($questionnairegroups as $key) {$firstgroupid = $key->id;break;}if ($groupscount === 0 && $groupmode == 1) {$currentgroupid = 0;}if ($groupmode == 1 && !$questionnaire->canviewallgroups && $currentgroupid == 0) {$currentgroupid = $firstgroupid;}} else {// Groupmode = separate groups but user is not member of any group// and does not have moodle/site:accessallgroups capability -> refuse view responses.if (!$questionnaire->canviewallgroups) {$currentgroupid = 0;}}if ($currentgroupid > 0) {$groupname = get_string('group').' <strong>'.groups_get_group_name($currentgroupid).'</strong>';} else {$groupname = '<strong>'.get_string('allparticipants').'</strong>';}}if ($usergraph) {$charttype = $questionnaire->survey->chart_type;if ($charttype) {$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.common.core.js');switch ($charttype) {case 'bipolar':$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.bipolar.js');break;case 'hbar':$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.hbar.js');break;case 'radar':$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.radar.js');break;case 'rose':$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.rose.js');break;case 'vprogress':$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.vprogress.js');break;}}}switch ($action) {case 'dresp': // Delete individual response? Ask for confirmation.require_capability('mod/questionnaire:deleteresponses', $context);if (empty($questionnaire->survey)) {$id = $questionnaire->survey;notify ("questionnaire->survey = /$id/");throw new \moodle_exception('surveynotexists', 'mod_questionnaire');} else if ($questionnaire->survey->courseid != $course->id) {throw new \moodle_exception('surveyowner', 'mod_questionnaire');} else if (!$rid || !is_numeric($rid)) {throw new \moodle_exception('invalidresponse', 'mod_questionnaire');} else if (!($resp = $DB->get_record('questionnaire_response', array('id' => $rid)))) {throw new \moodle_exception('invalidresponserecord', 'mod_questionnaire');}$ruser = false;if (!empty($resp->userid)) {if ($user = $DB->get_record('user', ['id' => $resp->userid])) {$ruser = fullname($user);} else {$ruser = '- '.get_string('unknown', 'questionnaire').' -';}} else {$ruser = $resp->userid;}// Print the page header.$PAGE->set_title(get_string('deletingresp', 'questionnaire'));$PAGE->set_heading(format_string($course->fullname));echo $questionnaire->renderer->header();// Print the tabs.$SESSION->questionnaire->current_tab = 'deleteresp';include('tabs.php');$timesubmitted = '<br />'.get_string('submitted', 'questionnaire').' '.userdate($resp->submitted);if ($questionnaire->respondenttype == 'anonymous') {$ruser = '- '.get_string('anonymous', 'questionnaire').' -';$timesubmitted = '';}// Print the confirmation.$msg = '<div class="warning centerpara">';$msg .= get_string('confirmdelresp', 'questionnaire', $ruser.$timesubmitted);$msg .= '</div>';$urlyes = new moodle_url('report.php', array('action' => 'dvresp','rid' => $rid, 'individualresponse' => 1, 'instance' => $instance, 'group' => $currentgroupid));$urlno = new moodle_url('report.php', array('action' => 'vresp', 'instance' => $instance,'rid' => $rid, 'individualresponse' => 1, 'group' => $currentgroupid));$buttonyes = new single_button($urlyes, get_string('delete'), 'post');$buttonno = new single_button($urlno, get_string('cancel'), 'get');$questionnaire->page->add_to_page('notifications', $questionnaire->renderer->confirm($msg, $buttonyes, $buttonno));echo $questionnaire->renderer->render($questionnaire->page);// Finish the page.echo $questionnaire->renderer->footer($course);break;case 'delallresp': // Delete all responses? Ask for confirmation.require_capability('mod/questionnaire:deleteresponses', $context);if (!empty($respsallparticipants)) {// Print the page header.$PAGE->set_title(get_string('deletingresp', 'questionnaire'));$PAGE->set_heading(format_string($course->fullname));echo $questionnaire->renderer->header();// Print the tabs.$SESSION->questionnaire->current_tab = 'deleteall';include('tabs.php');// Print the confirmation.$msg = '<div class="warning centerpara">';if ($groupmode == 0) { // No groups or visible groups.$msg .= get_string('confirmdelallresp', 'questionnaire');} else { // Separate groups.$msg .= get_string('confirmdelgroupresp', 'questionnaire', $groupname);}$msg .= '</div>';$urlyes = new moodle_url('report.php', array('action' => 'dvallresp', 'sid' => $sid,'instance' => $instance, 'group' => $currentgroupid));$urlno = new moodle_url('report.php', array('instance' => $instance, 'group' => $currentgroupid));$buttonyes = new single_button($urlyes, get_string('delete'), 'post');$buttonno = new single_button($urlno, get_string('cancel'), 'get');$questionnaire->page->add_to_page('notifications', $questionnaire->renderer->confirm($msg, $buttonyes, $buttonno));echo $questionnaire->renderer->render($questionnaire->page);// Finish the page.echo $questionnaire->renderer->footer($course);}break;case 'dvresp': // Delete single response. Do it!require_capability('mod/questionnaire:deleteresponses', $context);if (empty($questionnaire->survey)) {throw new \moodle_exception('surveynotexists', 'mod_questionnaire');} else if ($questionnaire->survey->courseid != $course->id) {throw new \moodle_exception('surveyowner', 'mod_questionnaire');} else if (!$rid || !is_numeric($rid)) {throw new \moodle_exception('invalidresponse', 'mod_questionnaire');} else if (!($response = $DB->get_record('questionnaire_response', array('id' => $rid)))) {throw new \moodle_exception('invalidresponserecord', 'mod_questionnaire');}if (questionnaire_delete_response($response, $questionnaire)) {if (!$DB->count_records('questionnaire_response', array('questionnaireid' => $questionnaire->id, 'complete' => 'y'))) {$redirection = $CFG->wwwroot.'/mod/questionnaire/view.php?id='.$cm->id;} else {$redirection = $CFG->wwwroot.'/mod/questionnaire/report.php?action=vresp&instance='.$instance.'&byresponse=1';}// Log this questionnaire delete single response action.$params = array('objectid' => $questionnaire->survey->id,'context' => $questionnaire->context,'courseid' => $questionnaire->course->id,'relateduserid' => $response->userid);$event = \mod_questionnaire\event\response_deleted::create($params);$event->trigger();redirect($redirection);} else {if ($questionnaire->respondenttype == 'anonymous') {$ruser = '- '.get_string('anonymous', 'questionnaire').' -';} else if (!empty($response->userid)) {if ($user = $DB->get_record('user', ['id' => $response->userid])) {$ruser = fullname($user);} else {$ruser = '- '.get_string('unknown', 'questionnaire').' -';}} else {$ruser = $response->userid;}error (get_string('couldnotdelresp', 'questionnaire').$rid.get_string('by', 'questionnaire').$ruser.'?',$CFG->wwwroot.'/mod/questionnaire/report.php?action=vresp&sid='.$sid.'&&instance='.$instance.'byresponse=1');}break;case 'dvallresp': // Delete all responses in questionnaire (or group). Do it!require_capability('mod/questionnaire:deleteresponses', $context);if (empty($questionnaire->survey)) {throw new \moodle_exception('surveynotexists', 'mod_questionnaire');} else if ($questionnaire->survey->courseid != $course->id) {throw new \moodle_exception('surveyowner', 'mod_questionnaire');}// Available group modes (0 = no groups; 1 = separate groups; 2 = visible groups).if ($groupmode > 0) {switch ($currentgroupid) {case 0: // All participants.$resps = $respsallparticipants;break;default: // Members of a specific group.if (!($resps = $questionnaire->get_responses(false, $currentgroupid))) {$resps = [];}}if (empty($resps)) {$noresponses = true;} else {if ($rid === false) {$resp = current($resps);$rid = $resp->id;} else {$resp = $DB->get_record('questionnaire_response', array('id' => $rid));}if (!empty($resp->userid)) {if ($user = $DB->get_record('user', ['id' => $resp->userid])) {$ruser = fullname($user);} else {$ruser = '- '.get_string('unknown', 'questionnaire').' -';}} else {$ruser = $resp->userid;}}} else {$resps = $respsallparticipants;}if (!empty($resps)) {foreach ($resps as $response) {questionnaire_delete_response($response, $questionnaire);}if (!$questionnaire->count_submissions()) {$redirection = $CFG->wwwroot.'/mod/questionnaire/view.php?id='.$cm->id;} else {$redirection = $CFG->wwwroot.'/mod/questionnaire/report.php?action=vall&sid='.$sid.'&instance='.$instance;}// Log this questionnaire delete all responses action.$context = context_module::instance($questionnaire->cm->id);$anonymous = $questionnaire->respondenttype == 'anonymous';$event = \mod_questionnaire\event\all_responses_deleted::create(array('objectid' => $questionnaire->id,'anonymous' => $anonymous,'context' => $context));$event->trigger();redirect($redirection);} else {error (get_string('couldnotdelresp', 'questionnaire'),$CFG->wwwroot.'/mod/questionnaire/report.php?action=vall&sid='.$sid.'&instance='.$instance);}break;case 'dwnpg': // Download page options.require_capability('mod/questionnaire:downloadresponses', $context);$PAGE->set_title(get_string('questionnairereport', 'questionnaire'));$PAGE->set_heading(format_string($course->fullname));echo $questionnaire->renderer->header();// Print the tabs.// Tab setup.if (empty($user)) {$SESSION->questionnaire->current_tab = 'downloadcsv';} else {$SESSION->questionnaire->current_tab = 'mydownloadcsv';}include('tabs.php');$groupname = '';if ($groupmode > 0) {switch ($currentgroupid) {case 0: // All participants.$groupname = get_string('allparticipants');break;default: // Members of a specific group.$groupname = get_string('membersofselectedgroup', 'group').' '.get_string('group').' '.$questionnairegroups[$currentgroupid]->name;}}$output = '';$output .= "<br /><br />\n";$output .= $questionnaire->renderer->help_icon('downloadtextformat', 'questionnaire');$output .= ' ' . (get_string('downloadtextformat', 'questionnaire')) . ': ' .get_string('responses', 'questionnaire').' '.$groupname;$output .= $questionnaire->renderer->heading(get_string('textdownloadoptions', 'questionnaire'));$output .= $questionnaire->renderer->box_start();$downloadparams = ['instance' => $instance,'user' => $user,'sid' => $sid,'action' => 'dfs','group' => $currentgroupid];$extrafields = $questionnaire->renderer->render_from_template('mod_questionnaire/extrafields', []);$output .= $questionnaire->renderer->download_dataformat_selector(get_string('downloadtypes', 'questionnaire'),'report.php', 'downloadformat', $downloadparams, $extrafields);$output .= $questionnaire->renderer->box_end();$questionnaire->page->add_to_page('respondentinfo', $output);echo $questionnaire->renderer->render($questionnaire->page);echo $questionnaire->renderer->footer('none');// Log saved as text action.$params = array('objectid' => $questionnaire->id,'context' => $questionnaire->context,'courseid' => $course->id,'other' => array('action' => $action, 'instance' => $instance, 'currentgroupid' => $currentgroupid));$event = \mod_questionnaire\event\all_responses_saved_as_text::create($params);$event->trigger();exit();break;case 'dfs':require_capability('mod/questionnaire:downloadresponses', $context);require_once($CFG->dirroot . '/lib/dataformatlib.php');// Use the questionnaire name as the file name. Clean it and change any non-filename characters to '_'.$name = clean_param($questionnaire->name, PARAM_FILE);$name = preg_replace("/[^A-Z0-9]+/i", "_", trim($name));$choicecodes = optional_param('choicecodes', '0', PARAM_INT);$choicetext = optional_param('choicetext', '0', PARAM_INT);$showincompletes = optional_param('complete', '0', PARAM_INT);$rankaverages = optional_param('rankaverages', '0', PARAM_INT);$dataformat = optional_param('downloadformat', '', PARAM_ALPHA);$emailroles = optional_param('emailroles', 0, PARAM_INT);$emailextra = optional_param('emailextra', '', PARAM_RAW);$output = $questionnaire->generate_csv($currentgroupid, '', $user, $choicecodes, $choicetext, $showincompletes,$rankaverages);$columns = $output[0];unset($output[0]);// Check if email report was selected.$emailreport = optional_param('emailreport', '', PARAM_ALPHA);if (empty($emailreport)) {// In 3.9 forward, download_as_dataformat is replaced by \core\dataformat::download_data.if (method_exists('\\core\\dataformat', 'download_data')) {\core\dataformat::download_data($name, $dataformat, $columns, $output);} else {download_as_dataformat($name, $dataformat, $columns, $output);}} else {// Emailreport button selected.if (get_config('questionnaire', 'allowemailreporting') && (!empty($emailroles) || !empty($emailextra))) {require_once('savefileformat.php');$users = !empty($emailroles) ? $questionnaire->get_notifiable_users($USER->id) : [];$otheremails = explode(',', $emailextra);if (!empty($users) || !empty($otheremails)) {$thisurl = new moodle_url('report.php',['instance' => $instance, 'action' => 'dwnpg', 'group' => $currentgroupid]);save_as_dataformat($name, $dataformat, $columns, $output, $users, $otheremails, $thisurl);}} else {redirect(new moodle_url('report.php', ['instance' => $instance, 'action' => 'dwnpg', 'group' => $currentgroupid]),get_string('emailsnotspecified', 'questionnaire'));}}exit();break;case 'vall': // View all responses.case 'vallasort': // View all responses sorted in ascending order.case 'vallarsort': // View all responses sorted in descending order.$PAGE->set_title(get_string('questionnairereport', 'questionnaire'));$PAGE->set_heading(format_string($course->fullname));if (!$questionnaire->capabilities->readallresponses && !$questionnaire->capabilities->readallresponseanytime) {echo $questionnaire->renderer->header();// Should never happen, unless called directly by a snoop.throw new \moodle_exception('nopermissions', 'mod_questionnaire');// Finish the page.echo $questionnaire->renderer->footer($course);break;}// Print the tabs.switch ($action) {case 'vallasort':$SESSION->questionnaire->current_tab = 'vallasort';break;case 'vallarsort':$SESSION->questionnaire->current_tab = 'vallarsort';break;default:$SESSION->questionnaire->current_tab = 'valldefault';}if ($outputtarget != 'print') {include('tabs.php');}$respinfo = '';$resps = array();// Enable choose_group if there are questionnaire groups and groupmode is not set to "no groups"// and if there are more goups than 1 (or if user can view all groups).if (is_array($questionnairegroups) && $groupmode > 0) {$groupselect = groups_print_activity_menu($cm, $url->out(), true);// Count number of responses in each group.foreach ($questionnairegroups as $group) {$respscount = $questionnaire->count_submissions(false, $group->id);$thisgroupname = groups_get_group_name($group->id);$escapedgroupname = preg_quote($thisgroupname, '/');if (!empty ($respscount)) {// Add number of responses to name of group in the groups select list.$groupselect = preg_replace('/\<option value="'.$group->id.'">'.$escapedgroupname.'<\/option>/','<option value="'.$group->id.'">'.$thisgroupname.' ('.$respscount.')</option>', $groupselect);} else {// Remove groups with no responses from the groups select list.$groupselect = preg_replace('/\<option value="'.$group->id.'">'.$escapedgroupname.'<\/option>/', '', $groupselect);}}$respinfo .= isset($groupselect) ? ($groupselect . ' ') : '';$currentgroupid = groups_get_activity_group($cm);}if ($currentgroupid > 0) {$groupname = get_string('group').': <strong>'.groups_get_group_name($currentgroupid).'</strong>';} else {$groupname = '<strong>'.get_string('allparticipants').'</strong>';}// Available group modes (0 = no groups; 1 = separate groups; 2 = visible groups).if ($groupmode > 0) {switch ($currentgroupid) {case 0: // All participants.$resps = $respsallparticipants;break;default: // Members of a specific group.if (!($resps = $questionnaire->get_responses(false, $currentgroupid))) {$resps = '';}}if (empty($resps)) {$noresponses = true;}} else {$resps = $respsallparticipants;}if (!empty($resps)) {// NOTE: response_analysis uses $resps to get the id's of the responses only.// Need to figure out what this function does.$feedbackmessages = $questionnaire->response_analysis(0, $resps, false, false, true, $currentgroupid);if ($feedbackmessages) {$msgout = '';foreach ($feedbackmessages as $msg) {$msgout .= $msg;}$questionnaire->page->add_to_page('feedbackmessages', $msgout);}}$params = array('objectid' => $questionnaire->id,'context' => $context,'courseid' => $course->id,'other' => array('action' => $action, 'instance' => $instance, 'groupid' => $currentgroupid));if ($outputtarget == 'pdf') {$pdf = questionnaire_report_start_pdf();if ($currentgroupid > 0) {$groupname = get_string('group') . ': <strong>' . groups_get_group_name($currentgroupid) . '</strong>';} else {$groupname = '<strong>' . get_string('allparticipants') . '</strong>';}$respinfo = get_string('viewallresponses', 'questionnaire') . '. ' . $groupname . '. ';$strsort = get_string('order_' . $sort, 'questionnaire');$respinfo .= $strsort;$questionnaire->page->add_to_page('respondentinfo', $respinfo);$questionnaire->survey_results('', false, true, $currentgroupid, $sort);$html = $questionnaire->renderer->render($questionnaire->page);// Supress any warnings. There is at least one error in the TCPF library at line 16749 where 'text-align' is// not an array.$errorreporting = error_reporting(0);$pdf->writeHTML($html);@$pdf->Output(clean_param($questionnaire->name, PARAM_FILE), 'D');error_reporting($errorreporting);} else { // Default to HTML.$event = \mod_questionnaire\event\all_responses_viewed::create($params);$event->trigger();if ($outputtarget != 'print') {$linkname = get_string('downloadpdf', 'mod_questionnaire');$link = new moodle_url('/mod/questionnaire/report.php',['action' => 'vall', 'instance' => $instance, 'group' => $currentgroupid, 'target' => 'pdf']);$downpdficon = new pix_icon('f/pdf', $linkname);$respinfo .= $questionnaire->renderer->action_link($link, null, null, null, $downpdficon);$linkname = get_string('print', 'mod_questionnaire');$link = new \moodle_url('/mod/questionnaire/report.php',['action' => 'vall', 'instance' => $instance, 'group' => $currentgroupid, 'target' => 'print']);$htmlicon = new pix_icon('t/print', $linkname);$options = ['menubar' => true, 'location' => false, 'scrollbars' => true, 'resizable' => true,'height' => 600, 'width' => 800, 'title' => $linkname];$name = 'popup';$action = new popup_action('click', $link, $name, $options);$class = '';$respinfo .= $questionnaire->renderer->action_link($link, null, $action,['class' => $class, 'title' => $linkname], $htmlicon) . ' ';$respinfo .= get_string('viewallresponses', 'questionnaire') . '. ' . $groupname . '. ';$strsort = get_string('order_' . $sort, 'questionnaire');$respinfo .= $strsort;$respinfo .= $questionnaire->renderer->help_icon('orderresponses', 'questionnaire');$questionnaire->page->add_to_page('respondentinfo', $respinfo);}$ret = $questionnaire->survey_results('', false, false, $currentgroupid, $sort);echo $questionnaire->renderer->header();echo $questionnaire->renderer->render($questionnaire->page);echo $questionnaire->renderer->footer($course);}break;case 'vresp': // View by response.default:if (empty($questionnaire->survey)) {throw new \moodle_exception('surveynotexists', 'mod_questionnaire');} else if ($questionnaire->survey->courseid != $course->id) {throw new \moodle_exception('surveyowner', 'mod_questionnaire');}$ruser = false;$noresponses = false;if ($usergraph) {$charttype = $questionnaire->survey->chart_type;if ($charttype) {$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.common.core.js');switch ($charttype) {case 'bipolar':$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.bipolar.js');break;case 'hbar':$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.hbar.js');break;case 'radar':$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.radar.js');break;case 'rose':$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.rose.js');break;case 'vprogress':$PAGE->requires->js('/mod/questionnaire/javascript/RGraph/RGraph.vprogress.js');break;}}}if ($byresponse || $rid) {// Available group modes (0 = no groups; 1 = separate groups; 2 = visible groups).if ($groupmode > 0) {switch ($currentgroupid) {case 0: // All participants.$resps = $respsallparticipants;break;default: // Members of a specific group.$resps = $questionnaire->get_responses(false, $currentgroupid);}if (empty($resps)) {$noresponses = true;} else {if ($rid === false) {$resp = current($resps);$rid = $resp->id;} else {$resp = $DB->get_record('questionnaire_response', ['id' => $rid]);}if (!empty($resp->userid)) {if ($user = $DB->get_record('user', ['id' => $resp->userid])) {$ruser = fullname($user);} else {$ruser = '- '.get_string('unknown', 'questionnaire').' -';}} else {$ruser = $resp->userid;}}} else {$resps = $respsallparticipants;}}$rids = array_keys($resps);if (!$rid && !$noresponses) {$rid = $rids[0];}if ($noresponses) {$questionnaire->page->add_to_page('respondentinfo',get_string('group') . ' <strong>' . groups_get_group_name($currentgroupid) . '</strong>: ' .get_string('noresponses', 'questionnaire'));} else if ($outputtarget == 'pdf') {$pdf = questionnaire_report_start_pdf();if ($currentgroupid > 0) {$groupname = get_string('group') . ': <strong>' . groups_get_group_name($currentgroupid) . '</strong>';} else {$groupname = '<strong>' . get_string('allparticipants') . '</strong>';}if (!$byresponse) { // Show respondents individual responses.$questionnaire->view_response($rid, '', $resps, true, true, false, $currentgroupid, $outputtarget);}$html = $questionnaire->renderer->render($questionnaire->page);// Supress any warnings. There is at least one error in the TCPF library at line 16749 where 'text-align' is// not an array.$errorreporting = error_reporting(0);$pdf->writeHTML($html);@$pdf->Output(clean_param($questionnaire->name, PARAM_FILE), 'D');error_reporting($errorreporting);} else { // Default to HTML.// Print the page header.$PAGE->set_title(get_string('questionnairereport', 'questionnaire'));$PAGE->set_heading(format_string($course->fullname));// Print the tabs.if ($byresponse) {$SESSION->questionnaire->current_tab = 'vrespsummary';}if ($individualresponse) {$SESSION->questionnaire->current_tab = 'individualresp';}if ($outputtarget == 'html') {include('tabs.php');}// Print the main part of the page.// TODO provide option to select how many columns and/or responses per page.$groupname = get_string('group').': <strong>'.groups_get_group_name($currentgroupid).'</strong>';if ($currentgroupid == 0 ) {$groupname = get_string('allparticipants');}if ($byresponse) {$respinfo = '';$respinfo .= $questionnaire->renderer->box_start();$respinfo .= $questionnaire->renderer->help_icon('viewindividualresponse', 'questionnaire').' ';$respinfo .= get_string('viewindividualresponse', 'questionnaire').' <strong> : '.$groupname.'</strong>';$respinfo .= $questionnaire->renderer->box_end();$questionnaire->page->add_to_page('respondentinfo', $respinfo);}if ($outputtarget == 'html') {$questionnaire->survey_results_navbar_alpha($rid, $currentgroupid, $cm, $byresponse);}if (!$byresponse) { // Show respondents individual responses.$questionnaire->view_response($rid, '', $resps, true, true, false, $currentgroupid, $outputtarget);}echo $questionnaire->renderer->header();echo $questionnaire->renderer->render($questionnaire->page);echo $questionnaire->renderer->footer($course);}break;}/*** Return a pdf object.* @return pdf*/function questionnaire_report_start_pdf() {global $CFG;require_once($CFG->libdir . '/pdflib.php');$pdf = new pdf();$pdf->SetCreator(PDF_CREATOR);$pdf->SetAuthor('Moodle Questionnaire');$pdf->SetTitle('All responses');$pdf->setPrintHeader(false);// Set default monospaced font.$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);// Set margins.$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);// Set auto page breaks.$pdf->SetAutoPageBreak(true, PDF_MARGIN_BOTTOM);// Set image scale factor.$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);// Set background color for headings.$pdf->SetFillColor(238, 238, 238);$pdf->AddPage('L');return $pdf;}