Passed
Push — 1.11.x ( bce6cd...c146d9 )
by Angel Fernando Quiroz
12:25
created

exercise/hotpotatoes_exercise_result.class.php (1 issue)

1
<?php
2
/* For licensing terms, see /license.txt */
3
4
/**
5
 * Class HotpotatoesExerciseResult
6
 * Allows you to export exercises results in multiple presentation forms.
7
 *
8
 * @package chamilo.exercise
9
 */
10
class HotpotatoesExerciseResult
11
{
12
    //stores the list of exercises
13
    private $exercises_list = [];
14
15
    //stores the results
16
    private $results = [];
17
18
    /**
19
     * Gets the results of all students (or just one student if access is limited).
20
     *
21
     * @param string $document_path The document path (for HotPotatoes retrieval)
22
     * @param    int        User ID. Optional. If no user ID is provided, we take all the results. Defauts to null
23
     *
24
     * @return bool
25
     */
26
    public function getExercisesReporting($document_path, $hotpotato_name)
27
    {
28
        $return = [];
29
        $TBL_USER = Database::get_main_table(TABLE_MAIN_USER);
30
        $TBL_TRACK_HOTPOTATOES = Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
31
        $course_id = api_get_course_int_id();
32
        $user_id = null;
33
        $session_id_and = ' AND te.session_id = '.api_get_session_id().' ';
34
        $hotpotato_name = Database::escape_string($hotpotato_name);
35
36
        if (!empty($exercise_id)) {
37
            $session_id_and .= " AND exe_exo_id = $exercise_id ";
38
        }
39
40
        if (empty($user_id)) {
41
            $sql = "SELECT firstname as userpart1, lastname as userpart2 ,
42
                    email,
43
                    tth.exe_name,
44
                    tth.exe_result,
45
                    tth.exe_weighting,
46
                    tth.exe_date
47
                    FROM $TBL_TRACK_HOTPOTATOES tth, $TBL_USER tu
48
                    WHERE   tu.user_id=tth.exe_user_id AND
49
                            tth.c_id = $course_id AND
50
                            tth.exe_name = '$hotpotato_name'
51
                    ORDER BY tth.c_id ASC, tth.exe_date ASC";
52
        } else {
53
            // get only this user's results
54
            $sql = "SELECT '', exe_name, exe_result , exe_weighting, exe_date
55
                    FROM $TBL_TRACK_HOTPOTATOES
56
                    WHERE
57
                        exe_user_id = $user_id AND
58
                        c_id = $course_id AND
59
                        tth.exe_name = '$hotpotato_name'
60
                    ORDER BY c_id ASC, exe_date ASC";
61
        }
62
63
        $results = [];
64
65
        $resx = Database::query($sql);
66
        while ($rowx = Database::fetch_array($resx, 'ASSOC')) {
67
            $results[] = $rowx;
68
        }
69
70
        $hpresults = [];
71
        $resx = Database::query($sql);
72
        while ($rowx = Database::fetch_array($resx, 'ASSOC')) {
73
            $hpresults[] = $rowx;
74
        }
75
76
        // Print the Result of Hotpotatoes Tests
77
        if (is_array($hpresults)) {
78
            for ($i = 0; $i < sizeof($hpresults); $i++) {
79
                $return[$i] = [];
80
                $title = GetQuizName($hpresults[$i]['exe_name'], $document_path);
81
                if ($title == '') {
82
                    $title = basename($hpresults[$i]['exe_name']);
83
                }
84
                if (empty($user_id)) {
85
                    $return[$i]['email'] = $hpresults[$i]['email'];
86
                    $return[$i]['first_name'] = $hpresults[$i]['userpart1'];
87
                    $return[$i]['last_name'] = $hpresults[$i]['userpart2'];
88
                }
89
                $return[$i]['title'] = $title;
90
                $return[$i]['exe_date'] = $hpresults[$i]['exe_date'];
91
92
                $return[$i]['result'] = $hpresults[$i]['exe_result'];
93
                $return[$i]['max'] = $hpresults[$i]['exe_weighting'];
94
            }
95
        }
96
        $this->results = $return;
97
98
        return true;
99
    }
100
101
    /**
102
     * Exports the complete report as a CSV file.
103
     *
104
     * @param string $document_path  Document path inside the document tool
105
     * @param string $hotpotato_name
106
     *
107
     * @return bool False on error
108
     */
109
    public function exportCompleteReportCSV($document_path = '', $hotpotato_name = '')
110
    {
111
        global $charset;
112
        $this->getExercisesReporting($document_path, $hotpotato_name);
113
        $filename = 'exercise_results_'.date('YmdGis').'.csv';
114
        if (!empty($user_id)) {
115
            $filename = 'exercise_results_user_'.$user_id.'_'.date('YmdGis').'.csv';
116
        }
117
        $data = '';
118
119
        if (api_is_western_name_order()) {
120
            if (!empty($this->results[0]['first_name'])) {
121
                $data .= get_lang('FirstName').';';
122
            }
123
            if (!empty($this->results[0]['last_name'])) {
124
                $data .= get_lang('LastName').';';
125
            }
126
        } else {
127
            if (!empty($this->results[0]['last_name'])) {
128
                $data .= get_lang('LastName').';';
129
            }
130
            if (!empty($this->results[0]['first_name'])) {
131
                $data .= get_lang('FirstName').';';
132
            }
133
        }
134
        $data .= get_lang('Email').';';
135
        $data .= get_lang('Title').';';
136
        $data .= get_lang('StartDate').';';
137
        $data .= get_lang('Score').';';
138
        $data .= get_lang('Total').';';
139
        $data .= "\n";
140
141
        // Results
142
        foreach ($this->results as $row) {
143
            if (api_is_western_name_order()) {
144
                $data .= str_replace("\r\n", '  ', api_html_entity_decode(strip_tags($row['first_name']), ENT_QUOTES, $charset)).';';
145
                $data .= str_replace("\r\n", '  ', api_html_entity_decode(strip_tags($row['last_name']), ENT_QUOTES, $charset)).';';
146
            } else {
147
                $data .= str_replace("\r\n", '  ', api_html_entity_decode(strip_tags($row['last_name']), ENT_QUOTES, $charset)).';';
148
                $data .= str_replace("\r\n", '  ', api_html_entity_decode(strip_tags($row['first_name']), ENT_QUOTES, $charset)).';';
149
            }
150
151
            $data .= str_replace("\r\n", '  ', api_html_entity_decode(strip_tags($row['email']), ENT_QUOTES, $charset)).';';
152
            $data .= str_replace("\r\n", '  ', api_html_entity_decode(strip_tags($row['title']), ENT_QUOTES, $charset)).';';
153
            $data .= str_replace("\r\n", '  ', $row['exe_date']).';';
154
            $data .= str_replace("\r\n", '  ', $row['result']).';';
155
            $data .= str_replace("\r\n", '  ', $row['max']).';';
156
            $data .= "\n";
157
        }
158
159
        //output the results
160
        $len = strlen($data);
161
        header('Content-type: application/octet-stream');
162
        header('Content-Type: application/force-download');
163
        header('Content-length: '.$len);
164
        if (preg_match("/MSIE 5.5/", $_SERVER['HTTP_USER_AGENT'])) {
165
            header('Content-Disposition: filename= '.$filename);
166
        } else {
167
            header('Content-Disposition: attachment; filename= '.$filename);
168
        }
169
        if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) {
170
            header('Pragma: ');
171
            header('Cache-Control: ');
172
            header('Cache-Control: public'); // IE cannot download from sessions without a cache
173
        }
174
        header('Content-Description: '.$filename);
175
        header('Content-transfer-encoding: binary');
176
        // @todo add this utf-8 header for all csv files
177
        echo "\xEF\xBB\xBF"; // force utf-8 header of csv file
178
        echo $data;
179
180
        return true;
181
    }
182
183
    /**
184
     * Exports the complete report as an XLS file.
185
     *
186
     * @param string $document_path
187
     * @param null   $user_id
188
     * @param bool   $export_user_fields
189
     * @param int    $export_filter
190
     * @param int    $exercise_id
191
     * @param null   $hotpotato_name
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $hotpotato_name is correct as it would always require null to be passed?
Loading history...
192
     *
193
     * @return bool
194
     */
195
    public function exportCompleteReportXLS(
196
        $document_path = '',
197
        $user_id = null,
198
        $export_user_fields = false,
199
        $export_filter = 0,
200
        $exercise_id = 0,
201
        $hotpotato_name = null
202
    ) {
203
        global $charset;
204
        $this->getExercisesReporting(
205
            $document_path,
206
            $user_id,
207
            $export_filter,
208
            $exercise_id,
209
            $hotpotato_name
210
        );
211
        $filename = 'exercise_results_'.api_get_local_time().'.xls';
212
        if (!empty($user_id)) {
213
            $filename = 'exercise_results_user_'.$user_id.'_'.api_get_local_time().'.xls';
214
        }
215
216
        $spreadsheet = new PHPExcel();
217
        $spreadsheet->setActiveSheetIndex(0);
218
        $worksheet = $spreadsheet->getActiveSheet();
219
220
        $line = 0;
221
        $column = 0; //skip the first column (row titles)
222
223
        // check if exists column 'user'
224
        $with_column_user = false;
225
        foreach ($this->results as $result) {
226
            if (!empty($result['last_name']) && !empty($result['first_name'])) {
227
                $with_column_user = true;
228
                break;
229
            }
230
        }
231
232
        if ($with_column_user) {
233
            $worksheet->setCellValueByColumnAndRow(
234
                $column,
235
                $line,
236
                get_lang('Email')
237
            );
238
            $column++;
239
            if (api_is_western_name_order()) {
240
                $worksheet->setCellValueByColumnAndRow(
241
                    $column,
242
                    $line,
243
                    get_lang('FirstName')
244
                );
245
                $column++;
246
                $worksheet->setCellValueByColumnAndRow(
247
                    $column,
248
                    $line,
249
                    get_lang('LastName')
250
                );
251
                $column++;
252
            } else {
253
                $worksheet->setCellValueByColumnAndRow(
254
                    $column,
255
                    $line,
256
                    get_lang('LastName')
257
                );
258
                $column++;
259
                $worksheet->setCellValueByColumnAndRow(
260
                    $column,
261
                    $line,
262
                    get_lang('FirstName')
263
                );
264
                $column++;
265
            }
266
        }
267
268
        if ($export_user_fields) {
269
            //show user fields section with a big th colspan that spans over all fields
270
            $extra_user_fields = UserManager::get_extra_fields(
271
                0,
272
                1000,
273
                5,
274
                'ASC',
275
                false,
276
                1
277
            );
278
279
            //show the fields names for user fields
280
            foreach ($extra_user_fields as $field) {
281
                $worksheet->setCellValueByColumnAndRow(
282
                    $column,
283
                    $line,
284
                    api_html_entity_decode(
285
                        strip_tags($field[3]),
286
                        ENT_QUOTES,
287
                        $charset
288
                    )
289
                );
290
                $column++;
291
            }
292
        }
293
294
        $worksheet->setCellValueByColumnAndRow(
295
            $column,
296
            $line,
297
            get_lang('Title')
298
        );
299
        $column++;
300
        $worksheet->setCellValueByColumnAndRow(
301
            $column,
302
            $line,
303
            get_lang('StartDate')
304
        );
305
        $column++;
306
        $worksheet->setCellValueByColumnAndRow(
307
            $column,
308
            $line,
309
            get_lang('EndDate')
310
        );
311
        $column++;
312
        $worksheet->setCellValueByColumnAndRow(
313
            $column,
314
            $line,
315
            get_lang('Duration').' ('.get_lang('MinMinutes').')'
316
        );
317
        $column++;
318
        $worksheet->setCellValueByColumnAndRow(
319
            $column,
320
            $line,
321
            get_lang('Score')
322
        );
323
        $column++;
324
        $worksheet->setCellValueByColumnAndRow(
325
            $column,
326
            $line,
327
            get_lang('Total')
328
        );
329
        $column++;
330
        $worksheet->setCellValueByColumnAndRow(
331
            $column,
332
            $line,
333
            get_lang('Status')
334
        );
335
        $line++;
336
337
        foreach ($this->results as $row) {
338
            $column = 0;
339
340
            if ($with_column_user) {
341
                $worksheet->setCellValueByColumnAndRow(
342
                    $column,
343
                    $line,
344
                    api_html_entity_decode(
345
                        strip_tags($row['email']),
346
                        ENT_QUOTES,
347
                        $charset
348
                    )
349
                );
350
                $column++;
351
352
                if (api_is_western_name_order()) {
353
                    $worksheet->setCellValueByColumnAndRow(
354
                        $column,
355
                        $line,
356
                        api_html_entity_decode(
357
                            strip_tags($row['first_name']),
358
                            ENT_QUOTES,
359
                            $charset
360
                        )
361
                    );
362
                    $column++;
363
                    $worksheet->setCellValueByColumnAndRow(
364
                        $column,
365
                        $line,
366
                        api_html_entity_decode(
367
                            strip_tags($row['last_name']),
368
                            ENT_QUOTES,
369
                            $charset
370
                        )
371
                    );
372
                    $column++;
373
                } else {
374
                    $worksheet->setCellValueByColumnAndRow(
375
                        $column,
376
                        $line,
377
                        api_html_entity_decode(
378
                            strip_tags($row['last_name']),
379
                            ENT_QUOTES,
380
                            $charset
381
                        )
382
                    );
383
                    $column++;
384
                    $worksheet->setCellValueByColumnAndRow(
385
                        $column,
386
                        $line,
387
                        api_html_entity_decode(
388
                            strip_tags($row['first_name']),
389
                            ENT_QUOTES,
390
                            $charset
391
                        )
392
                    );
393
                    $column++;
394
                }
395
            }
396
397
            if ($export_user_fields) {
398
                //show user fields data, if any, for this user
399
                $user_fields_values = UserManager::get_extra_user_data(
400
                    $row['user_id'],
401
                    false,
402
                    false,
403
                    false,
404
                    true
405
                );
406
                foreach ($user_fields_values as $value) {
407
                    $worksheet->setCellValueByColumnAndRow($column, $line, api_html_entity_decode(strip_tags($value), ENT_QUOTES, $charset));
408
                    $column++;
409
                }
410
            }
411
412
            $worksheet->setCellValueByColumnAndRow($column, $line, api_html_entity_decode(strip_tags($row['title']), ENT_QUOTES, $charset));
413
            $column++;
414
            $worksheet->setCellValueByColumnAndRow($column, $line, $row['start_date']);
415
            $column++;
416
            $worksheet->setCellValueByColumnAndRow($column, $line, $row['end_date']);
417
            $column++;
418
            $worksheet->setCellValueByColumnAndRow($column, $line, $row['duration']);
419
            $column++;
420
            $worksheet->setCellValueByColumnAndRow($column, $line, $row['result']);
421
            $column++;
422
            $worksheet->setCellValueByColumnAndRow($column, $line, $row['max']);
423
            $column++;
424
            $worksheet->setCellValueByColumnAndRow($column, $line, $row['status']);
425
            $line++;
426
        }
427
428
        $file = api_get_path(SYS_ARCHIVE_PATH).api_replace_dangerous_char($filename);
429
        $writer = new PHPExcel_Writer_Excel2007($spreadsheet);
430
        $writer->save($file);
431
        DocumentManager::file_send_for_download($file, true, $filename);
432
433
        return true;
434
    }
435
}
436