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 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 */
26
27require_once ("../../config.php");
28
29// Check that all the parameters have been provided.
30
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);
34
35if (! $cm = get_coursemodule_from_id('survey', $id)) {
36    print_error('invalidcoursemodule');
37}
38
39if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
40    print_error('coursemisconf');
41}
42
43$context = context_module::instance($cm->id);
44
45$PAGE->set_url('/mod/survey/download.php', array('id'=>$id, 'type'=>$type, 'group'=>$group));
46
47require_login($course, false, $cm);
48require_capability('mod/survey:download', $context) ;
49
50if (! $survey = $DB->get_record("survey", array("id"=>$cm->instance))) {
51    print_error('invalidsurveyid', 'survey');
52}
53
54$params = array(
55    'objectid' => $survey->id,
56    'context' => $context,
57    'courseid' => $course->id,
58    'other' => array('type' => $type, 'groupid' => $group)
59);
60$event = \mod_survey\event\report_downloaded::create($params);
61$event->trigger();
62
63/// Check to see if groups are being used in this survey
64
65$groupmode = groups_get_activity_groupmode($cm);   // Groups are being used
66
67if ($groupmode and $group) {
68    $users = get_users_by_capability($context, 'mod/survey:participate', '', '', '', '', $group, null, false);
69} else {
70    $users = get_users_by_capability($context, 'mod/survey:participate', '', '', '', '', '', null, false);
71    $group = false;
72}
73
74// The order of the questions
75$order = explode(",", $survey->questions);
76
77// Get the actual questions from the database
78$questions = $DB->get_records_list("survey_questions", "id", $order);
79
80// Get an ordered array of questions
81$orderedquestions = array();
82
83$virtualscales = false;
84foreach ($order as $qid) {
85    $orderedquestions[$qid] = $questions[$qid];
86    // Check if this question is using virtual scales
87    if (!$virtualscales && $questions[$qid]->type < 0) {
88        $virtualscales = true;
89    }
90}
91$nestedorder = array();//will contain the subquestions attached to the main questions
92$preparray = array();
93
94foreach ($orderedquestions as $qid=>$question) {
95    //$orderedquestions[$qid]->text = get_string($question->text, "survey");
96    if (!empty($question->multi)) {
97        $actualqids = explode(",", $questions[$qid]->multi);
98        foreach ($actualqids as $subqid) {
99            if (!empty($orderedquestions[$subqid]->type)) {
100                $orderedquestions[$subqid]->type = $questions[$qid]->type;
101            }
102        }
103    } else {
104        $actualqids = array($qid);
105    }
106    if ($virtualscales && $questions[$qid]->type < 0) {
107        $nestedorder[$qid] = $actualqids;
108    } else if (!$virtualscales && $question->type >= 0) {
109        $nestedorder[$qid] = $actualqids;
110    } else {
111        //todo andrew this was added by me. Is it correct?
112        $nestedorder[$qid] = array();
113    }
114}
115
116$reversednestedorder = array();
117foreach ($nestedorder as $qid=>$subqidarray) {
118    foreach ($subqidarray as $subqui) {
119        $reversednestedorder[$subqui] = $qid;
120    }
121}
122
123//need to get info on the sub-questions from the db and merge the arrays of questions
124$allquestions = array_merge($questions, $DB->get_records_list("survey_questions", "id", array_keys($reversednestedorder)));
125
126//array_merge() messes up the keys so reinstate them
127$questions = array();
128foreach($allquestions as $question) {
129    $questions[$question->id] = $question;
130
131    //while were iterating over the questions get the question text
132    $questions[$question->id]->text = get_string($questions[$question->id]->text, "survey");
133}
134unset($allquestions);
135
136// Get and collate all the results in one big array
137if (! $surveyanswers = $DB->get_records("survey_answers", array("survey"=>$survey->id), "time ASC")) {
138    print_error('cannotfindanswer', 'survey');
139}
140
141$results = array();
142
143foreach ($surveyanswers as $surveyanswer) {
144    if (!$group || isset($users[$surveyanswer->userid])) {
145        //$questionid = $reversednestedorder[$surveyanswer->question];
146        $questionid = $surveyanswer->question;
147        if (!array_key_exists($surveyanswer->userid, $results)) {
148            $results[$surveyanswer->userid] = array('time'=>$surveyanswer->time);
149        }
150        $results[$surveyanswer->userid][$questionid]['answer1'] = $surveyanswer->answer1;
151        $results[$surveyanswer->userid][$questionid]['answer2'] = $surveyanswer->answer2;
152    }
153}
154
155// Output the file as a valid ODS spreadsheet if required
156$coursecontext = context_course::instance($course->id);
157$courseshortname = format_string($course->shortname, true, array('context' => $coursecontext));
158
159if ($type == "ods") {
160    require_once("$CFG->libdir/odslib.class.php");
161
162/// Calculate file name
163    $downloadfilename = clean_filename(strip_tags($courseshortname.' '.format_string($survey->name, true))).'.ods';
164/// Creating a workbook
165    $workbook = new MoodleODSWorkbook("-");
166/// Sending HTTP headers
167    $workbook->send($downloadfilename);
168/// Creating the first worksheet
169    $myxls = $workbook->add_worksheet(core_text::substr(strip_tags(format_string($survey->name,true)), 0, 31));
170
171    $header = array("surveyid","surveyname","userid","firstname","lastname","email","idnumber","time", "notes");
172    $col=0;
173    foreach ($header as $item) {
174        $myxls->write_string(0,$col++,$item);
175    }
176
177    foreach ($nestedorder as $key => $nestedquestions) {
178        foreach ($nestedquestions as $key2 => $qid) {
179            $question = $questions[$qid];
180            if ($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")  {
181                $myxls->write_string(0,$col++,"$question->text");
182            }
183            if ($question->type == "2" || $question->type == "3")  {
184                $myxls->write_string(0,$col++,"$question->text (preferred)");
185            }
186        }
187    }
188
189//      $date = $workbook->addformat();
190//      $date->set_num_format('mmmm-d-yyyy h:mm:ss AM/PM'); // ?? adjust the settings to reflect the PHP format below
191
192    $row = 0;
193    foreach ($results as $user => $rest) {
194        $col = 0;
195        $row++;
196        if (! $u = $DB->get_record("user", array("id"=>$user))) {
197            print_error('invaliduserid');
198        }
199        if ($n = $DB->get_record("survey_analysis", array("survey"=>$survey->id, "userid"=>$user))) {
200            $notes = $n->notes;
201        } else {
202            $notes = "No notes made";
203        }
204        $myxls->write_string($row,$col++,$survey->id);
205        $myxls->write_string($row,$col++,strip_tags(format_text($survey->name,true)));
206        $myxls->write_string($row,$col++,$user);
207        $myxls->write_string($row,$col++,$u->firstname);
208        $myxls->write_string($row,$col++,$u->lastname);
209        $myxls->write_string($row,$col++,$u->email);
210        $myxls->write_string($row,$col++,$u->idnumber);
211        $myxls->write_string($row,$col++, userdate($results[$user]["time"], "%d-%b-%Y %I:%M:%S %p") );
212//          $myxls->write_number($row,$col++,$results[$user]["time"],$date);
213        $myxls->write_string($row,$col++,$notes);
214
215        foreach ($nestedorder as $key => $nestedquestions) {
216            foreach ($nestedquestions as $key2 => $qid) {
217                $question = $questions[$qid];
218                if ($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")  {
219                    $myxls->write_string($row,$col++, $results[$user][$qid]["answer1"] );
220                }
221                if ($question->type == "2" || $question->type == "3")  {
222                    $myxls->write_string($row, $col++, $results[$user][$qid]["answer2"] );
223                }
224            }
225        }
226    }
227    $workbook->close();
228
229    exit;
230}
231
232// Output the file as a valid Excel spreadsheet if required
233
234if ($type == "xls") {
235    require_once("$CFG->libdir/excellib.class.php");
236
237/// Calculate file name
238    $downloadfilename = clean_filename(strip_tags($courseshortname.' '.format_string($survey->name,true))).'.xls';
239/// Creating a workbook
240    $workbook = new MoodleExcelWorkbook("-");
241/// Sending HTTP headers
242    $workbook->send($downloadfilename);
243/// Creating the first worksheet
244    $myxls = $workbook->add_worksheet(core_text::substr(strip_tags(format_string($survey->name,true)), 0, 31));
245
246    $header = array("surveyid","surveyname","userid","firstname","lastname","email","idnumber","time", "notes");
247    $col=0;
248    foreach ($header as $item) {
249        $myxls->write_string(0,$col++,$item);
250    }
251
252    foreach ($nestedorder as $key => $nestedquestions) {
253        foreach ($nestedquestions as $key2 => $qid) {
254            $question = $questions[$qid];
255
256            if ($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")  {
257                $myxls->write_string(0,$col++,"$question->text");
258            }
259            if ($question->type == "2" || $question->type == "3")  {
260                $myxls->write_string(0,$col++,"$question->text (preferred)");
261            }
262        }
263    }
264
265//      $date = $workbook->addformat();
266//      $date->set_num_format('mmmm-d-yyyy h:mm:ss AM/PM'); // ?? adjust the settings to reflect the PHP format below
267
268    $row = 0;
269    foreach ($results as $user => $rest) {
270        $col = 0;
271        $row++;
272        if (! $u = $DB->get_record("user", array("id"=>$user))) {
273            print_error('invaliduserid');
274        }
275        if ($n = $DB->get_record("survey_analysis", array("survey"=>$survey->id, "userid"=>$user))) {
276            $notes = $n->notes;
277        } else {
278            $notes = "No notes made";
279        }
280        $myxls->write_string($row,$col++,$survey->id);
281        $myxls->write_string($row,$col++,strip_tags(format_text($survey->name,true)));
282        $myxls->write_string($row,$col++,$user);
283        $myxls->write_string($row,$col++,$u->firstname);
284        $myxls->write_string($row,$col++,$u->lastname);
285        $myxls->write_string($row,$col++,$u->email);
286        $myxls->write_string($row,$col++,$u->idnumber);
287        $myxls->write_string($row,$col++, userdate($results[$user]["time"], "%d-%b-%Y %I:%M:%S %p") );
288//          $myxls->write_number($row,$col++,$results[$user]["time"],$date);
289        $myxls->write_string($row,$col++,$notes);
290
291        foreach ($nestedorder as $key => $nestedquestions) {
292            foreach ($nestedquestions as $key2 => $qid) {
293                $question = $questions[$qid];
294                if (($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")
295                    && array_key_exists($qid, $results[$user]) ){
296                $myxls->write_string($row,$col++, $results[$user][$qid]["answer1"] );
297            }
298                if (($question->type == "2" || $question->type == "3")
299                    && array_key_exists($qid, $results[$user]) ){
300                $myxls->write_string($row, $col++, $results[$user][$qid]["answer2"] );
301            }
302        }
303    }
304    }
305    $workbook->close();
306
307    exit;
308}
309
310// Otherwise, return the text file.
311
312// Print header to force download
313
314header("Content-Type: application/download\n");
315
316$downloadfilename = clean_filename(strip_tags($courseshortname.' '.format_string($survey->name,true)));
317header("Content-Disposition: attachment; filename=\"$downloadfilename.txt\"");
318
319// Print names of all the fields
320
321echo "surveyid    surveyname    userid    firstname    lastname    email    idnumber    time    ";
322
323foreach ($nestedorder as $key => $nestedquestions) {
324    foreach ($nestedquestions as $key2 => $qid) {
325        $question = $questions[$qid];
326    if ($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")  {
327        echo "$question->text    ";
328    }
329    if ($question->type == "2" || $question->type == "3")  {
330         echo "$question->text (preferred)    ";
331    }
332}
333}
334echo "\n";
335
336// Print all the lines of data.
337foreach ($results as $user => $rest) {
338    if (! $u = $DB->get_record("user", array("id"=>$user))) {
339        print_error('invaliduserid');
340    }
341    echo $survey->id."\t";
342    echo strip_tags(format_string($survey->name,true))."\t";
343    echo $user."\t";
344    echo $u->firstname."\t";
345    echo $u->lastname."\t";
346    echo $u->email."\t";
347    echo $u->idnumber."\t";
348    echo userdate($results[$user]["time"], "%d-%b-%Y %I:%M:%S %p")."\t";
349
350    foreach ($nestedorder as $key => $nestedquestions) {
351        foreach ($nestedquestions as $key2 => $qid) {
352            $question = $questions[$qid];
353
354            if ($question->type == "0" || $question->type == "1" || $question->type == "3" || $question->type == "-1")  {
355                echo $results[$user][$qid]["answer1"]."    ";
356            }
357            if ($question->type == "2" || $question->type == "3")  {
358                echo $results[$user][$qid]["answer2"]."    ";
359            }
360        }
361    }
362    echo "\n";
363}
364
365exit;
366