Browse Source

Merge branch '1.11.x' of github.com:chamilo/chamilo-lms into 1.11.x

Angel Fernando Quiroz Campos 6 years ago
parent
commit
f23eed95c7

+ 1 - 1
main/attendance/attendance_controller.php

@@ -303,7 +303,7 @@ class AttendanceController
         $isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh(
             api_get_user_id(),
             api_get_course_info()
-        );
+        ) || api_is_drh();
 
         if ($edit == true) {
             if (api_is_allowed_to_edit(null, true) || $isDrhOfCourse) {

+ 1 - 1
main/attendance/attendance_sheet.php

@@ -16,7 +16,7 @@ api_protect_course_script(true);
 $isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh(
     api_get_user_id(),
     api_get_course_info()
-);
+) || api_is_drh();
 
 if (api_is_allowed_to_edit(null, true) ||
     api_is_coach(api_get_session_id(), api_get_course_int_id()) ||

+ 0 - 1
main/gradebook/index.php

@@ -786,7 +786,6 @@ if (isset($first_time) && $first_time == 1 && api_is_allowed_to_edit(null, true)
     }
 
     if (api_is_allowed_to_edit(null, true)) {
-
         if (((empty($selectCat)) || (isset($_GET['cidReq']) && $_GET['cidReq'] !== '')) ||
             (isset($_GET['isStudentView']) && $_GET['isStudentView'] == 'false')
         ) {

+ 4 - 4
main/inc/lib/attendance.lib.php

@@ -154,8 +154,9 @@ class Attendance
 
         while ($attendance = Database::fetch_row($res)) {
             $student_param = '';
-            if (api_is_drh() && $_GET['student_id']) {
-                $student_param = '&student_id='.intval($_GET['student_id']);
+            $studentRequestId = isset($_GET['student_id']) ? (int) $_GET['student_id'] : 0;
+            if (api_is_drh() && !empty($studentRequestId)) {
+                $student_param = '&student_id='.$studentRequestId;
             }
 
             $session_star = '';
@@ -166,8 +167,7 @@ class Attendance
                 $isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh(
                     api_get_user_id(),
                     api_get_course_info()
-                );
-
+                ) || api_is_drh();
                 if (api_is_allowed_to_edit(null, true) || $isDrhOfCourse) {
                     // Link to edit
                     $attendance[1] = '<a href="index.php?'.api_get_cidreq().'&action=attendance_sheet_list&attendance_id='.$attendance[0].$student_param.'">'.$attendance[1].'</a>'.$session_star;

+ 25 - 25
main/inc/lib/lp_item.lib.php

@@ -43,10 +43,10 @@ class LpItem
     {
         if ($in_c_id > 0 && $in_id > 0) {
             $item_view_table = Database::get_course_table(TABLE_LP_ITEM);
-            $sql = "SELECT * FROM $item_view_table
-                    WHERE
-                        c_id=".intval($in_c_id)." AND
-                        id=".intval($in_id);
+            $sql = "SELECT * FROM $item_view_table
+                    WHERE
+                        c_id=".intval($in_c_id)." AND
+                        iid=".intval($in_id);
 
             $res = Database::query($sql);
             $data = Database::fetch_array($res);
@@ -84,27 +84,27 @@ class LpItem
     {
         $table = Database::get_course_table(TABLE_LP_ITEM);
         if ($this->c_id > 0 && $this->id > 0) {
-            $sql = "UPDATE $table SET
-                        lp_id = '".intval($this->lp_id)."' ,
-                        item_type = '".Database::escape_string($this->item_type)."' ,
-                        ref = '".Database::escape_string($this->ref)."' ,
-                        title = '".Database::escape_string($this->title)."' ,
-                        description = '".Database::escape_string($this->description)."' ,
-                        path = '".Database::escape_string($this->path)."' ,
-                        min_score = '".Database::escape_string($this->min_score)."' ,
-                        max_score = '".Database::escape_string($this->max_score)."' ,
-                        mastery_score = '".Database::escape_string($this->mastery_score)."' ,
-                        parent_item_id = '".Database::escape_string($this->parent_item_id)."' ,
-                        previous_item_id = '".Database::escape_string($this->previous_item_id)."' ,
-                        next_item_id = '".Database::escape_string($this->next_item_id)."' ,
-                        display_order = '".Database::escape_string($this->display_order)."' ,
-                        prerequisite = '".Database::escape_string($this->prerequisite)."' ,
-                        parameters = '".Database::escape_string($this->parameters)."' ,
-                        launch_data = '".Database::escape_string($this->launch_data)."' ,
-                        max_time_allowed = '".Database::escape_string($this->max_time_allowed)."' ,
-                        terms = '".Database::escape_string($this->terms)."' ,
-                        search_did = '".Database::escape_string($this->search_did)."' ,
-                        audio = '".Database::escape_string($this->audio)."'
+            $sql = "UPDATE $table SET
+                        lp_id = '".intval($this->lp_id)."' ,
+                        item_type = '".Database::escape_string($this->item_type)."' ,
+                        ref = '".Database::escape_string($this->ref)."' ,
+                        title = '".Database::escape_string($this->title)."' ,
+                        description = '".Database::escape_string($this->description)."' ,
+                        path = '".Database::escape_string($this->path)."' ,
+                        min_score = '".Database::escape_string($this->min_score)."' ,
+                        max_score = '".Database::escape_string($this->max_score)."' ,
+                        mastery_score = '".Database::escape_string($this->mastery_score)."' ,
+                        parent_item_id = '".Database::escape_string($this->parent_item_id)."' ,
+                        previous_item_id = '".Database::escape_string($this->previous_item_id)."' ,
+                        next_item_id = '".Database::escape_string($this->next_item_id)."' ,
+                        display_order = '".Database::escape_string($this->display_order)."' ,
+                        prerequisite = '".Database::escape_string($this->prerequisite)."' ,
+                        parameters = '".Database::escape_string($this->parameters)."' ,
+                        launch_data = '".Database::escape_string($this->launch_data)."' ,
+                        max_time_allowed = '".Database::escape_string($this->max_time_allowed)."' ,
+                        terms = '".Database::escape_string($this->terms)."' ,
+                        search_did = '".Database::escape_string($this->search_did)."' ,
+                        audio = '".Database::escape_string($this->audio)."'
                     WHERE c_id=".$this->c_id." AND id=".$this->id;
             Database::query($sql);
         }

+ 2 - 0
main/inc/lib/template.lib.php

@@ -1916,7 +1916,9 @@ class Template
 
     /**
      * Get platform meta image tag (check meta_image_path setting, then use the logo).
+     *
      * @param string $imageAlt The alt attribute for the image
+     *
      * @return string The meta image HTML tag, or empty
      */
     private function getMetaPortalImagePath($imageAlt = '')

+ 6 - 1
main/inc/lib/tracking.lib.php

@@ -7448,8 +7448,9 @@ class TrackingCourseLog
         $direction,
         $includeInvitedUsers = false
     ) {
-        global $user_ids, $course_code, $export_csv, $csv_content, $session_id;
+        global $user_ids, $course_code, $export_csv, $session_id;
 
+        $csv_content = [];
         $course_code = Database::escape_string($course_code);
         $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
         $tbl_url_rel_user = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
@@ -7696,6 +7697,10 @@ class TrackingCourseLog
             $users[] = array_values($user_row);
         }
 
+        if ($export_csv) {
+            Session::write('csv_content', $csv_content);
+        }
+
         Session::erase('additional_user_profile_info');
         Session::erase('extra_field_info');
 

+ 3 - 3
main/lp/learnpath.class.php

@@ -10332,13 +10332,13 @@ class learnpath
         $selectedMinScore = [];
         $selectedMaxScore = [];
         $masteryScore = [];
-
         while ($row = Database::fetch_array($result)) {
-            if ($row['id'] == $item_id) {
+            if ($row['iid'] == $item_id) {
                 $selectedMinScore[$row['prerequisite']] = $row['prerequisite_min_score'];
                 $selectedMaxScore[$row['prerequisite']] = $row['prerequisite_max_score'];
-                $masteryScore[$row['prerequisite']] = $row['mastery_score'];
             }
+            $masteryScore[$row['iid']] = $row['mastery_score'];
+
             $arrLP[] = [
                 'id' => $row['iid'],
                 'item_type' => $row['item_type'],

+ 2 - 10
main/survey/reporting.php

@@ -62,21 +62,13 @@ if (!empty($exportReport) && !empty($format)) {
     switch ($format) {
         case 'xls':
             $filename = 'survey_results_'.$survey_id.'.xlsx';
-            $data = SurveyUtil::export_complete_report_xls(
-                $survey_data,
-                $filename,
-                $userId
-            );
+            $data = SurveyUtil::export_complete_report_xls($survey_data, $filename, $userId);
             exit;
             break;
         case 'csv':
         default:
-            $data = SurveyUtil::export_complete_report(
-                $survey_data,
-                $userId
-            );
+            $data = SurveyUtil::export_complete_report($survey_data, $userId);
             $filename = 'survey_results_'.$survey_id.'.csv';
-
             header('Content-type: application/octet-stream');
             header('Content-Type: application/force-download');
 

+ 143 - 114
main/survey/surveyUtil.class.php

@@ -225,7 +225,7 @@ class SurveyUtil
      */
     public static function handle_reporting_actions($survey_data, $people_filled)
     {
-        $action = isset($_GET['action']) ? $_GET['action'] : null;
+        $action = isset($_GET['action']) ? $_GET['action'] : '';
 
         // Getting the number of question
         $temp_questions_data = SurveyManager::get_questions($_GET['survey_id']);
@@ -243,20 +243,22 @@ class SurveyUtil
         // Counting the number of questions that are relevant for the reporting
         $survey_data['number_of_questions'] = count($questions_data);
 
-        if ($action == 'questionreport') {
-            self::display_question_report($survey_data);
-        }
-        if ($action == 'userreport') {
-            self::display_user_report($people_filled, $survey_data);
-        }
-        if ($action == 'comparativereport') {
-            self::display_comparative_report();
-        }
-        if ($action == 'completereport') {
-            self::display_complete_report($survey_data);
-        }
-        if ($action == 'deleteuserreport') {
-            self::delete_user_report($_GET['survey_id'], $_GET['user']);
+        switch ($action) {
+            case 'questionreport':
+                self::display_question_report($survey_data);
+                break;
+            case 'userreport':
+                self::display_user_report($people_filled, $survey_data);
+                break;
+            case 'comparativereport':
+                self::display_comparative_report();
+                break;
+            case 'completereport':
+                self::display_complete_report($survey_data);
+                break;
+            case 'deleteuserreport':
+                self::delete_user_report($_GET['survey_id'], $_GET['user']);
+                break;
         }
     }
 
@@ -373,7 +375,7 @@ class SurveyUtil
 
         echo '<select name="user" onchange="jumpMenu(\'parent\',this,0)">';
         echo '<option value="'.api_get_path(WEB_CODE_PATH).'survey/reporting.php?action='
-            .Security::remove_XSS($_GET['action']).'&survey_id='.intval($_GET['survey_id']).'">'
+            .Security::remove_XSS($_GET['action']).'&survey_id='.$surveyId.'&'.api_get_cidreq().'">'
             .get_lang('SelectUser').'</option>';
 
         foreach ($people_filled as $key => &$person) {
@@ -389,8 +391,8 @@ class SurveyUtil
                 $id = $person;
             }
             echo '<option value="'.api_get_path(WEB_CODE_PATH).'survey/reporting.php?action='
-                .Security::remove_XSS($_GET['action']).'&survey_id='.intval($_GET['survey_id']).'&user='
-                .Security::remove_XSS($id).'" ';
+                .Security::remove_XSS($_GET['action']).'&survey_id='.$surveyId.'&user='
+                .Security::remove_XSS($id).'&'.api_get_cidreq().'" ';
             if (isset($_GET['user']) && $_GET['user'] == $id) {
                 echo 'selected="selected"';
             }
@@ -425,7 +427,8 @@ class SurveyUtil
 					    survey_question.question_id = survey_question_option.question_id AND
 					    survey_question_option.c_id = $course_id
 					WHERE
-					    survey_question.survey_id = '".intval($_GET['survey_id'])."' AND
+					    survey_question NOT LIKE '%{{%' AND
+					    survey_question.survey_id = '".$surveyId."' AND
                         survey_question.c_id = $course_id
 					ORDER BY survey_question.sort, survey_question_option.sort ASC";
             $result = Database::query($sql);
@@ -445,7 +448,7 @@ class SurveyUtil
             $sql = "SELECT * FROM $table_survey_answer
 			        WHERE
                         c_id = $course_id AND
-                        survey_id = '".intval($_GET['survey_id'])."' AND
+                        survey_id = '".$surveyId."' AND
                         user = '".Database::escape_string($_GET['user'])."'";
             $result = Database::query($sql);
             while ($row = Database::fetch_array($result, 'ASSOC')) {
@@ -577,6 +580,7 @@ class SurveyUtil
 			        WHERE
 			            c_id = $course_id AND
                         survey_id='".$surveyId."' AND
+                        survey_question NOT LIKE '%{{%' AND
                         type <>'pagebreak'                        
                     ORDER BY sort ASC
                     $limitStatement";
@@ -957,8 +961,9 @@ class SurveyUtil
 				LEFT JOIN $table_survey_question_option o
 				ON q.question_id = o.question_id AND q.c_id = o.c_id
 				WHERE 
+				    survey_question NOT LIKE '%{{%' AND
 				    q.survey_id = '".$surveyId."' AND
-				    q.c_id = $course_id
+				    q.c_id = $course_id 
 				GROUP BY q.question_id
 				ORDER BY q.sort ASC";
         $result = Database::query($sql);
@@ -1016,6 +1021,7 @@ class SurveyUtil
 				LEFT JOIN $table_survey_question_option sqo
 				ON sq.question_id = sqo.question_id AND sq.c_id = sqo.c_id
 				WHERE
+				    survey_question NOT LIKE '%{{%' AND
 				    sq.survey_id = '".$surveyId."' AND
                     sq.c_id = $course_id
 				ORDER BY sq.sort ASC, sqo.sort ASC";
@@ -1169,7 +1175,9 @@ class SurveyUtil
             foreach ($possible_options as $question_id => &$possible_option) {
                 if ($questions[$question_id]['type'] == 'open' || $questions[$question_id]['type'] == 'comment') {
                     echo '<td align="center">';
-                    echo $answers_of_user[$question_id]['0']['option_id'];
+                    if (isset($answers_of_user[$question_id]) && isset($answers_of_user[$question_id]['0'])) {
+                        echo $answers_of_user[$question_id]['0']['option_id'];
+                    }
                     echo '</td>';
                 } else {
                     foreach ($possible_option as $option_id => &$value) {
@@ -1210,17 +1218,16 @@ class SurveyUtil
      */
     public static function export_complete_report($survey_data, $user_id = 0)
     {
-        // Database table definitions
-        $table_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
-        $table_survey_question_option = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
-        $table_survey_answer = Database::get_course_table(TABLE_SURVEY_ANSWER);
-
         $surveyId = isset($_GET['survey_id']) ? (int) $_GET['survey_id'] : 0;
 
         if (empty($surveyId)) {
             return false;
         }
 
+        $table_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
+        $table_survey_question_option = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
+        $table_survey_answer = Database::get_course_table(TABLE_SURVEY_ANSWER);
+
         // The first column
         $return = ';';
 
@@ -1245,12 +1252,17 @@ class SurveyUtil
                     count(options.question_option_id) as number_of_options
 				FROM $table_survey_question questions
                 LEFT JOIN $table_survey_question_option options
-				ON questions.question_id = options.question_id AND options.c_id = questions.c_id
+				ON 
+				  questions.question_id = options.question_id AND 
+				  options.c_id = questions.c_id
 				WHERE
-				    questions.survey_id = '".$surveyId."' AND
+				    survey_question NOT LIKE '%{{%' AND
+				    questions.type <> 'pagebreak' AND
+				    questions.survey_id = $surveyId AND
                     questions.c_id = $course_id
 				GROUP BY questions.question_id
 				ORDER BY questions.sort ASC";
+
         $result = Database::query($sql);
         while ($row = Database::fetch_array($result)) {
             // We show the questions if
@@ -1261,24 +1273,21 @@ class SurveyUtil
                     is_array($_POST['questions_filter']) &&
                     in_array($row['question_id'], $_POST['questions_filter']))
             ) {
-                // We do not show comment and pagebreak question types
-                if ($row['type'] != 'pagebreak') {
-                    if ($row['number_of_options'] == 0 && ($row['type'] == 'open' || $row['type'] == 'comment')) {
+                if ($row['number_of_options'] == 0) {
+                    $return .= str_replace(
+                        "\r\n",
+                        '  ',
+                        api_html_entity_decode(strip_tags($row['survey_question']), ENT_QUOTES)
+                    )
+                    .';';
+                } else {
+                    for ($ii = 0; $ii < $row['number_of_options']; $ii++) {
                         $return .= str_replace(
                             "\r\n",
                             '  ',
                             api_html_entity_decode(strip_tags($row['survey_question']), ENT_QUOTES)
                         )
                         .';';
-                    } else {
-                        for ($ii = 0; $ii < $row['number_of_options']; $ii++) {
-                            $return .= str_replace(
-                                "\r\n",
-                                '  ',
-                                api_html_entity_decode(strip_tags($row['survey_question']), ENT_QUOTES)
-                            )
-                            .';';
-                        }
                     }
                 }
             }
@@ -1300,7 +1309,7 @@ class SurveyUtil
             }
         }
 
-        $sql = "SELECT
+        $sql = "SELECT DISTINCT
 		            survey_question.question_id,
 		            survey_question.survey_id,
 		            survey_question.survey_question,
@@ -1312,11 +1321,13 @@ class SurveyUtil
                     survey_question_option.sort as option_sort
 				FROM $table_survey_question survey_question
 				LEFT JOIN $table_survey_question_option survey_question_option
-				ON
+				ON	    
 				    survey_question.question_id = survey_question_option.question_id AND
 				    survey_question_option.c_id = survey_question.c_id
-				WHERE
-				    survey_question.survey_id = '".$surveyId."' AND
+				WHERE				
+				    survey_question NOT LIKE '%{{%' AND			
+				    survey_question.type <> 'pagebreak' AND				    
+				    survey_question.survey_id = $surveyId AND
 				    survey_question.c_id = $course_id
 				ORDER BY survey_question.sort ASC, survey_question_option.sort ASC";
         $result = Database::query($sql);
@@ -1331,30 +1342,35 @@ class SurveyUtil
                 in_array($row['question_id'], $_POST['questions_filter'])
             )
             ) {
-                // We do not show comment and pagebreak question types
-                if ($row['type'] != 'pagebreak') {
-                    $row['option_text'] = str_replace(["\r", "\n"], ['', ''], $row['option_text']);
-                    $return .= api_html_entity_decode(strip_tags($row['option_text']), ENT_QUOTES).';';
-                    $possible_answers[$row['question_id']][$row['question_option_id']] = $row['question_option_id'];
-                    $possible_answers_type[$row['question_id']] = $row['type'];
-                }
+                $row['option_text'] = str_replace(["\r", "\n"], ['', ''], $row['option_text']);
+                $return .= api_html_entity_decode(strip_tags($row['option_text']), ENT_QUOTES).';';
+                $possible_answers[$row['question_id']][$row['question_option_id']] = $row['question_option_id'];
+                $possible_answers_type[$row['question_id']] = $row['type'];
             }
         }
+
         $return .= "\n";
 
         // Getting all the answers of the users
         $old_user = '';
         $answers_of_user = [];
         $sql = "SELECT * FROM $table_survey_answer
-		        WHERE c_id = $course_id AND survey_id='".$surveyId."'";
+		        WHERE 
+		          c_id = $course_id AND 
+		          survey_id='".$surveyId."'		           
+		          ";
         if ($user_id != 0) {
             $sql .= "AND user='".Database::escape_string($user_id)."' ";
         }
-        $sql .= "ORDER BY user ASC";
+        $sql .= ' ORDER BY user ASC ';
 
+        $questionIdList = array_keys($possible_answers_type);
         $open_question_iterator = 1;
         $result = Database::query($sql);
-        while ($row = Database::fetch_array($result)) {
+        while ($row = Database::fetch_array($result, 'ASSOC')) {
+            if (!in_array($row['question_id'], $questionIdList)) {
+                continue;
+            }
             if ($old_user != $row['user'] && $old_user != '') {
                 $return .= self::export_complete_report_row(
                     $survey_data,
@@ -1365,6 +1381,7 @@ class SurveyUtil
                 );
                 $answers_of_user = [];
             }
+
             if ($possible_answers_type[$row['question_id']] == 'open' ||
                 $possible_answers_type[$row['question_id']] == 'comment'
             ) {
@@ -1376,6 +1393,7 @@ class SurveyUtil
             }
             $old_user = $row['user'];
         }
+
         // This is to display the last user
         $return .= self::export_complete_report_row(
             $survey_data,
@@ -1535,8 +1553,12 @@ class SurveyUtil
                     count(options.question_option_id) as number_of_options
 				FROM $table_survey_question questions
 				LEFT JOIN $table_survey_question_option options
-                ON questions.question_id = options.question_id AND options.c_id = questions.c_id
+                ON 
+                  questions.question_id = options.question_id AND 
+                  options.c_id = questions.c_id
 				WHERE
+				    survey_question NOT LIKE '%{{%' AND
+				    questions.type <> 'pagebreak' AND
 				    questions.survey_id = $surveyId AND
 				    questions.c_id = $course_id
 				GROUP BY questions.question_id
@@ -1550,9 +1572,20 @@ class SurveyUtil
                 (isset($_POST['submit_question_filter']) && is_array($_POST['questions_filter']) &&
                 in_array($row['question_id'], $_POST['questions_filter']))
             ) {
-                // We do not show comment and pagebreak question types
-                if ($row['type'] != 'pagebreak') {
-                    if ($row['number_of_options'] == 0 && ($row['type'] == 'open' || $row['type'] == 'comment')) {
+                if ($row['number_of_options'] == 0 &&
+                    ($row['type'] == 'open' || $row['type'] == 'comment')
+                ) {
+                    $worksheet->setCellValueByColumnAndRow(
+                        $column,
+                        $line,
+                        api_html_entity_decode(
+                            strip_tags($row['survey_question']),
+                            ENT_QUOTES
+                        )
+                    );
+                    $column++;
+                } else {
+                    for ($ii = 0; $ii < $row['number_of_options']; $ii++) {
                         $worksheet->setCellValueByColumnAndRow(
                             $column,
                             $line,
@@ -1562,18 +1595,6 @@ class SurveyUtil
                             )
                         );
                         $column++;
-                    } else {
-                        for ($ii = 0; $ii < $row['number_of_options']; $ii++) {
-                            $worksheet->setCellValueByColumnAndRow(
-                                $column,
-                                $line,
-                                api_html_entity_decode(
-                                    strip_tags($row['survey_question']),
-                                    ENT_QUOTES
-                                )
-                            );
-                            $column++;
-                        }
                     }
                 }
             }
@@ -1596,21 +1617,23 @@ class SurveyUtil
 
         // Getting all the questions and options (second line)
         $sql = "SELECT
-                    survey_question.question_id, 
-                    survey_question.survey_id, 
-                    survey_question.survey_question, 
-                    survey_question.display, 
-                    survey_question.sort, 
+                    survey_question.question_id,
+                    survey_question.survey_id,
+                    survey_question.survey_question,
+                    survey_question.display,
+                    survey_question.sort,
                     survey_question.type,
-                    survey_question_option.question_option_id, 
-                    survey_question_option.option_text, 
+                    survey_question_option.question_option_id,
+                    survey_question_option.option_text,
                     survey_question_option.sort as option_sort
 				FROM $table_survey_question survey_question
 				LEFT JOIN $table_survey_question_option survey_question_option
-				ON 
-				    survey_question.question_id = survey_question_option.question_id AND 
+				ON
+				    survey_question.question_id = survey_question_option.question_id AND
 				    survey_question_option.c_id = survey_question.c_id
-				WHERE 
+				WHERE				
+				    survey_question NOT LIKE '%{{%' AND
+				    survey_question.type <> 'pagebreak' AND
 				    survey_question.survey_id = $surveyId AND
 				    survey_question.c_id = $course_id
 				ORDER BY survey_question.sort ASC, survey_question_option.sort ASC";
@@ -1625,20 +1648,17 @@ class SurveyUtil
                 (isset($_POST['questions_filter']) && is_array($_POST['questions_filter']) &&
                 in_array($row['question_id'], $_POST['questions_filter']))
             ) {
-                // We do not show comment and pagebreak question types
-                if ($row['type'] != 'pagebreak') {
-                    $worksheet->setCellValueByColumnAndRow(
-                        $column,
-                        $line,
-                        api_html_entity_decode(
-                            strip_tags($row['option_text']),
-                            ENT_QUOTES
-                        )
-                    );
-                    $possible_answers[$row['question_id']][$row['question_option_id']] = $row['question_option_id'];
-                    $possible_answers_type[$row['question_id']] = $row['type'];
-                    $column++;
-                }
+                $worksheet->setCellValueByColumnAndRow(
+                    $column,
+                    $line,
+                    api_html_entity_decode(
+                        strip_tags($row['option_text']),
+                        ENT_QUOTES
+                    )
+                );
+                $possible_answers[$row['question_id']][$row['question_option_id']] = $row['question_option_id'];
+                $possible_answers_type[$row['question_id']] = $row['type'];
+                $column++;
             }
         }
 
@@ -1652,7 +1672,7 @@ class SurveyUtil
         if ($user_id != 0) {
             $sql .= " AND user='".intval($user_id)."' ";
         }
-        $sql .= " ORDER BY user ASC";
+        $sql .= ' ORDER BY user ASC';
 
         $open_question_iterator = 1;
         $result = Database::query($sql);
@@ -1673,7 +1693,9 @@ class SurveyUtil
                 $line++;
                 $column = 0;
             }
-            if ($possible_answers_type[$row['question_id']] == 'open' || $possible_answers_type[$row['question_id']] == 'comment') {
+            if ($possible_answers_type[$row['question_id']] == 'open' ||
+                $possible_answers_type[$row['question_id']] == 'comment'
+            ) {
                 $temp_id = 'open'.$open_question_iterator;
                 $answers_of_user[$row['question_id']][$temp_id] = $row;
                 $open_question_iterator++;
@@ -1843,6 +1865,13 @@ class SurveyUtil
         $optionsY = ['----'];
         $defaults = [];
         foreach ($questions as $key => &$question) {
+            // Ignored tagged questions
+            if ($question) {
+                if (strpos($question['question'], '{{') !== false) {
+                    $question = null;
+                    continue;
+                }
+            }
             if (is_array($allowed_question_types)) {
                 if (in_array($question['type'], $allowed_question_types)) {
                     if (isset($_GET['xaxis']) && $_GET['xaxis'] == $question['question_id']) {
@@ -1853,8 +1882,8 @@ class SurveyUtil
                         $defaults['yaxis'] = $question['question_id'];
                     }
 
-                    $optionsX[$question['question_id']] = api_substr(strip_tags($question['question']), 0, 50);
-                    $optionsY[$question['question_id']] = api_substr(strip_tags($question['question']), 0, 50);
+                    $optionsX[$question['question_id']] = api_substr(strip_tags($question['question']), 0, 90);
+                    $optionsY[$question['question_id']] = api_substr(strip_tags($question['question']), 0, 90);
                 }
             }
         }
@@ -2053,9 +2082,9 @@ class SurveyUtil
         $table_survey_answer = Database::get_course_table(TABLE_SURVEY_ANSWER);
 
         $sql = "SELECT * FROM $table_survey_answer
-                WHERE 
-                  c_id = $course_id AND 
-                  survey_id='".intval($survey_id)."' AND 
+                WHERE
+                  c_id = $course_id AND
+                  survey_id='".intval($survey_id)."' AND
                   question_id='".intval($question_id)."'
                 ORDER BY USER ASC";
         $result = Database::query($sql);
@@ -2308,7 +2337,7 @@ class SurveyUtil
         ) {
             $insertId = Database::insert($table, $params);
             if ($insertId) {
-                $sql = "UPDATE $table 
+                $sql = "UPDATE $table
                         SET survey_invitation_id = $insertId
                         WHERE iid = $insertId";
                 Database::query($sql);
@@ -2848,7 +2877,7 @@ class SurveyUtil
                 );
 
                 $actions[] = Display::url(
-                    Display::return_icon('multiplicate_survey.png', get_lang('MultiplicateSurvey')),
+                    Display::return_icon('multiplicate_survey.png', get_lang('MultiplicateQuestions')),
                     $codePath.'survey/survey_list.php?'
                     .http_build_query($params + ['action' => 'multiplicate', 'survey_id' => $survey_id])
                 );
@@ -3095,9 +3124,9 @@ class SurveyUtil
             ON (survey.author = user.user_id)
             WHERE survey.c_id = $course_id
             $search_restriction
-            $condition_session 
+            $condition_session
             GROUP BY survey.survey_id
-            ORDER BY col$column $direction 
+            ORDER BY col$column $direction
             LIMIT $from,$number_of_items
         ";
         $res = Database::query($sql);
@@ -3213,11 +3242,11 @@ class SurveyUtil
         $efv = new ExtraFieldValue('survey');
 
         $sql = "
-            SELECT 
-            survey.survey_id AS col0, 
-                survey.title AS col1, 
-                survey.code AS col2, 
-                count(survey_question.question_id) AS col3, 
+            SELECT
+            survey.survey_id AS col0,
+                survey.title AS col1,
+                survey.code AS col2,
+                count(survey_question.question_id) AS col3,
         "
             .(api_is_western_name_order()
                 ? "CONCAT(user.firstname, ' ', user.lastname)"
@@ -3304,16 +3333,16 @@ class SurveyUtil
         $filterDate = $allowSurveyAvailabilityDatetime ? $now->format('Y-m-d H:i') : $now->format('Y-m-d');
 
         $sql = "SELECT *
-                FROM $table_survey survey 
+                FROM $table_survey survey
                 INNER JOIN
                 $table_survey_invitation survey_invitation
                 ON (
                     survey.code = survey_invitation.survey_code AND
-                    survey.c_id = survey_invitation.c_id AND 
+                    survey.c_id = survey_invitation.c_id AND
                     survey.session_id = survey_invitation.session_id
                 )
 				WHERE
-                    survey_invitation.user = $user_id AND                    
+                    survey_invitation.user = $user_id AND
                     survey.avail_from <= '$filterDate' AND
                     survey.avail_till >= '$filterDate' AND
                     survey.c_id = $course_id AND

+ 43 - 14
main/tracking/courseLog.php

@@ -35,7 +35,6 @@ $is_allowedToTrack = Tracking::isAllowToTrack($session_id);
 
 if (!$is_allowedToTrack) {
     api_not_allowed(true);
-    exit;
 }
 
 // If the user is a HR director (drh)
@@ -73,7 +72,6 @@ if (api_is_drh()) {
         $coursesFollowedList = array_keys($coursesFollowedList);
         if (!in_array($courseId, $coursesFollowedList)) {
             api_not_allowed(true);
-            exit;
         }
     }
 }
@@ -342,7 +340,7 @@ if ($showReporting) {
 
 // Show the charts part only if there are students subscribed to this course/session
 if ($nbStudents > 0) {
-    $usersTracking = TrackingCourseLog::get_user_data(null, $nbStudents, null, 'DESC');
+    $usersTracking = TrackingCourseLog::get_user_data(null, $nbStudents, null, 'DESC', false);
     $numberStudentsCompletedLP = 0;
     $averageStudentsTestScore = 0;
     $scoresDistribution = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
@@ -412,7 +410,7 @@ if ($nbStudents > 0) {
     $tpl->assign('number_students', $nbStudents);
     $tpl->assign('top_students', $userScoreList);
 
-    $trackingSummaryLayout = $tpl->get_template("tracking/tracking_course_log.tpl");
+    $trackingSummaryLayout = $tpl->get_template('tracking/tracking_course_log.tpl');
     $content = $tpl->fetch($trackingSummaryLayout);
 
     echo $content;
@@ -508,21 +506,50 @@ if (count($a_students) > 0) {
     $table->set_header(3, get_lang('Login'), false);
     $headers['login'] = get_lang('Login');
 
-    $table->set_header(4, get_lang('TrainingTime').'&nbsp;'.
-        Display::return_icon('info3.gif', get_lang('CourseTimeInfo'), ['align' => 'absmiddle', 'hspace' => '3px']), false, ['style' => 'width:110px;']);
+    $table->set_header(
+        4,
+        get_lang('TrainingTime').'&nbsp;'.
+        Display::return_icon('info3.gif', get_lang('CourseTimeInfo'), ['align' => 'absmiddle', 'hspace' => '3px']),
+        false,
+        ['style' => 'width:110px;']
+    );
     $headers['training_time'] = get_lang('TrainingTime');
     $table->set_header(5, get_lang('CourseProgress').'&nbsp;'.
-        Display::return_icon('info3.gif', get_lang('ScormAndLPProgressTotalAverage'), ['align' => 'absmiddle', 'hspace' => '3px']), false, ['style' => 'width:110px;']);
+        Display::return_icon(
+            'info3.gif',
+            get_lang('ScormAndLPProgressTotalAverage'),
+            ['align' => 'absmiddle', 'hspace' => '3px']
+        ),
+        false,
+        ['style' => 'width:110px;']
+    );
     $headers['course_progress'] = get_lang('CourseProgress');
 
     $table->set_header(6, get_lang('ExerciseProgress').'&nbsp;'.
-        Display::return_icon('info3.gif', get_lang('ExerciseProgressInfo'), ['align' => 'absmiddle', 'hspace' => '3px']), false, ['style' => 'width:110px;']);
+        Display::return_icon(
+            'info3.gif',
+            get_lang('ExerciseProgressInfo'),
+            ['align' => 'absmiddle', 'hspace' => '3px']
+        ),
+        false,
+        ['style' => 'width:110px;']
+    );
     $headers['exercise_progress'] = get_lang('ExerciseProgress');
     $table->set_header(7, get_lang('ExerciseAverage').'&nbsp;'.
-        Display::return_icon('info3.gif', get_lang('ExerciseAverageInfo'), ['align' => 'absmiddle', 'hspace' => '3px']), false, ['style' => 'width:110px;']);
+        Display::return_icon('info3.gif', get_lang('ExerciseAverageInfo'), ['align' => 'absmiddle', 'hspace' => '3px']),
+        false,
+        ['style' => 'width:110px;']
+    );
     $headers['exercise_average'] = get_lang('ExerciseAverage');
     $table->set_header(8, get_lang('Score').'&nbsp;'.
-        Display::return_icon('info3.gif', get_lang('ScormAndLPTestTotalAverage'), ['align' => 'absmiddle', 'hspace' => '3px']), false, ['style' => 'width:110px;']);
+        Display::return_icon(
+            'info3.gif',
+            get_lang('ScormAndLPTestTotalAverage'),
+            ['align' => 'absmiddle', 'hspace' => '3px']
+        ),
+        false,
+        ['style' => 'width:110px;']
+    );
     $headers['score'] = get_lang('Score');
     $table->set_header(9, get_lang('Student_publication'), false);
     $headers['student_publication'] = get_lang('Student_publication');
@@ -633,19 +660,21 @@ if ($export_csv) {
     }
     ob_end_clean();
 
+    $csvContentInSession = Session::read('csv_content');
+
     // Adding headers before the content.
-    array_unshift($csv_content, $csv_headers);
+    array_unshift($csvContentInSession, $csv_headers);
 
     if ($session_id) {
         $sessionData = [];
         $sessionInfo = api_get_session_info($session_id);
         $sessionDates = SessionManager::parseSessionDates($sessionInfo);
 
-        array_unshift($csv_content, [get_lang('Date'), $sessionDates['access']]);
-        array_unshift($csv_content, [get_lang('SessionName'), $sessionInfo['name']]);
+        array_unshift($csvContentInSession, [get_lang('Date'), $sessionDates['access']]);
+        array_unshift($csvContentInSession, [get_lang('SessionName'), $sessionInfo['name']]);
     }
 
-    Export::arrayToCsv($csv_content, 'reporting_student_list');
+    Export::arrayToCsv($csvContentInSession, 'reporting_student_list');
     exit;
 }
 Display::display_footer();