From 52cbf96c6d5097192fecff4de1835a71b59e4f02 Mon Sep 17 00:00:00 2001 From: Patrick Teichmann Date: Tue, 30 May 2023 15:56:42 +0200 Subject: [PATCH] Fixed issue #18848: setting specific values for steps in Array(numbers) causes php timeout --- application/controllers/admin/DataEntry.php | 26 ++++++++++--- .../AdvancedSettingWidget/views/integer.php | 8 ++-- .../helpers/admin/statistics_helper.php | 31 ++++++++++----- application/helpers/export_helper.php | 38 ++++++++++++++++-- application/helpers/qanda_helper.php | 35 +++++++---------- application/helpers/userstatistics_helper.php | 31 ++++++++++----- .../export/statistics_subviews/_question.php | 39 +++++++++++-------- .../answer/arrays/multiflexi/config.xml | 3 +- 8 files changed, 138 insertions(+), 73 deletions(-) diff --git a/application/controllers/admin/DataEntry.php b/application/controllers/admin/DataEntry.php index d939b8220ee..78f3e5ee1c7 100644 --- a/application/controllers/admin/DataEntry.php +++ b/application/controllers/admin/DataEntry.php @@ -1199,11 +1199,18 @@ public function editdata($subaction, $id, $surveyid) } } - if (trim($qidattributes['multiflexible_step']) != '') { - $stepvalue = $qidattributes['multiflexible_step']; + $stepvalue = (trim($qidattributes['multiflexible_step']) != '' && $qidattributes['multiflexible_step'] > 0) ? $qidattributes['multiflexible_step'] : 1; + + if ($qidattributes['reverse'] == 1) { + $tmp = $minvalue; + $minvalue = $maxvalue; + $maxvalue = $tmp; + $reverse = true; + $stepvalue = -$stepvalue; } else { - $stepvalue = 1; + $reverse = false; } + if ($qidattributes['multiflexible_checkbox'] != 0) { $minvalue = 0; $maxvalue = 1; @@ -2204,11 +2211,18 @@ public function view($surveyid) } } - if (trim($qidattributes['multiflexible_step']) != '') { - $stepvalue = $qidattributes['multiflexible_step']; + $stepvalue = (trim($qidattributes['multiflexible_step']) != '' && $qidattributes['multiflexible_step'] > 0) ? $qidattributes['multiflexible_step'] : 1; + + if ($qidattributes['reverse'] == 1) { + $tmp = $minvalue; + $minvalue = $maxvalue; + $maxvalue = $tmp; + $reverse = true; + $stepvalue = -$stepvalue; } else { - $stepvalue = 1; + $reverse = false; } + if ($qidattributes['multiflexible_checkbox'] != 0) { $minvalue = 0; $maxvalue = 1; diff --git a/application/extensions/AdvancedSettingWidget/views/integer.php b/application/extensions/AdvancedSettingWidget/views/integer.php index b8a585cc1d8..7d4c0314b52 100644 --- a/application/extensions/AdvancedSettingWidget/views/integer.php +++ b/application/extensions/AdvancedSettingWidget/views/integer.php @@ -4,17 +4,15 @@ setting['aFormElementOptions']['inputGroup']['prefix']; ?> - - setting['help']) ? 'aria-describedby="help-' . CHtml::getIdByName($inputBaseName) . '"' : "" ?> value="setting['value']); ?>" + min="setting['min'] ?? ''?>" + max="setting['max'] ?? ''?>" /> setting['aFormElementOptions']['inputGroup']['suffix'])) : ?>
diff --git a/application/helpers/admin/statistics_helper.php b/application/helpers/admin/statistics_helper.php index 4ec7d63d31c..89c641081ea 100644 --- a/application/helpers/admin/statistics_helper.php +++ b/application/helpers/admin/statistics_helper.php @@ -1257,22 +1257,33 @@ protected function buildOutputList($rt, $language, $surveyid, $outputType, $sql, case Question::QT_COLON_ARRAY_NUMBERS: // Array (Multiple Flexi) (Numbers) $aQuestionAttributes = QuestionAttribute::model()->getQuestionAttributes($qiqid); - if (trim($aQuestionAttributes['multiflexible_max']) != '') { + $minvalue = 1; + $maxvalue = 10; + if (trim($aQuestionAttributes['multiflexible_max']) != '' && trim($aQuestionAttributes['multiflexible_min']) == '') { $maxvalue = $aQuestionAttributes['multiflexible_max']; - } else { - $maxvalue = 10; + $minvalue = 1; } - - if (trim($aQuestionAttributes['multiflexible_min']) != '') { + if (trim($aQuestionAttributes['multiflexible_min']) != '' && trim($aQuestionAttributes['multiflexible_max']) == '') { $minvalue = $aQuestionAttributes['multiflexible_min']; - } else { - $minvalue = 1; + $maxvalue = $aQuestionAttributes['multiflexible_min'] + 10; + } + if (trim($aQuestionAttributes['multiflexible_min']) != '' && trim($aQuestionAttributes['multiflexible_max']) != '') { + if ($aQuestionAttributes['multiflexible_min'] < $aQuestionAttributes['multiflexible_max']) { + $minvalue = $aQuestionAttributes['multiflexible_min']; + $maxvalue = $aQuestionAttributes['multiflexible_max']; + } } - if (trim($aQuestionAttributes['multiflexible_step']) != '') { - $stepvalue = $aQuestionAttributes['multiflexible_step']; + $stepvalue = (trim($aQuestionAttributes['multiflexible_step']) != '' && $aQuestionAttributes['multiflexible_step'] > 0) ? $aQuestionAttributes['multiflexible_step'] : 1; + + if ($aQuestionAttributes['reverse'] == 1) { + $tmp = $minvalue; + $minvalue = $maxvalue; + $maxvalue = $tmp; + $reverse = true; + $stepvalue = -$stepvalue; } else { - $stepvalue = 1; + $reverse = false; } if ($aQuestionAttributes['multiflexible_checkbox'] != 0) { diff --git a/application/helpers/export_helper.php b/application/helpers/export_helper.php index 810e601d1a3..a4131e4b704 100644 --- a/application/helpers/export_helper.php +++ b/application/helpers/export_helper.php @@ -338,9 +338,41 @@ function SPSSGetValues($field, $qidattributes, $language) 'size' => numericSize($field['sql_name']), ); } else { - $minvalue = trim($qidattributes['multiflexible_min']) ? $qidattributes['multiflexible_min'] : 1; - $maxvalue = trim($qidattributes['multiflexible_max']) ? $qidattributes['multiflexible_max'] : 10; - $stepvalue = trim($qidattributes['multiflexible_step']) ? $qidattributes['multiflexible_step'] : 1; + $minvalue = 1; + $maxvalue = 10; + if (trim($qidattributes['multiflexible_max']) != '' && trim($qidattributes['multiflexible_min']) == '') { + $maxvalue = $qidattributes['multiflexible_max']; + $minvalue = 1; + } + if (trim($qidattributes['multiflexible_min']) != '' && trim($qidattributes['multiflexible_max']) == '') { + $minvalue = $qidattributes['multiflexible_min']; + $maxvalue = $qidattributes['multiflexible_min'] + 10; + } + if (trim($qidattributes['multiflexible_min']) != '' && trim($qidattributes['multiflexible_max']) != '') { + if ($qidattributes['multiflexible_min'] < $qidattributes['multiflexible_max']) { + $minvalue = $qidattributes['multiflexible_min']; + $maxvalue = $qidattributes['multiflexible_max']; + } + } + + $stepvalue = (trim($qidattributes['multiflexible_step']) != '' && $qidattributes['multiflexible_step'] > 0) ? $qidattributes['multiflexible_step'] : 1; + + if ($qidattributes['reverse'] == 1) { + $tmp = $minvalue; + $minvalue = $maxvalue; + $maxvalue = $tmp; + $reverse = true; + $stepvalue = -$stepvalue; + } else { + $reverse = false; + } + + if ($qidattributes['multiflexible_checkbox']!=0) + { + $minvalue=0; + $maxvalue=1; + $stepvalue=1; + } for ($i = $minvalue; $i <= $maxvalue; $i += $stepvalue) { $answers[] = array('code' => $i, 'value' => $i); } diff --git a/application/helpers/qanda_helper.php b/application/helpers/qanda_helper.php index bcdad69152c..3f440016d51 100644 --- a/application/helpers/qanda_helper.php +++ b/application/helpers/qanda_helper.php @@ -4177,40 +4177,33 @@ function do_array_multiflexi($ia) $aQuestionAttributes = QuestionAttribute::model()->getQuestionAttributes($ia[0]); // Define min and max value + $minvalue = 1; + $maxvalue = 10; if (trim($aQuestionAttributes['multiflexible_max']) != '' && trim($aQuestionAttributes['multiflexible_min']) == '') { - $maxvalue = $aQuestionAttributes['multiflexible_max']; - $minvalue = 1; - $extraclass .= " maxvalue maxvalue-" . trim($aQuestionAttributes['multiflexible_max']); // @todo : move to data + $maxvalue = $aQuestionAttributes['multiflexible_max']; + $minvalue = 1; } - if (trim($aQuestionAttributes['multiflexible_min']) != '' && trim($aQuestionAttributes['multiflexible_max']) == '') { - $minvalue = $aQuestionAttributes['multiflexible_min']; - $maxvalue = $aQuestionAttributes['multiflexible_min'] + 10; - $extraclass .= " minvalue minvalue-" . trim($aQuestionAttributes['multiflexible_max']); // @todo : move to data - } - - if (trim($aQuestionAttributes['multiflexible_min']) == '' && trim($aQuestionAttributes['multiflexible_max']) == '') { - $maxvalue = 10; - $minvalue = (isset($minvalue['value']) && $minvalue['value'] == 0) ? 0 : 1; + $minvalue = $aQuestionAttributes['multiflexible_min']; + $maxvalue = $aQuestionAttributes['multiflexible_min'] + 10; } - if (trim($aQuestionAttributes['multiflexible_min']) != '' && trim($aQuestionAttributes['multiflexible_max']) != '') { if ($aQuestionAttributes['multiflexible_min'] < $aQuestionAttributes['multiflexible_max']) { - $minvalue = $aQuestionAttributes['multiflexible_min']; - $maxvalue = $aQuestionAttributes['multiflexible_max']; + $minvalue = $aQuestionAttributes['multiflexible_min']; + $maxvalue = $aQuestionAttributes['multiflexible_max']; } } $stepvalue = (trim($aQuestionAttributes['multiflexible_step']) != '' && $aQuestionAttributes['multiflexible_step'] > 0) ? $aQuestionAttributes['multiflexible_step'] : 1; if ($aQuestionAttributes['reverse'] == 1) { - $tmp = $minvalue; - $minvalue = $maxvalue; - $maxvalue = $tmp; - $reverse = true; - $stepvalue = -$stepvalue; + $tmp = $minvalue; + $minvalue = $maxvalue; + $maxvalue = $tmp; + $reverse = true; + $stepvalue = -$stepvalue; } else { - $reverse = false; + $reverse = false; } $checkboxlayout = false; diff --git a/application/helpers/userstatistics_helper.php b/application/helpers/userstatistics_helper.php index 1551df3cd41..1b240371ba4 100644 --- a/application/helpers/userstatistics_helper.php +++ b/application/helpers/userstatistics_helper.php @@ -1203,22 +1203,33 @@ protected function buildOutputList($rt, $language, $surveyid, $outputType, $sql, case Question::QT_COLON_ARRAY_NUMBERS: // Array (Multiple Flexi) (Numbers) $aQuestionAttributes = QuestionAttribute::model()->getQuestionAttributes($qiqid); - if (trim($aQuestionAttributes['multiflexible_max']) != '') { + $minvalue = 1; + $maxvalue = 10; + if (trim($aQuestionAttributes['multiflexible_max']) != '' && trim($aQuestionAttributes['multiflexible_min']) == '') { $maxvalue = $aQuestionAttributes['multiflexible_max']; - } else { - $maxvalue = 10; + $minvalue = 1; } - - if (trim($aQuestionAttributes['multiflexible_min']) != '') { + if (trim($aQuestionAttributes['multiflexible_min']) != '' && trim($aQuestionAttributes['multiflexible_max']) == '') { $minvalue = $aQuestionAttributes['multiflexible_min']; - } else { - $minvalue = 1; + $maxvalue = $aQuestionAttributes['multiflexible_min'] + 10; + } + if (trim($aQuestionAttributes['multiflexible_min']) != '' && trim($aQuestionAttributes['multiflexible_max']) != '') { + if ($aQuestionAttributes['multiflexible_min'] < $aQuestionAttributes['multiflexible_max']) { + $minvalue = $aQuestionAttributes['multiflexible_min']; + $maxvalue = $aQuestionAttributes['multiflexible_max']; + } } - if (trim($aQuestionAttributes['multiflexible_step']) != '') { - $stepvalue = $aQuestionAttributes['multiflexible_step']; + $stepvalue = (trim($aQuestionAttributes['multiflexible_step']) != '' && $aQuestionAttributes['multiflexible_step'] > 0) ? $aQuestionAttributes['multiflexible_step'] : 1; + + if ($aQuestionAttributes['reverse'] == 1) { + $tmp = $minvalue; + $minvalue = $maxvalue; + $maxvalue = $tmp; + $reverse = true; + $stepvalue = -$stepvalue; } else { - $stepvalue = 1; + $reverse = false; } if ($aQuestionAttributes['multiflexible_checkbox'] != 0) { diff --git a/application/views/admin/export/statistics_subviews/_question.php b/application/views/admin/export/statistics_subviews/_question.php index 228559612dd..f9f3e036c61 100644 --- a/application/views/admin/export/statistics_subviews/_question.php +++ b/application/views/admin/export/statistics_subviews/_question.php @@ -640,30 +640,35 @@ //Get qidattributes for this question echo '

'.$oStatisticsHelper::_showSpeaker($niceqtext).'


'; $qidattributes=QuestionAttribute::model()->getQuestionAttributes($flt[0]); - if (trim($qidattributes['multiflexible_max'])!='' && trim($qidattributes['multiflexible_min']) ==''){ - $maxvalue=$qidattributes['multiflexible_max']; - $minvalue=1; + $minvalue = 1; + $maxvalue = 10; + if (trim($qidattributes['multiflexible_max']) != '' && trim($qidattributes['multiflexible_min']) == '') { + $maxvalue = $qidattributes['multiflexible_max']; + $minvalue = 1; } - if (trim($qidattributes['multiflexible_min'])!='' && trim($qidattributes['multiflexible_max']) ==''){ - $minvalue=$qidattributes['multiflexible_min']; - $maxvalue=$qidattributes['multiflexible_min'] + 10; + if (trim($qidattributes['multiflexible_min']) != '' && trim($qidattributes['multiflexible_max']) == '') { + $minvalue = $qidattributes['multiflexible_min']; + $maxvalue = $qidattributes['multiflexible_min'] + 10; } - if (trim($qidattributes['multiflexible_min'])=='' && trim($qidattributes['multiflexible_max']) ==''){ - $minvalue=1; - $maxvalue=10; - } - if (trim($qidattributes['multiflexible_min']) !='' && trim($qidattributes['multiflexible_max']) !=''){ - if($qidattributes['multiflexible_min'] < $qidattributes['multiflexible_max']){ - $minvalue=$qidattributes['multiflexible_min']; - $maxvalue=$qidattributes['multiflexible_max']; + if (trim($qidattributes['multiflexible_min']) != '' && trim($qidattributes['multiflexible_max']) != '') { + if ($qidattributes['multiflexible_min'] < $qidattributes['multiflexible_max']) { + $minvalue = $qidattributes['multiflexible_min']; + $maxvalue = $qidattributes['multiflexible_max']; } } - if (trim($qidattributes['multiflexible_step'])!='') { - $stepvalue=$qidattributes['multiflexible_step']; + $stepvalue = (trim($qidattributes['multiflexible_step']) != '' && $qidattributes['multiflexible_step'] > 0) ? $qidattributes['multiflexible_step'] : 1; + + if ($qidattributes['reverse'] == 1) { + $tmp = $minvalue; + $minvalue = $maxvalue; + $maxvalue = $tmp; + $reverse = true; + $stepvalue = -$stepvalue; } else { - $stepvalue=1; + $reverse = false; } + if ($qidattributes['multiflexible_checkbox']!=0) { $minvalue=0; diff --git a/application/views/survey/questions/answer/arrays/multiflexi/config.xml b/application/views/survey/questions/answer/arrays/multiflexi/config.xml index 9ddc860d506..c4bfb5dd328 100644 --- a/application/views/survey/questions/answer/arrays/multiflexi/config.xml +++ b/application/views/survey/questions/answer/arrays/multiflexi/config.xml @@ -244,7 +244,8 @@ Display 111 integer - + 1 + 1 Step value Step value