diff --git a/main/survey/ch_multiplechoiceother.php b/main/survey/ch_multiplechoiceother.php index d1d1554720..349888bf9d 100644 --- a/main/survey/ch_multiplechoiceother.php +++ b/main/survey/ch_multiplechoiceother.php @@ -73,6 +73,21 @@ class ch_multiplechoiceother extends survey_question } } $questionId = $questionData['question_id']; + + $display = 'display:none'; + $defaultOtherData = ''; + + if (!empty($answers)) { + $answers = self::decodeOptionValue($answers); + if (isset($answers[1])) { + + $display = ''; + $defaultOtherData = $answers[1]; + } + + $answers = $answers[0]; + } + $question->render($form, $questionData, $answers); $form->addHtml( '' ); - $display = 'display:none'; - $defaultOtherData = ''; - if (!empty($answers)) { - $answers = self::decodeOptionValue($answers); - if (isset($answers[1])) { - $display = ''; - $defaultOtherData = $answers[1]; - } - } $form->addHtml('
'); $element = $form->addText( 'other_question'.$questionId, diff --git a/main/survey/surveyUtil.class.php b/main/survey/surveyUtil.class.php index f83da1b889..1c87c35216 100755 --- a/main/survey/surveyUtil.class.php +++ b/main/survey/surveyUtil.class.php @@ -905,7 +905,11 @@ class SurveyUtil $row['option_id'] = $parts[0]; } - $data[$row['option_id']] = $row; + if (!isset($data[$row['option_id']])) { + $data[$row['option_id']] = $row; + } else { + $data[$row['option_id']]['total'] = $data[$row['option_id']]['total'] + $row['total']; + } } foreach ($options as $option) { @@ -1740,7 +1744,9 @@ class SurveyUtil ) .';'; } else { - for ($ii = 0; $ii < $row['number_of_options']; $ii++) { + $numberOfOptions = $row['number_of_options']; + if ($row['type'] == 'multiplechoiceother') $numberOfOptions++; + for ($ii = 0; $ii < $numberOfOptions; $ii++) { $return .= str_replace( "\r\n", ' ', @@ -1795,6 +1801,8 @@ class SurveyUtil $result = Database::query($sql); $possible_answers = []; $possible_answers_type = []; + $current_question_type = ''; + $current_question_id = null; while ($row = Database::fetch_array($result)) { // We show the options if // 1. there is no question filter and the export button has not been clicked @@ -1807,9 +1815,21 @@ class SurveyUtil in_array($row['question_id'], $_POST['questions_filter'.$suffixLpItem]) ) ) { + if ($current_question_id != $row['question_id']) { + if ($current_question_type == 'multiplechoiceother') { + $return .= api_html_entity_decode(strip_tags(get_lang('Comment')), ENT_QUOTES).';'; + } + } + + $current_question_type = $row['type']; + $current_question_id = $row['question_id']; + $row['option_text'] = str_replace(["\r", "\n"], ['', ''], $row['option_text']); if (!$compact) { $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']; } else { $possible_answers[$row['question_id']][$row['question_option_id']] = $row['option_text']; @@ -1818,6 +1838,10 @@ class SurveyUtil } } + if ($current_question_type == 'multiplechoiceother') { + $return .= api_html_entity_decode(strip_tags(get_lang('Comment')), ENT_QUOTES).';'; + } + $return .= "\n"; // To select the answers by Lp item @@ -1856,7 +1880,8 @@ class SurveyUtil $answers_of_user, $old_user, !$survey_data['anonymous'], - $compact + $compact, + $possible_answers_type ); $answers_of_user = []; } @@ -1880,7 +1905,8 @@ class SurveyUtil $answers_of_user, $old_user, true, - $compact + $compact, + $possible_answers_type ); return $return; @@ -1908,7 +1934,8 @@ class SurveyUtil $answers_of_user, $user, $display_extra_user_fields = false, - $compact = false + $compact = false, + $questionTypes = true ) { $return = ''; if (0 == $survey_data['anonymous']) { @@ -1946,6 +1973,7 @@ class SurveyUtil if (is_array($possible_options)) { foreach ($possible_options as $question_id => $possible_option) { if (is_array($possible_option) && count($possible_option) > 0) { + $otherPaddingNeeded = ($questionTypes[$question_id] == 'multiplechoiceother' ? true : false); foreach ($possible_option as $option_id => &$value) { // For each option of this question, look if it matches the user's answer $my_answer_of_user = !isset($answers_of_user[$question_id]) || isset($answers_of_user[$question_id]) && $answers_of_user[$question_id] == null ? [] : $answers_of_user[$question_id]; @@ -1994,12 +2022,30 @@ class SurveyUtil $return .= 'v;'; } } + } elseif (isset($key[0]) && strpos($key[0], '@:@') !== false) { + list($idAnswer, $other) = explode('@:@', $key[0]); + + if ($idAnswer == $option_id) { + $return .= ( + strlen($other) > 0 + ? 'v;"' . str_replace('"', '""', api_html_entity_decode(strip_tags($other), ENT_QUOTES)) . '";' + : 'v;' + ); + } else { + if (!$compact) { + $return .= ';'; + $otherPaddingNeeded = false; + } + } } else { - if (!$compact) { + if (!$compact || $questionTypes[$question_id] == 'multipleresponse') { $return .= ';'; } } } + if ($otherPaddingNeeded == true) { + $return .= ';'; + } } } } @@ -2107,7 +2153,9 @@ class SurveyUtil ); $column++; } else { - for ($ii = 0; $ii < $row['number_of_options']; $ii++) { + $numberOfOptions = $row['number_of_options']; + if ($row['type'] == 'multiplechoiceother') $numberOfOptions++; + for ($ii = 0; $ii < $numberOfOptions; $ii++) { $worksheet->setCellValueByColumnAndRow( $column, $line, @@ -2162,6 +2210,8 @@ class SurveyUtil $result = Database::query($sql); $possible_answers = []; $possible_answers_type = []; + $current_question_type = ''; + $current_question_id = null; while ($row = Database::fetch_array($result)) { // We show the options if // 1. there is no question filter and the export button has not been clicked @@ -2170,6 +2220,23 @@ class SurveyUtil (isset($_POST['questions_filter'.$suffixLpItem]) && is_array($_POST['questions_filter'.$suffixLpItem]) && in_array($row['question_id'], $_POST['questions_filter'.$suffixLpItem])) ) { + if ($current_question_id != $row['question_id']) { + if ($current_question_type == 'multiplechoiceother') { + $worksheet->setCellValueByColumnAndRow( + $column, + $line, + api_html_entity_decode( + strip_tags(get_lang('Comment')), + ENT_QUOTES + ) + ); + $column++; + } + } + + $current_question_type = $row['type']; + $current_question_id = $row['question_id']; + $worksheet->setCellValueByColumnAndRow( $column, $line, @@ -2184,6 +2251,17 @@ class SurveyUtil } } + if ($current_question_type == 'multiplechoiceother') { + $worksheet->setCellValueByColumnAndRow( + $column, + $line, + api_html_entity_decode( + strip_tags(get_lang('Comment')), + ENT_QUOTES + ) + ); + } + // To select the answers by Lp item $lpItemCondition = ''; if (api_get_configuration_value('allow_survey_tool_in_lp')) { @@ -2211,7 +2289,8 @@ class SurveyUtil $possible_answers, $answers_of_user, $old_user, - !$survey_data['anonymous'] + !$survey_data['anonymous'], + $possible_answers_type ); foreach ($return as $elem) { $worksheet->setCellValueByColumnAndRow($column, $line, $elem); @@ -2238,7 +2317,8 @@ class SurveyUtil $possible_answers, $answers_of_user, $old_user, - true + true, + $possible_answers_type ); // this is to display the last user @@ -2275,7 +2355,8 @@ class SurveyUtil $possible_options, $answers_of_user, $user, - $display_extra_user_fields = false + $display_extra_user_fields = false, + $questionTypes = true ) { $return = []; if ($survey_data['anonymous'] == 0) { @@ -2311,6 +2392,7 @@ class SurveyUtil if (is_array($possible_options)) { foreach ($possible_options as $question_id => &$possible_option) { + $otherPaddingNeeded = ($questionTypes[$question_id] == 'multiplechoiceother' ? true : false); if (is_array($possible_option) && count($possible_option) > 0) { foreach ($possible_option as $option_id => &$value) { $my_answers_of_user = isset($answers_of_user[$question_id]) @@ -2328,10 +2410,26 @@ class SurveyUtil } else { $return[] = 'v'; } + } elseif (isset($key[0]) && strpos($key[0], '@:@') !== false) { + list($idAnswer, $other) = explode('@:@', $key[0]); + if ($idAnswer == $option_id) { + if (strlen($other) > 0) { + $return[] = 'v'; + $return[] = api_html_entity_decode(strip_tags($other), ENT_QUOTES); + $otherPaddingNeeded = false; + } else { + $return[] = 'v'; + } + } else { + $return[] = ''; + } } else { $return[] = ''; } } + if ($otherPaddingNeeded == true) { + $return[] = ''; + } } } }