MDL-35717|NOBUG - fix trailing whitespace problems
[moodle.git] / mod / survey / download.php
1 <?php
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/>.
18 /**
19  * This file is responsible for producing the downloadable versions of a survey
20  * module.
21  *
22  * @package   mod-survey
23  * @copyright 1999 onwards Martin Dougiamas  {@link http://moodle.com}
24  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
27 require_once ("../../config.php");
29 // Check that all the parameters have been provided.
31 $id    = required_param('id', PARAM_INT);    // Course Module ID
32 $type  = optional_param('type', 'xls', PARAM_ALPHA);
33 $group = optional_param('group', 0, PARAM_INT);
35 if (! $cm = get_coursemodule_from_id('survey', $id)) {
36     print_error('invalidcoursemodule');
37 }
39 if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
40     print_error('coursemisconf');
41 }
43 $context = get_context_instance(CONTEXT_MODULE, $cm->id);
45 $PAGE->set_url('/mod/survey/download.php', array('id'=>$id, 'type'=>$type, 'group'=>$group));
47 require_login($course, false, $cm);
48 require_capability('mod/survey:download', $context) ;
50 if (! $survey = $DB->get_record("survey", array("id"=>$cm->instance))) {
51     print_error('invalidsurveyid', 'survey');
52 }
54 add_to_log($course->id, "survey", "download", $PAGE->url->out(), "$survey->id", $cm->id);
56 /// Check to see if groups are being used in this survey
58 $groupmode = groups_get_activity_groupmode($cm);   // Groups are being used
60 if ($groupmode and $group) {
61     $users = get_users_by_capability($context, 'mod/survey:participate', '', '', '', '', $group, null, false);
62 } else {
63     $users = get_users_by_capability($context, 'mod/survey:participate', '', '', '', '', '', null, false);
64     $group = false;
65 }
67 // The order of the questions
68 $order = explode(",", $survey->questions);
70 // Get the actual questions from the database
71 $questions = $DB->get_records_list("survey_questions", "id", $order);
73 // Get an ordered array of questions
74 $orderedquestions = array();
76 $virtualscales = false;
77 foreach ($order as $qid) {
78     $orderedquestions[$qid] = $questions[$qid];
79     // Check if this question is using virtual scales
80     if (!$virtualscales && $questions[$qid]->type < 0) {
81         $virtualscales = true;
82     }
83 }
84 $nestedorder = array();//will contain the subquestions attached to the main questions
85 $preparray = array();
87 foreach ($orderedquestions as $qid=>$question) {
88     //$orderedquestions[$qid]->text = get_string($question->text, "survey");
89     if (!empty($question->multi)) {
90         $actualqids = explode(",", $questions[$qid]->multi);
91         foreach ($actualqids as $subqid) {
92             if (!empty($orderedquestions[$subqid]->type)) {
93                 $orderedquestions[$subqid]->type = $questions[$qid]->type;
94             }
95         }
96     } else {
97         $actualqids = array($qid);
98     }
99     if ($virtualscales && $questions[$qid]->type < 0) {
100         $nestedorder[$qid] = $actualqids;
101     } else if (!$virtualscales && $question->type >= 0) {
102         $nestedorder[$qid] = $actualqids;
103     } else {
104         //todo andrew this was added by me. Is it correct?
105         $nestedorder[$qid] = array();
106     }
109 $reversednestedorder = array();
110 foreach ($nestedorder as $qid=>$subqidarray) {
111     foreach ($subqidarray as $subqui) {
112         $reversednestedorder[$subqui] = $qid;
113     }
116 //need to get info on the sub-questions from the db and merge the arrays of questions
117 $allquestions = array_merge($questions, $DB->get_records_list("survey_questions", "id", array_keys($reversednestedorder)));
119 //array_merge() messes up the keys so reinstate them
120 $questions = array();
121 foreach($allquestions as $question) {
122     $questions[$question->id] = $question;
124     //while were iterating over the questions get the question text
125     $questions[$question->id]->text = get_string($questions[$question->id]->text, "survey");
127 unset($allquestions);
129 // Get and collate all the results in one big array
130 if (! $surveyanswers = $DB->get_records("survey_answers", array("survey"=>$survey->id), "time ASC")) {
131     print_error('cannotfindanswer', 'survey');
134 $results = array();
136 foreach ($surveyanswers as $surveyanswer) {
137     if (!$group || isset($users[$surveyanswer->userid])) {
138         //$questionid = $reversednestedorder[$surveyanswer->question];
139         $questionid = $surveyanswer->question;
140         if (!array_key_exists($surveyanswer->userid, $results)) {
141             $results[$surveyanswer->userid] = array('time'=>$surveyanswer->time);
142         }
143         $results[$surveyanswer->userid][$questionid]['answer1'] = $surveyanswer->answer1;
144         $results[$surveyanswer->userid][$questionid]['answer2'] = $surveyanswer->answer2;
145     }
148 // Output the file as a valid ODS spreadsheet if required
149 $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
150 $courseshortname = format_string($course->shortname, true, array('context' => $coursecontext));
152 if ($type == "ods") {
153     require_once("$CFG->libdir/odslib.class.php");
155 /// Calculate file name
156     $downloadfilename = clean_filename(strip_tags($courseshortname.' '.format_string($survey->name, true))).'.ods';
157 /// Creating a workbook
158     $workbook = new MoodleODSWorkbook("-");
159 /// Sending HTTP headers
160     $workbook->send($downloadfilename);
161 /// Creating the first worksheet
162     $myxls =& $workbook->add_worksheet(textlib::substr(strip_tags(format_string($survey->name,true)), 0, 31));
164     $header = array("surveyid","surveyname","userid","firstname","lastname","email","idnumber","time", "notes");
165     $col=0;
166     foreach ($header as $item) {
167         $myxls->write_string(0,$col++,$item);
168     }
170     foreach ($nestedorder as $key => $nestedquestions) {
171         foreach ($nestedquestions as $key2 => $qid) {
172             $question = $questions[$qid];
173             if ($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")  {
174                 $myxls->write_string(0,$col++,"$question->text");
175             }
176             if ($question->type == "2" || $question->type == "3")  {
177                 $myxls->write_string(0,$col++,"$question->text (preferred)");
178             }
179         }
180     }
182 //      $date = $workbook->addformat();
183 //      $date->set_num_format('mmmm-d-yyyy h:mm:ss AM/PM'); // ?? adjust the settings to reflect the PHP format below
185     $row = 0;
186     foreach ($results as $user => $rest) {
187         $col = 0;
188         $row++;
189         if (! $u = $DB->get_record("user", array("id"=>$user))) {
190             print_error('invaliduserid');
191         }
192         if ($n = $DB->get_record("survey_analysis", array("survey"=>$survey->id, "userid"=>$user))) {
193             $notes = $n->notes;
194         } else {
195             $notes = "No notes made";
196         }
197         $myxls->write_string($row,$col++,$survey->id);
198         $myxls->write_string($row,$col++,strip_tags(format_text($survey->name,true)));
199         $myxls->write_string($row,$col++,$user);
200         $myxls->write_string($row,$col++,$u->firstname);
201         $myxls->write_string($row,$col++,$u->lastname);
202         $myxls->write_string($row,$col++,$u->email);
203         $myxls->write_string($row,$col++,$u->idnumber);
204         $myxls->write_string($row,$col++, userdate($results[$user]["time"], "%d-%b-%Y %I:%M:%S %p") );
205 //          $myxls->write_number($row,$col++,$results[$user]["time"],$date);
206         $myxls->write_string($row,$col++,$notes);
208         foreach ($nestedorder as $key => $nestedquestions) {
209             foreach ($nestedquestions as $key2 => $qid) {
210                 $question = $questions[$qid];
211                 if ($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")  {
212                     $myxls->write_string($row,$col++, $results[$user][$qid]["answer1"] );
213                 }
214                 if ($question->type == "2" || $question->type == "3")  {
215                     $myxls->write_string($row, $col++, $results[$user][$qid]["answer2"] );
216                 }
217             }
218         }
219     }
220     $workbook->close();
222     exit;
225 // Output the file as a valid Excel spreadsheet if required
227 if ($type == "xls") {
228     require_once("$CFG->libdir/excellib.class.php");
230 /// Calculate file name
231     $downloadfilename = clean_filename(strip_tags($courseshortname.' '.format_string($survey->name,true))).'.xls';
232 /// Creating a workbook
233     $workbook = new MoodleExcelWorkbook("-");
234 /// Sending HTTP headers
235     $workbook->send($downloadfilename);
236 /// Creating the first worksheet
237     $myxls =& $workbook->add_worksheet(textlib::substr(strip_tags(format_string($survey->name,true)), 0, 31));
239     $header = array("surveyid","surveyname","userid","firstname","lastname","email","idnumber","time", "notes");
240     $col=0;
241     foreach ($header as $item) {
242         $myxls->write_string(0,$col++,$item);
243     }
245     foreach ($nestedorder as $key => $nestedquestions) {
246         foreach ($nestedquestions as $key2 => $qid) {
247             $question = $questions[$qid];
249             if ($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")  {
250                 $myxls->write_string(0,$col++,"$question->text");
251             }
252             if ($question->type == "2" || $question->type == "3")  {
253                 $myxls->write_string(0,$col++,"$question->text (preferred)");
254             }
255         }
256     }
258 //      $date = $workbook->addformat();
259 //      $date->set_num_format('mmmm-d-yyyy h:mm:ss AM/PM'); // ?? adjust the settings to reflect the PHP format below
261     $row = 0;
262     foreach ($results as $user => $rest) {
263         $col = 0;
264         $row++;
265         if (! $u = $DB->get_record("user", array("id"=>$user))) {
266             print_error('invaliduserid');
267         }
268         if ($n = $DB->get_record("survey_analysis", array("survey"=>$survey->id, "userid"=>$user))) {
269             $notes = $n->notes;
270         } else {
271             $notes = "No notes made";
272         }
273         $myxls->write_string($row,$col++,$survey->id);
274         $myxls->write_string($row,$col++,strip_tags(format_text($survey->name,true)));
275         $myxls->write_string($row,$col++,$user);
276         $myxls->write_string($row,$col++,$u->firstname);
277         $myxls->write_string($row,$col++,$u->lastname);
278         $myxls->write_string($row,$col++,$u->email);
279         $myxls->write_string($row,$col++,$u->idnumber);
280         $myxls->write_string($row,$col++, userdate($results[$user]["time"], "%d-%b-%Y %I:%M:%S %p") );
281 //          $myxls->write_number($row,$col++,$results[$user]["time"],$date);
282         $myxls->write_string($row,$col++,$notes);
284         foreach ($nestedorder as $key => $nestedquestions) {
285             foreach ($nestedquestions as $key2 => $qid) {
286                 $question = $questions[$qid];
287                 if (($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")
288                     && array_key_exists($qid, $results[$user]) ){
289                 $myxls->write_string($row,$col++, $results[$user][$qid]["answer1"] );
290             }
291                 if (($question->type == "2" || $question->type == "3")
292                     && array_key_exists($qid, $results[$user]) ){
293                 $myxls->write_string($row, $col++, $results[$user][$qid]["answer2"] );
294             }
295         }
296     }
297     }
298     $workbook->close();
300     exit;
303 // Otherwise, return the text file.
305 // Print header to force download
307 header("Content-Type: application/download\n");
309 $downloadfilename = clean_filename(strip_tags($courseshortname.' '.format_string($survey->name,true)));
310 header("Content-Disposition: attachment; filename=\"$downloadfilename.txt\"");
312 // Print names of all the fields
314 echo "surveyid    surveyname    userid    firstname    lastname    email    idnumber    time    ";
316 foreach ($nestedorder as $key => $nestedquestions) {
317     foreach ($nestedquestions as $key2 => $qid) {
318         $question = $questions[$qid];
319     if ($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")  {
320         echo "$question->text    ";
321     }
322     if ($question->type == "2" || $question->type == "3")  {
323          echo "$question->text (preferred)    ";
324     }
327 echo "\n";
329 // Print all the lines of data.
330 foreach ($results as $user => $rest) {
331     if (! $u = $DB->get_record("user", array("id"=>$user))) {
332         print_error('invaliduserid');
333     }
334     echo $survey->id."\t";
335     echo strip_tags(format_string($survey->name,true))."\t";
336     echo $user."\t";
337     echo $u->firstname."\t";
338     echo $u->lastname."\t";
339     echo $u->email."\t";
340     echo $u->idnumber."\t";
341     echo userdate($results[$user]["time"], "%d-%b-%Y %I:%M:%S %p")."\t";
343     foreach ($nestedorder as $key => $nestedquestions) {
344         foreach ($nestedquestions as $key2 => $qid) {
345             $question = $questions[$qid];
347             if ($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")  {
348                 echo $results[$user][$qid]["answer1"]."    ";
349             }
350             if ($question->type == "2" || $question->type == "3")  {
351                 echo $results[$user][$qid]["answer2"]."    ";
352             }
353         }
354     }
355     echo "\n";
358 exit;