Skip to content

Commit

Permalink
Merge branch 'master' of git@github.com:LimeSurvey/LimeSurvey.git int…
Browse files Browse the repository at this point in the history
…o develop

# Conflicts:
#	application/helpers/frontend_helper.php
  • Loading branch information
Shnoulle committed Nov 26, 2018
2 parents 00596cf + 04eb464 commit 6743dd9
Show file tree
Hide file tree
Showing 6 changed files with 170 additions and 149 deletions.
2 changes: 1 addition & 1 deletion application/helpers/SurveyRuntimeHelper.php
Expand Up @@ -1204,7 +1204,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('<p>', '</p>'), '', $this->aSurveyInfo['surveyls_endtext'])) == '') {
Expand Down
8 changes: 8 additions & 0 deletions application/helpers/expressions/em_manager_helper.php
Expand Up @@ -3683,6 +3683,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}");

Expand Down
262 changes: 138 additions & 124 deletions application/helpers/frontend_helper.php
Expand Up @@ -1522,10 +1522,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(
Expand All @@ -1536,147 +1537,160 @@ 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();
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;
$aAssessmentCount = Assessment::model()->count("sid=$surveyid and language='".$_SESSION['survey_'.$surveyid]['s_lang']."'");
if ($aAssessmentCount > 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']
);
} 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(Question::QT_1_ARRAY_MULTISCALE, Question::QT_F_ARRAY_FLEXIBLE_ROW, Question::QT_H_ARRAY_FLEXIBLE_COLUMN, Question::QT_Z_LIST_RADIO_FLEXIBLE, Question::QT_L_LIST_DROPDOWN, Question::QT_EXCLAMATION_LIST_DROPDOWN, Question::QT_M_MULTIPLE_CHOICE, Question::QT_O_LIST_WITH_COMMENT, Question::QT_P_MULTIPLE_CHOICE_WITH_COMMENTS))) {
$fieldmap[$field['fieldname']]['assessment_value'] = 0;
if (isset($_SESSION['survey_'.$surveyid][$field['fieldname']])) {
if (($field['type'] == Question::QT_M_MULTIPLE_CHOICE) || ($field['type'] == Question::QT_P_MULTIPLE_CHOICE_WITH_COMMENTS)) {
//Multiflexi choice - result is the assessment attribute value
{
if ($_SESSION['survey_'.$surveyid][$field['fieldname']] == "Y") {
// FIXME undefined function getQuestionAttributeValues
$aAttributes = getQuestionAttributeValues($field['qid']);
/* 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;
$assessmentValue = null;
if (in_array($field['type'], array('1', 'F', 'H', 'W', 'Z', 'L', '!', 'M', 'O', 'P'))) {
$fieldmap[$field['fieldname']]['assessment_value'] = 0;
if (!empty($_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'];
}
$assessmentValue = (int) $aAttributes['assessment_value'];
}
} else {
// Single choice question
$usrow = Answer::findByAttributes(['qid'=>$field['qid'], 'code'=>$_SESSION['survey_'.$surveyid][$field['fieldname']]]);
if (!empty($usrow)) {
$assessmentValue = $usrow->assessment_value;
// $total = $total+$usrow['assessment_value'];
}
} else {
// Single choice question
$oAssessementAnswer = Answer::model()->find(array(
'select' => 'code,assessment_value',
'condition' => 'qid = :qid and code = :code',
'params' => array(":qid" => $field['qid'], ":code" => $_SESSION['survey_'.$surveyid][$field['fieldname']])
));
if ($oAssessementAnswer) {
$assessmentValue = $oAssessementAnswer->assessment_value;
}

$fieldmap[$field['fieldname']]['assessment_value'] = $assessmentValue;
}
$groups[] = $field['gid'];
$fieldmap[$field['fieldname']]['assessment_value'] = $assessmentValue;
}
$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', $currentLanguage);
$event->set('gid', $field['gid']);
$event->set('qid', $field['qid']);

if (array_key_exists('sqid', $field)) {
$event->set('sqid', $field['sqid']);
}

// 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);
if (array_key_exists('aid', $field)) {
$event->set('aid', $field['aid']);
}

if (isset($_SESSION['survey_'.$surveyid][$field['fieldname']])) {
$event->set('response', $_SESSION['survey_'.$surveyid][$field['fieldname']]);
$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'];
}

// 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;
}

$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;
}
}
$assessment['subtotal']['show'] = false;

if (isset($subtotal) && is_array($subtotal)) {
$assessment['subtotal']['show'] = true;
$assessment['subtotal']['datas'] = $subtotal;
}

$assessment['total']['show'] = false;
if (isset($assessment['total'])) {
$assessment['total']['show'] = true;
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,
);
}


Expand Down
8 changes: 6 additions & 2 deletions application/helpers/replacements_helper.php
Expand Up @@ -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");
Expand Down Expand Up @@ -431,8 +435,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");
}


Expand Down
31 changes: 13 additions & 18 deletions application/models/Question.php
Expand Up @@ -130,24 +130,19 @@ public function relations()
public function rules()
{
$aRules = array(
array('title', 'required', 'on' => 'update, insert', 'message'=>gT('The question code is mandatory.', 'unescaped')),
array('title', 'length', 'min' => 1, 'max'=>20, 'on' => 'update, insert'),
array('qid,sid,gid,parent_qid', 'numerical', 'integerOnly'=>true),
array('qid', 'unique', 'criteria'=>array(
'condition'=>'language=:language',
'params'=>array(':language'=>$this->language)
),
'message'=>sprintf(gT("Question id (qid) : '%s' is already in use."),$this->qid),// Usage of {attribute} need attributeLabels, {value} never exist in message
),
array('other', 'in', 'range'=>array('Y', 'N'), 'allowEmpty'=>true),
array('mandatory', 'in', 'range'=>array('Y', 'N'), 'allowEmpty'=>true),
array('question_order', 'numerical', 'integerOnly'=>true, 'allowEmpty'=>true),
array('scale_id', 'numerical', 'integerOnly'=>true, 'allowEmpty'=>true),
array('same_default', 'numerical', 'integerOnly'=>true, 'allowEmpty'=>true),
array('type', 'length', 'min' => 1, 'max'=>1),
array('preg,relevance', 'safe'),
array('modulename', 'length', 'max'=>255),
);
array('title', 'required', 'on' => 'update, insert', 'message'=>gT('The question code is mandatory.', 'unescaped')),
array('title', 'length', 'min' => 1, 'max'=>20, 'on' => 'update, insert'),
array('qid,sid,gid,parent_qid', 'numerical', 'integerOnly'=>true),
array('qid', 'unique','message'=>sprintf(gT("Question id (qid) : '%s' is already in use."),$this->qid)),// Still needed ?
array('other', 'in', 'range'=>array('Y', 'N'), 'allowEmpty'=>true),
array('mandatory', 'in', 'range'=>array('Y', 'N'), 'allowEmpty'=>true),
array('question_order', 'numerical', 'integerOnly'=>true, 'allowEmpty'=>true),
array('scale_id', 'numerical', 'integerOnly'=>true, 'allowEmpty'=>true),
array('same_default', 'numerical', 'integerOnly'=>true, 'allowEmpty'=>true),
array('type', 'length', 'min' => 1, 'max'=>1),
array('preg,relevance', 'safe'),
array('modulename', 'length', 'max'=>255),
);
// Always enforce unicity on Sub question code (DB issue).
if ($this->parent_qid) {
$aRules[] = array('title', 'unique', 'caseSensitive'=>false,
Expand Down
8 changes: 4 additions & 4 deletions application/views/admin/assessments/assessments_edit.php
Expand Up @@ -113,10 +113,10 @@
<label class='control-label col-sm-12' for='assessmentmessage_<?=$assessmentlang?>'>
<?php eT("Message");?>:</label>
<div class='col-sm-12'>
<textarea name='assessmentmessage_<?=$assessmentlang?>' id='assessmentmessage_<?=$assessmentlang?>' rows='10' style="width:100%">
<?php echo $message;?>
</textarea>
<?php echo getEditor("assessment-text","assessmentmessage_".$assessmentlang, "[".gT("Message:", "js")."]",$surveyid,$gid,null,$action); ?>
<div class="htmleditor input-group">
<textarea name='assessmentmessage_<?=$assessmentlang?>' class="form-control" id='assessmentmessage_<?=$assessmentlang?>' rows='10' ><?php echo $message;?></textarea>
<?php echo getEditor("assessment-text","assessmentmessage_".$assessmentlang, "[".gT("Message:", "js")."]",$surveyid,$gid,null,$action); ?>
</div>
</div>
</div>
<div class='form-group'>
Expand Down

0 comments on commit 6743dd9

Please sign in to comment.