Skip to content

Commit

Permalink
Fixed issue #11682: Possible illegal string offset with some attribute
Browse files Browse the repository at this point in the history
New feature #11683: i18n for EM validations tip
Dev: without loosing old value
Dev: fix extra value when save question, todo : add it to checkintegrity
  • Loading branch information
Shnoulle committed Oct 5, 2016
1 parent 9595bba commit 305cb4c
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 30 deletions.
11 changes: 9 additions & 2 deletions application/controllers/admin/database.php
Expand Up @@ -783,11 +783,19 @@ function index($sa = null)
}
QuestionAttribute::model()->deleteAll($criteria);
$aLanguages=array_merge(array(Survey::model()->findByPk($iSurveyID)->language),Survey::model()->findByPk($iSurveyID)->additionalLanguages);

foreach ($validAttributes as $validAttribute)
{
if ($validAttribute['i18n'])
{
/* Delete invalid language : not needed but cleaner */
$langCriteria = new CDbCriteria;
$langCriteria->compare('qid',$iQuestionID);
$langCriteria->compare('attribute',$validAttribute['name']);
$langCriteria->addNotInCondition('language',$aLanguages);
QuestionAttribute::model()->deleteAll($langCriteria);
/* But not in don't work for null value in mysql ? */
QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid AND language IS NULL',array(':attribute'=>$validAttribute['name'], ':qid'=>$iQuestionID));

foreach ($aLanguages as $sLanguage)
{// TODO sanitise XSS
$value=Yii::app()->request->getPost($validAttribute['name'].'_'.$sLanguage);
Expand Down Expand Up @@ -846,7 +854,6 @@ function index($sa = null)
}
}


$aQuestionTypeList=getQuestionTypeList('','array');
// These are the questions types that have no answers and therefore we delete the answer in that case
$iAnswerScales = $aQuestionTypeList[$sQuestionType]['answerscales'];
Expand Down
2 changes: 2 additions & 0 deletions application/helpers/questionHelper.php
Expand Up @@ -270,6 +270,7 @@ public static function getAttributesDefinitions()
'category'=>gT('Logic'),
'sortorder'=>210,
'inputtype'=>'textarea',
'i18n'=>true,
"help"=>gT('This is a hint text that will be shown to the participant describing the question validation equation.'),
"caption"=>gT('Question validation tip'));

Expand All @@ -286,6 +287,7 @@ public static function getAttributesDefinitions()
'category'=>gT('Logic'),
'sortorder'=>230,
'inputtype'=>'textarea',
'i18n'=>true,
"help"=>gT('This is a tip shown to the participant describing the sub-question validation equation.'),
"caption"=>gT('Sub-question validation tip'));

Expand Down
11 changes: 1 addition & 10 deletions application/models/Question.php
Expand Up @@ -224,16 +224,7 @@ public function getAdvancedSettingsWithValues($iQuestionID, $sQuestionType, $iSu

if ($iQuestionID)
{
$oAttributeValues = QuestionAttribute::model()->findAll("qid=:qid",array('qid'=>$iQuestionID));
$aAttributeValues=array();
foreach($oAttributeValues as $oAttributeValue)
{
if($oAttributeValue->language){
$aAttributeValues[$oAttributeValue->attribute][$oAttributeValue->language]=$oAttributeValue->value;
}else{
$aAttributeValues[$oAttributeValue->attribute]=$oAttributeValue->value;
}
}
$aAttributeValues=QuestionAttribute::model()->getQuestionAttributes($iQuestionID);
}
$aAttributeNames = \ls\helpers\questionHelper::getQuestionAttributesSettings($sQuestionType);
uasort($aAttributeNames, 'categorySort');
Expand Down
29 changes: 11 additions & 18 deletions application/models/QuestionAttribute.php
Expand Up @@ -193,26 +193,20 @@ public function getQuestionAttributes($iQuestionID)
}

$aAttributeNames = \ls\helpers\questionHelper::getQuestionAttributesSettings($sType);
$oAttributeValues = QuestionAttribute::model()->findAll("qid=:qid",array('qid'=>$iQuestionID));
$aAttributeValues=array();
foreach($oAttributeValues as $oAttributeValue)
{
if($oAttributeValue->language){
$aAttributeValues[$oAttributeValue->attribute][$oAttributeValue->language]=$oAttributeValue->value;
}else{
$aAttributeValues[$oAttributeValue->attribute]=$oAttributeValue->value;
}
}

// Fill with aQuestionAttributes with default attribute or with aAttributeValues
// Can not use array_replace due to i18n
foreach($aAttributeNames as $aAttribute)
{
$oAttributeNameValues = QuestionAttribute::model()->findAll("qid=:qid and attribute=:attribute",array(':qid'=>$iQuestionID,':attribute'=>$aAttribute['name']));
/* listData do an array with key language : get really all value : null key is set to empty string */
/* this allow to set an attribute to i18n without loose old value */
$aAttributeNameValues=CHtml::listData($oAttributeNameValues,'language','value');
if ($aAttribute['i18n'] == false)
{
if(isset($aAttributeValues[$aAttribute['name']]))
if(isset($aAttributeNameValues['']))
{
$aQuestionAttributes[$aAttribute['name']]=$aAttributeValues[$aAttribute['name']];
$aQuestionAttributes[$aAttribute['name']]=$aAttributeNameValues[''];
}
else
{
Expand All @@ -223,12 +217,11 @@ public function getQuestionAttributes($iQuestionID)
{
foreach ($aLanguages as $sLanguage)
{
if (isset($aAttributeValues[$aAttribute['name']][$sLanguage]))
{
$aQuestionAttributes[$aAttribute['name']][$sLanguage] = $aAttributeValues[$aAttribute['name']][$sLanguage];
}
else
{
if (isset($aAttributeNameValues[$sLanguage])){
$aQuestionAttributes[$aAttribute['name']][$sLanguage] = $aAttributeNameValues[$sLanguage];
}elseif(isset($aAttributeNameValues[''])){
$aQuestionAttributes[$aAttribute['name']][$sLanguage] = $aAttributeNameValues[''];
}else{
$aQuestionAttributes[$aAttribute['name']][$sLanguage] = $aAttribute['default'];
}
}
Expand Down

0 comments on commit 305cb4c

Please sign in to comment.