Differences Between: [Versions 310 and 402] [Versions 311 and 402] [Versions 39 and 402] [Versions 400 and 402]
1 <?php 2 3 // This file is part of Moodle - http://moodle.org/ 4 // 5 // Moodle is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // Moodle is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 17 18 /** 19 * This file is responsible for producing the graph for survey reports 20 * 21 * @package mod_survey 22 * @copyright 2021 Sujith Haridasan <sujith@moodle.com> 23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 24 */ 25 26 require_once("../../config.php"); 27 require_once("$CFG->libdir/graphlib.php"); 28 require_once ("lib.php"); 29 30 $id = required_param('id', PARAM_INT); // Course Module ID. 31 $type = required_param('type', PARAM_FILE); // Graph Type. 32 $group = optional_param('group', 0, PARAM_INT); // Group ID. 33 $sid = optional_param('sid', false, PARAM_INT); // Student ID. 34 $qid = optional_param('qid', 0, PARAM_INT); // Group ID. 35 36 $url = new moodle_url('/mod/survey/graph.php', array('id' => $id, 'type' => $type)); 37 if ($group !== 0) { 38 $url->param('group', $group); 39 } 40 if ($sid !== false) { 41 $url->param('sid', $sid); 42 } 43 if ($qid !== 0) { 44 $url->param('qid', $qid); 45 } 46 $PAGE->set_url($url); 47 48 if (!$cm = get_coursemodule_from_id('survey', $id)) { 49 throw new \moodle_exception('invalidcoursemodule'); 50 } 51 52 if (!$course = $DB->get_record("course", array("id" => $cm->course))) { 53 throw new \moodle_exception('coursemisconf'); 54 } 55 56 if ($sid) { 57 if (!$user = $DB->get_record("user", array("id" => $sid))) { 58 throw new \moodle_exception('invaliduserid'); 59 } 60 } 61 62 require_login($course, false, $cm); 63 64 $groupmode = groups_get_activity_groupmode($cm); // Groups are being used. 65 $context = context_module::instance($cm->id); 66 67 if (!has_capability('mod/survey:readresponses', $context)) { 68 if ($type != "student.png" or $sid != $USER->id) { 69 throw new \moodle_exception('nopermissiontoshow'); 70 } else if ($groupmode and !groups_is_member($group)) { 71 throw new \moodle_exception('nopermissiontoshow'); 72 } 73 } 74 75 if (!$survey = $DB->get_record("survey", array("id" => $cm->instance))) { 76 throw new \moodle_exception('invalidsurveyid', 'survey'); 77 } 78 79 // Check to see if groups are being used in this survey. 80 if ($group) { 81 $users = get_users_by_capability($context, 'mod/survey:participate', '', '', '', '', $group, null, false); 82 } else if (!empty($cm->groupingid)) { 83 $groups = groups_get_all_groups($courseid, 0, $cm->groupingid); 84 $groups = array_keys($groups); 85 $users = get_users_by_capability($context, 'mod/survey:participate', '', '', '', '', $groups, null, false); 86 } else { 87 $users = get_users_by_capability($context, 'mod/survey:participate', '', '', '', '', '', null, false); 88 $group = false; 89 } 90 91 $stractual = get_string("actual", "survey"); 92 $stractualclass = get_string("actualclass", "survey"); 93 94 $strpreferred = get_string("preferred", "survey"); 95 $strpreferredclass = get_string("preferredclass", "survey"); 96 97 if ($sid || isset($user)) { 98 $stractualstudent = get_string("actualstudent", "survey", fullname($user)); 99 $strpreferredstudent = get_string("preferredstudent", "survey", fullname($user)); 100 } 101 102 $virtualscales = false; // Set default value for case clauses. 103 104 switch ($type) { 105 106 case "question.png": 107 108 $question = $DB->get_record("survey_questions", array("id" => $qid)); 109 $question->text = wordwrap(get_string($question->text, "survey"), SURVEY_QLENGTH_WRAP); 110 $question->options = get_string($question->options, "survey"); 111 112 $options = explode(",", $question->options); 113 114 foreach ($options as $key => $unused) { 115 $buckets1[$key] = 0; 116 $buckets2[$key] = 0; 117 } 118 119 if ($aaa = $DB->get_records('survey_answers', array('survey' => $cm->instance, 'question' => $qid))) { 120 foreach ($aaa as $aa) { 121 if (!$group or isset($users[$aa->userid])) { 122 if ($a1 = $aa->answer1) { 123 $buckets1[$a1 - 1]++; 124 } 125 if ($a2 = $aa->answer2) { 126 $buckets2[$a2 - 1]++; 127 } 128 } 129 } 130 } 131 132 $maxbuckets1 = max($buckets1); 133 $maxbuckets2 = max($buckets2); 134 $maxbuckets = ($maxbuckets1 > $maxbuckets2) ? $maxbuckets1 : $maxbuckets2; 135 136 $graph = new graph($SURVEY_GWIDTH, $SURVEY_GHEIGHT); 137 $graph->parameter['title'] = "$question->text"; 138 139 $graph->x_data = $options; 140 141 $graph->y_data['answers1'] = $buckets1; 142 $graph->y_format['answers1'] = array('colour' => 'ltblue', 'bar' => 'fill', 'legend' => $stractual, 'bar_size' => 0.4); 143 $graph->y_data['answers2'] = $buckets2; 144 $graph->y_format['answers2'] = array('colour' => 'ltorange', 'bar' => 'fill', 'legend' => $strpreferred, 'bar_size' => 0.2); 145 146 $graph->parameter['legend'] = 'outside-top'; 147 $graph->parameter['legend_border'] = 'black'; 148 $graph->parameter['legend_offset'] = 4; 149 150 if (($maxbuckets1 > 0.0) && ($maxbuckets2 > 0.0)) { 151 $graph->y_order = array('answers1', 'answers2'); 152 } else if ($maxbuckets1 > 0.0) { 153 $graph->y_order = array('answers1'); 154 } else { 155 $graph->y_order = array('answers2'); 156 } 157 158 $graph->parameter['y_axis_gridlines'] = $maxbuckets + 1; 159 $graph->parameter['y_resolution_left'] = 1; 160 $graph->parameter['y_decimal_left'] = 0; 161 $graph->parameter['x_axis_angle'] = 20; 162 $graph->parameter['shadow'] = 'none'; 163 164 $graph->y_tick_labels = null; 165 $graph->offset_relation = null; 166 167 $graph->draw_stack(); 168 169 break; 170 171 case "multiquestion.png": 172 173 $question = $DB->get_record("survey_questions", array("id" => $qid)); 174 $question->text = get_string($question->text, "survey"); 175 $question->options = get_string($question->options, "survey"); 176 177 $options = explode(",", $question->options); 178 $questionorder = explode(",", $question->multi); 179 180 $qqq = $DB->get_records_list("survey_questions", "id", explode(',', $question->multi)); 181 182 foreach ($questionorder as $i => $val) { 183 $names[$i] = get_string($qqq["$val"]->shorttext, "survey"); 184 $buckets1[$i] = 0; 185 $buckets2[$i] = 0; 186 $count1[$i] = 0; 187 $count2[$i] = 0; 188 $indexof[$val] = $i; 189 $stdev1[$i] = 0; 190 $stdev2[$i] = 0; 191 } 192 193 $aaa = $DB->get_records_select("survey_answers", "((survey = ?) AND (question in ($question->multi)))", 194 array($cm->instance)); 195 196 if ($aaa) { 197 foreach ($aaa as $a) { 198 if (!$group or isset($users[$a->userid])) { 199 $index = $indexof[$a->question]; 200 if ($a->answer1) { 201 $buckets1[$index] += $a->answer1; 202 $count1[$index]++; 203 } 204 if ($a->answer2) { 205 $buckets2[$index] += $a->answer2; 206 $count2[$index]++; 207 } 208 } 209 } 210 } 211 212 foreach ($questionorder as $i => $val) { 213 if ($count1[$i]) { 214 $buckets1[$i] = (float) $buckets1[$i] / (float) $count1[$i]; 215 } 216 if ($count2[$i]) { 217 $buckets2[$i] = (float) $buckets2[$i] / (float) $count2[$i]; 218 } 219 } 220 221 if ($aaa) { 222 foreach ($aaa as $a) { 223 if (!$group or isset($users[$a->userid])) { 224 $index = $indexof[$a->question]; 225 if ($a->answer1) { 226 $difference = (float) ($a->answer1 - $buckets1[$index]); 227 $stdev1[$index] += ($difference * $difference); 228 } 229 if ($a->answer2) { 230 $difference = (float) ($a->answer2 - $buckets2[$index]); 231 $stdev2[$index] += ($difference * $difference); 232 } 233 } 234 } 235 } 236 237 foreach ($questionorder as $i => $val) { 238 if ($count1[$i]) { 239 $stdev1[$i] = sqrt((float) $stdev1[$i] / ((float) $count1[$i])); 240 } 241 if ($count2[$i]) { 242 $stdev2[$i] = sqrt((float) $stdev2[$i] / ((float) $count2[$i])); 243 } 244 $buckets1[$i] = $buckets1[$i] - 1; 245 $buckets2[$i] = $buckets2[$i] - 1; 246 } 247 248 $maxbuckets1 = max($buckets1); 249 $maxbuckets2 = max($buckets2); 250 251 $graph = new graph($SURVEY_GWIDTH, $SURVEY_GHEIGHT); 252 $graph->parameter['title'] = "$question->text"; 253 254 $graph->x_data = $names; 255 $graph->y_data['answers1'] = $buckets1; 256 $graph->y_format['answers1'] = array('colour' => 'ltblue', 'line' => 'line', 'point' => 'square', 257 'shadow_offset' => 4, 'legend' => $stractual); 258 $graph->y_data['answers2'] = $buckets2; 259 $graph->y_format['answers2'] = array('colour' => 'ltorange', 'line' => 'line', 'point' => 'square', 260 'shadow_offset' => 4, 'legend' => $strpreferred); 261 $graph->y_data['stdev1'] = $stdev1; 262 $graph->y_format['stdev1'] = array('colour' => 'ltltblue', 'bar' => 'fill', 263 'shadow_offset' => '4', 'legend' => 'none', 'bar_size' => 0.3); 264 $graph->y_data['stdev2'] = $stdev2; 265 $graph->y_format['stdev2'] = array('colour' => 'ltltorange', 'bar' => 'fill', 266 'shadow_offset' => '4', 'legend' => 'none', 'bar_size' => 0.2); 267 $graph->offset_relation['stdev1'] = 'answers1'; 268 $graph->offset_relation['stdev2'] = 'answers2'; 269 270 $graph->parameter['bar_size'] = 0.15; 271 272 $graph->parameter['legend'] = 'outside-top'; 273 $graph->parameter['legend_border'] = 'black'; 274 $graph->parameter['legend_offset'] = 4; 275 276 $graph->y_tick_labels = $options; 277 278 if (($maxbuckets1 > 0.0) && ($maxbuckets2 > 0.0)) { 279 $graph->y_order = array('stdev1', 'answers1', 'stdev2', 'answers2'); 280 } else if ($maxbuckets1 > 0.0) { 281 $graph->y_order = array('stdev1', 'answers1'); 282 } else { 283 $graph->y_order = array('stdev2', 'answers2'); 284 } 285 286 $graph->parameter['y_max_left'] = count($options) - 1; 287 $graph->parameter['y_axis_gridlines'] = count($options); 288 $graph->parameter['y_resolution_left'] = 1; 289 $graph->parameter['y_decimal_left'] = 1; 290 $graph->parameter['x_axis_angle'] = 20; 291 292 $graph->draw(); 293 294 break; 295 296 case "overall.png": 297 298 $qqq = $DB->get_records_list("survey_questions", "id", explode(',', $survey->questions)); 299 300 foreach ($qqq as $key => $qq) { 301 if ($qq->multi) { 302 $qqq[$key]->text = get_string($qq->text, "survey"); 303 $qqq[$key]->options = get_string($qq->options, "survey"); 304 if ($qq->type < 0) { 305 $virtualscales = true; 306 } 307 } 308 } 309 foreach ($qqq as $qq) { // If any virtual, then use JUST virtual, else use JUST nonvirtual. 310 if ($qq->multi) { 311 if ($virtualscales && $qq->type < 0) { 312 $question[] = $qq; 313 } else if (!$virtualscales && $qq->type > 0) { 314 $question[] = $qq; 315 } 316 } 317 } 318 $numquestions = count($question); 319 320 $options = explode(",", $question[0]->options); 321 $numoptions = count($options); 322 323 for ($i = 0; $i < $numquestions; $i++) { 324 $names[$i] = $question[$i]->text; 325 $buckets1[$i] = 0.0; 326 $buckets2[$i] = 0.0; 327 $stdev1[$i] = 0.0; 328 $stdev2[$i] = 0.0; 329 $count1[$i] = 0; 330 $count2[$i] = 0; 331 $subquestions = $question[$i]->multi; // Otherwise next line doesn't work. 332 $aaa = $DB->get_records_select("survey_answers", "((survey = ?) AND (question in ($subquestions)))", 333 array($cm->instance)); 334 335 if ($aaa) { 336 foreach ($aaa as $a) { 337 if (!$group or isset($users[$a->userid])) { 338 if ($a->answer1) { 339 $buckets1[$i] += $a->answer1; 340 $count1[$i]++; 341 } 342 if ($a->answer2) { 343 $buckets2[$i] += $a->answer2; 344 $count2[$i]++; 345 } 346 } 347 } 348 } 349 350 if ($count1[$i]) { 351 $buckets1[$i] = (float) $buckets1[$i] / (float) $count1[$i]; 352 } 353 if ($count2[$i]) { 354 $buckets2[$i] = (float) $buckets2[$i] / (float) $count2[$i]; 355 } 356 357 // Calculate the standard devaiations. 358 if ($aaa) { 359 foreach ($aaa as $a) { 360 if (!$group or isset($users[$a->userid])) { 361 if ($a->answer1) { 362 $difference = (float) ($a->answer1 - $buckets1[$i]); 363 $stdev1[$i] += ($difference * $difference); 364 } 365 if ($a->answer2) { 366 $difference = (float) ($a->answer2 - $buckets2[$i]); 367 $stdev2[$i] += ($difference * $difference); 368 } 369 } 370 } 371 } 372 373 if ($count1[$i]) { 374 $stdev1[$i] = sqrt((float) $stdev1[$i] / ((float) $count1[$i])); 375 } 376 if ($count2[$i]) { 377 $stdev2[$i] = sqrt((float) $stdev2[$i] / ((float) $count2[$i])); 378 } 379 380 $buckets1[$i] = $buckets1[$i] - 1; // Hack because there should not be ANY 0 values in the data. 381 $buckets2[$i] = $buckets2[$i] - 1; 382 383 } 384 385 $maxbuckets1 = max($buckets1); 386 $maxbuckets2 = max($buckets2); 387 388 $graph = new graph($SURVEY_GWIDTH, $SURVEY_GHEIGHT); 389 $graph->parameter['title'] = strip_tags(format_string($survey->name, true)); 390 391 $graph->x_data = $names; 392 393 $graph->y_data['answers1'] = $buckets1; 394 $graph->y_format['answers1'] = array('colour' => 'ltblue', 'line' => 'line', 'point' => 'square', 395 'shadow_offset' => 4, 'legend' => $stractual); 396 $graph->y_data['answers2'] = $buckets2; 397 $graph->y_format['answers2'] = array('colour' => 'ltorange', 'line' => 'line', 'point' => 'square', 398 'shadow_offset' => 4, 'legend' => $strpreferred); 399 400 $graph->y_data['stdev1'] = $stdev1; 401 $graph->y_format['stdev1'] = array('colour' => 'ltltblue', 'bar' => 'fill', 402 'shadow_offset' => '4', 'legend' => 'none', 'bar_size' => 0.3); 403 $graph->y_data['stdev2'] = $stdev2; 404 $graph->y_format['stdev2'] = array('colour' => 'ltltorange', 'bar' => 'fill', 405 'shadow_offset' => '4', 'legend' => 'none', 'bar_size' => 0.2); 406 $graph->offset_relation['stdev1'] = 'answers1'; 407 $graph->offset_relation['stdev2'] = 'answers2'; 408 409 $graph->parameter['legend'] = 'outside-top'; 410 $graph->parameter['legend_border'] = 'black'; 411 $graph->parameter['legend_offset'] = 4; 412 413 $graph->y_tick_labels = $options; 414 415 if (($maxbuckets1 > 0.0) && ($maxbuckets2 > 0.0)) { 416 $graph->y_order = array('stdev1', 'answers1', 'stdev2', 'answers2'); 417 } else if ($maxbuckets1 > 0.0) { 418 $graph->y_order = array('stdev1', 'answers1'); 419 } else { 420 $graph->y_order = array('stdev2', 'answers2'); 421 } 422 423 $graph->parameter['y_max_left'] = $numoptions - 1; 424 $graph->parameter['y_axis_gridlines'] = $numoptions; 425 $graph->parameter['y_resolution_left'] = 1; 426 $graph->parameter['y_decimal_left'] = 1; 427 $graph->parameter['x_axis_angle'] = 0; 428 $graph->parameter['x_inner_padding'] = 6; 429 430 $graph->draw(); 431 432 break; 433 434 case "student.png": 435 436 $qqq = $DB->get_records_list("survey_questions", "id", explode(',', $survey->questions)); 437 438 foreach ($qqq as $key => $qq) { 439 if ($qq->multi) { 440 $qqq[$key]->text = get_string($qq->text, "survey"); 441 $qqq[$key]->options = get_string($qq->options, "survey"); 442 if ($qq->type < 0) { 443 $virtualscales = true; 444 } 445 } 446 } 447 foreach ($qqq as $qq) { // If any virtual, then use JUST virtual, else use JUST nonvirtual. 448 if ($qq->multi) { 449 if ($virtualscales && $qq->type < 0) { 450 $question[] = $qq; 451 } else if (!$virtualscales && $qq->type > 0) { 452 $question[] = $qq; 453 } 454 } 455 } 456 $numquestions = count($question); 457 458 $options = explode(",", $question[0]->options); 459 $numoptions = count($options); 460 461 for ($i = 0; $i < $numquestions; $i++) { 462 $names[$i] = $question[$i]->text; 463 $buckets1[$i] = 0.0; 464 $buckets2[$i] = 0.0; 465 $count1[$i] = 0; 466 $count2[$i] = 0; 467 $studbuckets1[$i] = 0.0; 468 $studbuckets2[$i] = 0.0; 469 $studcount1[$i] = 0; 470 $studcount2[$i] = 0; 471 $stdev1[$i] = 0.0; 472 $stdev2[$i] = 0.0; 473 474 $subquestions = $question[$i]->multi; // Otherwise next line doesn't work. 475 $aaa = $DB->get_records_select("survey_answers", "((survey = ?) AND (question in ($subquestions)))", 476 array($cm->instance)); 477 478 if ($aaa) { 479 foreach ($aaa as $a) { 480 if (!$group or isset($users[$a->userid])) { 481 if ($a->userid == $sid) { 482 if ($a->answer1) { 483 $studbuckets1[$i] += $a->answer1; 484 $studcount1[$i]++; 485 } 486 if ($a->answer2) { 487 $studbuckets2[$i] += $a->answer2; 488 $studcount2[$i]++; 489 } 490 } 491 if ($a->answer1) { 492 $buckets1[$i] += $a->answer1; 493 $count1[$i]++; 494 } 495 if ($a->answer2) { 496 $buckets2[$i] += $a->answer2; 497 $count2[$i]++; 498 } 499 } 500 } 501 } 502 503 if ($count1[$i]) { 504 $buckets1[$i] = (float) $buckets1[$i] / (float) $count1[$i]; 505 } 506 if ($count2[$i]) { 507 $buckets2[$i] = (float) $buckets2[$i] / (float) $count2[$i]; 508 } 509 if ($studcount1[$i]) { 510 $studbuckets1[$i] = (float) $studbuckets1[$i] / (float) $studcount1[$i]; 511 } 512 if ($studcount2[$i]) { 513 $studbuckets2[$i] = (float) $studbuckets2[$i] / (float) $studcount2[$i]; 514 } 515 516 // Calculate the standard devaiations. 517 foreach ($aaa as $a) { 518 if (!$group or isset($users[$a->userid])) { 519 if ($a->answer1) { 520 $difference = (float) ($a->answer1 - $buckets1[$i]); 521 $stdev1[$i] += ($difference * $difference); 522 } 523 if ($a->answer2) { 524 $difference = (float) ($a->answer2 - $buckets2[$i]); 525 $stdev2[$i] += ($difference * $difference); 526 } 527 } 528 } 529 530 if ($count1[$i]) { 531 $stdev1[$i] = sqrt((float) $stdev1[$i] / ((float) $count1[$i])); 532 } 533 if ($count2[$i]) { 534 $stdev2[$i] = sqrt((float) $stdev2[$i] / ((float) $count2[$i])); 535 } 536 537 $buckets1[$i] = $buckets1[$i] - 1; // Hack because there should not be ANY 0 values in the data. 538 $buckets2[$i] = $buckets2[$i] - 1; 539 $studbuckets1[$i] = $studbuckets1[$i] - 1; 540 $studbuckets2[$i] = $studbuckets2[$i] - 1; 541 542 } 543 544 $maxbuckets1 = max($buckets1); 545 $maxbuckets2 = max($buckets2); 546 547 $graph = new graph($SURVEY_GWIDTH, $SURVEY_GHEIGHT); 548 $graph->parameter['title'] = strip_tags(format_string($survey->name, true)); 549 550 $graph->x_data = $names; 551 552 $graph->y_data['answers1'] = $buckets1; 553 $graph->y_format['answers1'] = array('colour' => 'ltblue', 'line' => 'line', 'point' => 'square', 554 'shadow_offset' => 0.1, 'legend' => $stractualclass); 555 $graph->y_data['answers2'] = $buckets2; 556 $graph->y_format['answers2'] = array('colour' => 'ltorange', 'line' => 'line', 'point' => 'square', 557 'shadow_offset' => 0.1, 'legend' => $strpreferredclass); 558 $graph->y_data['studanswers1'] = $studbuckets1; 559 $graph->y_format['studanswers1'] = array('colour' => 'blue', 'line' => 'line', 'point' => 'square', 560 'shadow_offset' => 4, 'legend' => $stractualstudent); 561 $graph->y_data['studanswers2'] = $studbuckets2; 562 $graph->y_format['studanswers2'] = array('colour' => 'orange', 'line' => 'line', 'point' => 'square', 563 'shadow_offset' => 4, 'legend' => $strpreferredstudent); 564 $graph->y_data['stdev1'] = $stdev1; 565 $graph->y_format['stdev1'] = array('colour' => 'ltltblue', 'bar' => 'fill', 566 'shadow_offset' => 0.1, 'legend' => 'none', 'bar_size' => 0.3); 567 $graph->y_data['stdev2'] = $stdev2; 568 $graph->y_format['stdev2'] = array('colour' => 'ltltorange', 'bar' => 'fill', 569 'shadow_offset' => 0.1, 'legend' => 'none', 'bar_size' => 0.2); 570 $graph->offset_relation['stdev1'] = 'answers1'; 571 $graph->offset_relation['stdev2'] = 'answers2'; 572 573 $graph->y_tick_labels = $options; 574 575 $graph->parameter['bar_size'] = 0.15; 576 577 $graph->parameter['legend'] = 'outside-top'; 578 $graph->parameter['legend_border'] = 'black'; 579 $graph->parameter['legend_offset'] = 4; 580 581 if (($maxbuckets1 > 0.0) && ($maxbuckets2 > 0.0)) { 582 $graph->y_order = array('stdev1', 'stdev2', 'answers1', 'answers2', 'studanswers1', 'studanswers2'); 583 } else if ($maxbuckets1 > 0.0) { 584 $graph->y_order = array('stdev1', 'answers1', 'studanswers1'); 585 } else { 586 $graph->y_order = array('stdev2', 'answers2', 'studanswers2'); 587 } 588 589 $graph->parameter['y_max_left'] = $numoptions - 1; 590 $graph->parameter['y_axis_gridlines'] = $numoptions; 591 $graph->parameter['y_resolution_left'] = 1; 592 $graph->parameter['y_decimal_left'] = 1; 593 $graph->parameter['x_axis_angle'] = 20; 594 595 $graph->draw(); 596 break; 597 598 case "studentmultiquestion.png": 599 600 $question = $DB->get_record("survey_questions", array("id" => $qid)); 601 $question->text = get_string($question->text, "survey"); 602 $question->options = get_string($question->options, "survey"); 603 604 $options = explode(",", $question->options); 605 $questionorder = explode(",", $question->multi); 606 607 $qqq = $DB->get_records_list("survey_questions", "id", explode(',', $question->multi)); 608 609 foreach ($questionorder as $i => $val) { 610 $names[$i] = get_string($qqq[$val]->shorttext, "survey"); 611 $buckets1[$i] = 0; 612 $buckets2[$i] = 0; 613 $count1[$i] = 0; 614 $count2[$i] = 0; 615 $indexof[$val] = $i; 616 $studbuckets1[$i] = 0.0; 617 $studbuckets2[$i] = 0.0; 618 $studcount1[$i] = 0; 619 $studcount2[$i] = 0; 620 $stdev1[$i] = 0.0; 621 $stdev2[$i] = 0.0; 622 } 623 624 $aaa = $DB->get_records_select("survey_answers", "((survey = ?) AND (question in ($question->multi)))", 625 array($cm->instance)); 626 627 if ($aaa) { 628 foreach ($aaa as $a) { 629 if (!$group or isset($users[$a->userid])) { 630 $index = $indexof[$a->question]; 631 if ($a->userid == $sid) { 632 if ($a->answer1) { 633 $studbuckets1[$index] += $a->answer1; 634 $studcount1[$index]++; 635 } 636 if ($a->answer2) { 637 $studbuckets2[$index] += $a->answer2; 638 $studcount2[$index]++; 639 } 640 } 641 if ($a->answer1) { 642 $buckets1[$index] += $a->answer1; 643 $count1[$index]++; 644 } 645 if ($a->answer2) { 646 $buckets2[$index] += $a->answer2; 647 $count2[$index]++; 648 } 649 } 650 } 651 } 652 653 foreach ($questionorder as $i => $val) { 654 if ($count1[$i]) { 655 $buckets1[$i] = (float) $buckets1[$i] / (float) $count1[$i]; 656 } 657 if ($count2[$i]) { 658 $buckets2[$i] = (float) $buckets2[$i] / (float) $count2[$i]; 659 } 660 if ($studcount1[$i]) { 661 $studbuckets1[$i] = (float) $studbuckets1[$i] / (float) $studcount1[$i]; 662 } 663 if ($studcount2[$i]) { 664 $studbuckets2[$i] = (float) $studbuckets2[$i] / (float) $studcount2[$i]; 665 } 666 } 667 668 foreach ($aaa as $a) { 669 if (!$group or isset($users[$a->userid])) { 670 $index = $indexof[$a->question]; 671 if ($a->answer1) { 672 $difference = (float) ($a->answer1 - $buckets1[$index]); 673 $stdev1[$index] += ($difference * $difference); 674 } 675 if ($a->answer2) { 676 $difference = (float) ($a->answer2 - $buckets2[$index]); 677 $stdev2[$index] += ($difference * $difference); 678 } 679 } 680 } 681 682 foreach ($questionorder as $i => $val) { 683 if ($count1[$i]) { 684 $stdev1[$i] = sqrt((float) $stdev1[$i] / ((float) $count1[$i])); 685 } 686 if ($count2[$i]) { 687 $stdev2[$i] = sqrt((float) $stdev2[$i] / ((float) $count2[$i])); 688 } 689 $buckets1[$i] = $buckets1[$i] - 1; // Hack because there should not be ANY 0 values in the data. 690 $buckets2[$i] = $buckets2[$i] - 1; 691 $studbuckets1[$i] = $studbuckets1[$i] - 1; 692 $studbuckets2[$i] = $studbuckets2[$i] - 1; 693 } 694 695 $maxbuckets1 = max($buckets1); 696 $maxbuckets2 = max($buckets2); 697 698 $graph = new graph($SURVEY_GWIDTH, $SURVEY_GHEIGHT); 699 $graph->parameter['title'] = "$question->text"; 700 701 $graph->x_data = $names; 702 $graph->y_data['answers1'] = $buckets1; 703 $graph->y_format['answers1'] = array('colour' => 'ltblue', 'line' => 'line', 'point' => 'square', 704 'shadow_offset' => 0.1, 'legend' => $stractualclass); 705 $graph->y_data['answers2'] = $buckets2; 706 $graph->y_format['answers2'] = array('colour' => 'ltorange', 'line' => 'line', 'point' => 'square', 707 'shadow_offset' => 0.1, 'legend' => $strpreferredclass); 708 $graph->y_data['studanswers1'] = $studbuckets1; 709 $graph->y_format['studanswers1'] = array('colour' => 'blue', 'line' => 'line', 'point' => 'square', 710 'shadow_offset' => 4, 'legend' => $stractualstudent); 711 $graph->y_data['studanswers2'] = $studbuckets2; 712 $graph->y_format['studanswers2'] = array('colour' => 'orange', 'line' => 'line', 'point' => 'square', 713 'shadow_offset' => 4, 'legend' => $strpreferredstudent); 714 $graph->y_data['stdev1'] = $stdev1; 715 $graph->y_format['stdev1'] = array('colour' => 'ltltblue', 'bar' => 'fill', 716 'shadow_offset' => 0.1, 'legend' => 'none', 'bar_size' => 0.3); 717 $graph->y_data['stdev2'] = $stdev2; 718 $graph->y_format['stdev2'] = array('colour' => 'ltltorange', 'bar' => 'fill', 719 'shadow_offset' => 0.1, 'legend' => 'none', 'bar_size' => 0.2); 720 $graph->offset_relation['stdev1'] = 'answers1'; 721 $graph->offset_relation['stdev2'] = 'answers2'; 722 723 $graph->parameter['bar_size'] = 0.15; 724 725 $graph->parameter['legend'] = 'outside-top'; 726 $graph->parameter['legend_border'] = 'black'; 727 $graph->parameter['legend_offset'] = 4; 728 729 $graph->y_tick_labels = $options; 730 731 if (($maxbuckets1 > 0.0) && ($maxbuckets2 > 0.0)) { 732 $graph->y_order = array('stdev1', 'stdev2', 'answers1', 'answers2', 'studanswers1', 'studanswers2'); 733 } else if ($maxbuckets1 > 0.0) { 734 $graph->y_order = array('stdev1', 'answers1', 'studanswers1'); 735 } else { 736 $graph->y_order = array('stdev2', 'answers2', 'studanswers2'); 737 } 738 739 $graph->parameter['y_max_left'] = count($options) - 1; 740 $graph->parameter['y_axis_gridlines'] = count($options); 741 $graph->parameter['y_resolution_left'] = 1; 742 $graph->parameter['y_decimal_left'] = 1; 743 $graph->parameter['x_axis_angle'] = 20; 744 745 $graph->draw(); 746 747 break; 748 749 default: 750 break; 751 } 752 753 exit;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body