From 04eb464583a1248ec2d1d9b3b43faa79eb8f2090 Mon Sep 17 00:00:00 2001 From: Denis Chenu Date: Mon, 26 Nov 2018 17:29:43 +0100 Subject: [PATCH] Fixed issue #14273: {ASSESSMENT_CURRENT_TOTAL} usage broken in survey Fixed issue #13572: Empty assessement still shown Dev : pull request #1182 Dev: evaluation of current total must be done each time Dev: add an var to get the current assesment data or not Dev: remove dbExecuteAssoc Dev: assesment return 0 : show Unkown : test isset and not empty Fixed issue : ASSESSMENT_CURRENT_TOTAL is not saved in Equation question type Dev: currently : equation question type use templatereplace Dev: maybe better to create a new function to get only real var used in Equation ? --- application/helpers/SurveyRuntimeHelper.php | 2 +- .../helpers/expressions/em_manager_helper.php | 8 + application/helpers/frontend_helper.php | 266 +++++++++--------- application/helpers/replacements_helper.php | 8 +- .../admin/assessments/assessments_edit.php | 8 +- 5 files changed, 158 insertions(+), 134 deletions(-) diff --git a/application/helpers/SurveyRuntimeHelper.php b/application/helpers/SurveyRuntimeHelper.php index 96494d2dc4e..380e10e47e5 100644 --- a/application/helpers/SurveyRuntimeHelper.php +++ b/application/helpers/SurveyRuntimeHelper.php @@ -1092,7 +1092,7 @@ private function moveSubmitIfNeeded() //Check for assessments $this->aSurveyInfo['aAssessments']['show'] = false; if ($this->aSurveyInfo['assessments'] == "Y") { - $this->aSurveyInfo['aAssessments'] = doAssessment($this->iSurveyid); + $this->aSurveyInfo['aAssessments'] = doAssessment($this->iSurveyid,false); } // End text if (trim(str_replace(array('

', '

'), '', $this->aSurveyInfo['surveyls_endtext'])) == '') { diff --git a/application/helpers/expressions/em_manager_helper.php b/application/helpers/expressions/em_manager_helper.php index c25ed7a5ed2..6fb23bbd193 100644 --- a/application/helpers/expressions/em_manager_helper.php +++ b/application/helpers/expressions/em_manager_helper.php @@ -3661,6 +3661,14 @@ public function setVariableAndTokenMappingsForExpressionManager($surveyid,$force 'jsName'=>'', 'readWrite'=>'N', ); + if($survey->getIsAssessments()) { + $this->knownVars['ASSESSMENT_CURRENT_TOTAL'] = array( + 'code'=> 0, + 'jsName_on'=>'', + 'jsName'=>'', + 'readWrite'=>'N', + ); + } /* Add the core replacement before question code : needed if use it in equation , use SID to never send error */ templatereplace("{SID}"); diff --git a/application/helpers/frontend_helper.php b/application/helpers/frontend_helper.php index 25630e2e26d..81e11d55e43 100644 --- a/application/helpers/frontend_helper.php +++ b/application/helpers/frontend_helper.php @@ -1524,10 +1524,11 @@ function getNavigatorDatas() /** * Caculate assessement scores * - * @param mixed $surveyid + * @param integer $surveyid + * @param boolean $onlyCurrent : only current ( ASSESSMENT_CURRENT_TOTAL ) * @return array */ -function doAssessment($surveyid) +function doAssessment($surveyid, $onlyCurrent = true) { /* Default : show nothing */ $assessment = array( @@ -1538,152 +1539,163 @@ function doAssessment($surveyid) 'subtotal' => array( 'show' => false, ), + 'total_score' => "", // Current total is set to 0 if assessments == "Y", empty string if not. + 'subtotal_score' => array(), // Score by group, used only on endpage currently ); - $survey = Survey::model()->findByPk($surveyid); - - if (Survey::model()->findByPk($surveyid)->assessments != "Y") { - return $assessment; + $oSurvey = Survey::model()->findByPk($surveyid); + if ($oSurvey->assessments != "Y") { + return array( + 'show'=> false, + 'datas' => $assessment, + 'currentotal' => '', + ); } - $baselang = $survey->language; + $currentLanguage = App()->getLanguage(); + $baselang = $oSurvey->language; if (!isset($_SESSION['survey_'.$surveyid]['s_lang'])) { - $_SESSION['survey_'.$surveyid]['s_lang'] = $baselang; + /* Then not inside survey … can surely return directly */ + return array( + 'show'=> false, + 'datas' => $assessment, + 'currentotal' => '', + ); } - $total = 0; - $query = "SELECT * FROM {{assessments}} - WHERE sid=$surveyid and language='".$_SESSION['survey_'.$surveyid]['s_lang']."' - ORDER BY scope, id"; - - if ($result = dbExecuteAssoc($query)) { - $aResultSet = $result->readAll(); - - if (count($aResultSet) > 0) { - - foreach ($aResultSet as $row) { - - if ($row['scope'] == "G") { - $assessment['group'][$row['gid']][] = array("name"=>$row['name'], - "min" => $row['minimum'], - "max" => $row['maximum'], - "message" => $row['message'] - ); + /* Always count and count only one time … */ + $fieldmap = createFieldMap($oSurvey, "full", false, false, $currentLanguage); + $total = 0; + $groups = array(); + foreach ($fieldmap as $field) { + // Init Assessment Value + $assessmentValue = null; + if (in_array($field['type'], array('1', 'F', 'H', 'W', 'Z', 'L', '!', 'M', 'O', 'P'))) { + $fieldmap[$field['fieldname']]['assessment_value'] = 0; + if (isset($_SESSION['survey_'.$surveyid][$field['fieldname']])) { + //Multiflexi choice - result is the assessment attribute value + if (($field['type'] == "M") || ($field['type'] == "P")) { + if ($_SESSION['survey_'.$surveyid][$field['fieldname']] == "Y") { + $aAttributes = QuestionAttribute::model()->getQuestionAttributes($field['qid']); + $assessmentValue = (int) $aAttributes['assessment_value']; + } } else { - $assessment['total']['show'] = true; - $assessment['total'][] = array("name"=>$row['name'], - "min" => $row['minimum'], - "max" => $row['maximum'], - "message" => $row['message'] - ); - } - } - $fieldmap = createFieldMap($survey, "full", false, false, $_SESSION['survey_'.$surveyid]['s_lang']); - $i = 0; - $total = 0; - $groups = array(); - - foreach ($fieldmap as $field) { - - // Init Assessment Value - $assessmentValue = null; - - if (in_array($field['type'], array('1', 'F', 'H', 'W', 'Z', 'L', '!', 'M', 'O', 'P'))) { - - $fieldmap[$field['fieldname']]['assessment_value'] = 0; - - if (isset($_SESSION['survey_'.$surveyid][$field['fieldname']])) { - - //Multiflexi choice - result is the assessment attribute value - if (($field['type'] == "M") || ($field['type'] == "P")) { - if ($_SESSION['survey_'.$surveyid][$field['fieldname']] == "Y") { - - $aAttributes = QuestionAttribute::model()->getQuestionAttributes($field['qid']); - $assessmentValue = (int) $aAttributes['assessment_value']; - } - } else { - // Single choice question - $usquery = "SELECT assessment_value FROM {{answers}} where qid=".$field['qid']." and language='$baselang' and code=".App()->db->quoteValue($_SESSION['survey_'.$surveyid][$field['fieldname']]); - $usresult = dbExecuteAssoc($usquery); //Checked - - if ($usresult) { - $usrow = $usresult->read(); - $assessmentValue = $usrow['assessment_value']; - // $total = $total+$usrow['assessment_value']; - } - } - - $fieldmap[$field['fieldname']]['assessment_value'] = $assessmentValue; + // Single choice question + $oAssessementAnswer = Answer::model()->find(array( + 'select' => 'code,assessment_value', + 'condition' => 'qid = :qid and language = :language and code = :code', // Same assessment_value for all language, get primary + 'params' => array(":qid" => $field['qid'],":language" => $baselang, ":code" => $_SESSION['survey_'.$surveyid][$field['fieldname']]) + )); + if ($oAssessementAnswer) { + $assessmentValue = $oAssessementAnswer->assessment_value; } - $groups[] = $field['gid']; } - // If this is a question (and not a survey field, like ID), save asessment value - if ($field['qid'] > 0) { - /** - * Allow Plugin to update assessment value - */ - // Prepare Event Info - $event = new PluginEvent('afterSurveyQuestionAssessment'); - $event->set('surveyId', $surveyid); - $event->set('lang', $_SESSION['survey_'.$surveyid]['s_lang']); - $event->set('gid', $field['gid']); - $event->set('qid', $field['qid']); - - if (array_key_exists('sqid', $field)) { - - $event->set('sqid', $field['sqid']); - } - - if (array_key_exists('aid', $field)) { - - $event->set('aid', $field['aid']); - } - - $event->set('assessmentValue', $assessmentValue); + $fieldmap[$field['fieldname']]['assessment_value'] = $assessmentValue; + } + $groups[] = $field['gid']; + } - if (isset($_SESSION['survey_'.$surveyid][$field['fieldname']])) { - $event->set('response', $_SESSION['survey_'.$surveyid][$field['fieldname']]); - } + // If this is a question (and not a survey field, like ID), save asessment value + if ($field['qid'] > 0) { + /** + * Allow Plugin to update assessment value + */ + // Prepare Event Info + $event = new PluginEvent('afterSurveyQuestionAssessment'); + $event->set('surveyId', $surveyid); + $event->set('lang', $currentLanguage); + $event->set('gid', $field['gid']); + $event->set('qid', $field['qid']); + + if (array_key_exists('sqid', $field)) { + $event->set('sqid', $field['sqid']); + } - // Dispatch Event and Get new assessment value - App()->getPluginManager()->dispatchEvent($event); - $updatedAssessmentValue = $event->get('assessmentValue', $assessmentValue); + if (array_key_exists('aid', $field)) { + $event->set('aid', $field['aid']); + } - /** - * Save assessment value on the response - */ - $fieldmap[$field['fieldname']]['assessment_value'] = $updatedAssessmentValue; - $total = $total + $updatedAssessmentValue; + $event->set('assessmentValue', $assessmentValue); + if (isset($_SESSION['survey_'.$surveyid][$field['fieldname']])) { + $event->set('response', $_SESSION['survey_'.$surveyid][$field['fieldname']]); + } + // Dispatch Event and Get new assessment value + App()->getPluginManager()->dispatchEvent($event); + $updatedAssessmentValue = $event->get('assessmentValue', $assessmentValue); + + /** + * Save assessment value on the response + */ + $fieldmap[$field['fieldname']]['assessment_value'] = $updatedAssessmentValue; + $total = $total + $updatedAssessmentValue; + } + } + $assessment['total_score'] = $total; + if($onlyCurrent) { + return array( + 'show'=> false, + 'datas' => $assessment, + 'currentotal' => $total, + ); + } + /* count by group */ + $groups = array_unique($groups); + $subtotal = array(); + foreach ($groups as $group) { + $grouptotal = 0; + foreach ($fieldmap as $field) { + if ($field['gid'] == $group && isset($field['assessment_value'])) { + if (isset ($_SESSION['survey_'.$surveyid][$field['fieldname']])) { + $grouptotal = $grouptotal + $field['assessment_value']; } - - $i++; } - - $groups = array_unique($groups); - - foreach ($groups as $group) { - $grouptotal = 0; - - foreach ($fieldmap as $field) { - if ($field['gid'] == $group && isset($field['assessment_value'])) { - - if (isset ($_SESSION['survey_'.$surveyid][$field['fieldname']])) { - $grouptotal = $grouptotal + $field['assessment_value']; - } - } + } + $subtotal[$group] = $grouptotal; + } + + /* Get current assesment (can be only for last page …) */ + $aoAssessements = Assessment::model()->findAll(array( + 'condition' => "sid = :sid and language = :language", + 'order' => 'scope,id', // No real order in assessment, here : group first (why ?) and by creation + 'params' => array(':sid' => $surveyid,':language' => $currentLanguage) + )); + if(!empty($aoAssessements)) { + foreach ($aoAssessements as $oAssessement) { + if ($oAssessement->scope == "G") { + /* send only current valid assessments */ + if($oAssessement->minimum <= $subtotal[$oAssessement->gid] && $subtotal[$oAssessement->gid] <= $oAssessement->maximum) { + $assessment['group'][$oAssessement->gid][] = array( + "name" => $oAssessement->name, + "min" => $oAssessement->minimum, + "max" => $oAssessement->maximum, + "message" => $oAssessement->message + ); + } + } else { + /* send only current valid assessments */ + if($oAssessement->minimum <= $total && $total <= $oAssessement->maximum) { + $assessment['total']['show'] = true; + $assessment['total'][] = array( + "name" => $oAssessement->name, + "min" => $oAssessement->minimum, + "max" => $oAssessement->maximum, + "message" => $oAssessement->message + ); } - $subtotal[$group] = $grouptotal; } } - if (!empty($subtotal)) { + if (!empty($subtotal) && !empty($assessment['group'])) { $assessment['subtotal']['show'] = true; $assessment['subtotal']['datas'] = $subtotal; } - - $assessment['subtotal_score'] = (isset($subtotal)) ? $subtotal : ''; - $assessment['total_score'] = (isset($total)) ? $total : ''; - + $assessment['subtotal_score'] = $subtotal; + $assessment['total_score'] = $total; //$aDatas = array('total' => $total, 'assessment' => $assessment, 'subtotal' => $subtotal, ); - return array('show'=>($assessment['subtotal']['show'] || $assessment['total']['show']), 'datas' => $assessment); + + return array( + 'show'=>($assessment['subtotal']['show'] || $assessment['total']['show']), + 'datas' => $assessment, + 'currentotal' => $total, + ); } } diff --git a/application/helpers/replacements_helper.php b/application/helpers/replacements_helper.php index 8bda46cdc58..4bf5ddc2880 100755 --- a/application/helpers/replacements_helper.php +++ b/application/helpers/replacements_helper.php @@ -293,6 +293,10 @@ function templatereplace($line, $replacements = array(), &$redata = array(), $de // Set the array of replacement variables here - don't include curly braces $coreReplacements = array(); + if(isset($thissurvey['sid']) && !empty($_SESSION['survey_'.$thissurvey['sid']])) { + $coreReplacements = getStandardsReplacementFields($thissurvey); + } + $coreReplacements['ACTIVE'] = (isset($thissurvey['active']) && !($thissurvey['active'] != "Y")); $coreReplacements['ANSWERSCLEARED'] = gT("Answers cleared"); $coreReplacements['ASSESSMENT_HEADING'] = gT("Your assessment"); @@ -432,8 +436,8 @@ function getStandardsReplacementFields($thissurvey) $_assessment_current_total = ''; if (!empty($thissurvey['assessments']) && $thissurvey['assessments']=="Y") { - $assessmentdata = doAssessment($surveyid, true); - $_assessment_current_total = (!empty($assessmentdata['datas']['total_score']))?$assessmentdata['datas']['total_score']:gT("Unkown"); + $assessmentdata = doAssessment($surveyid); + $_assessment_current_total = (isset($assessmentdata['datas']['total_score']))?$assessmentdata['datas']['total_score']:gT("Unkown"); } diff --git a/application/views/admin/assessments/assessments_edit.php b/application/views/admin/assessments/assessments_edit.php index 6752a56076c..a3395ba79de 100644 --- a/application/views/admin/assessments/assessments_edit.php +++ b/application/views/admin/assessments/assessments_edit.php @@ -113,10 +113,10 @@
- - +
+ + +