From f91e215b46a64e9fb00232c4b9d9497078323c6a Mon Sep 17 00:00:00 2001 From: Carsten Schmitz Date: Sat, 13 Sep 2014 01:02:17 +0200 Subject: [PATCH] DEv Reverted from commit 751fd198a75345e093406510b409bbc6de54a7c2) --- application/helpers/common_helper.php | 377 ++++++++++++++++++++------ 1 file changed, 297 insertions(+), 80 deletions(-) diff --git a/application/helpers/common_helper.php b/application/helpers/common_helper.php index cbfc3f5a3af..f03a8816a1f 100644 --- a/application/helpers/common_helper.php +++ b/application/helpers/common_helper.php @@ -12,6 +12,22 @@ */ Yii::import('application.helpers.sanitize_helper', true); +/** +* Simple function to sort the permissions by title +* +* @param mixed $aPermissionA Permission A to compare +* @param mixed $aPermissionB Permission B to compare +*/ +function comparePermission($aPermissionA,$aPermissionB) +{ + if($aPermissionA['title'] >$aPermissionB['title']) { + return 1; + } + else { + return -1; + } +} + /** * Translation helper function. * @param string $string @@ -35,14 +51,6 @@ function eT($string, $escapemode = 'html') echo gT($string, $escapemode); } -function ngT($single, $plural, $number) -{ - // Temporary fix for old translation styles. - $s = Yii::t('', $single); - $p = Yii::t('', $plural); - return Yii::t('', "$single|$plural", $number); -} - /** * getQuestionTypeList() Returns list of question types available in LimeSurvey. Edit this if you are adding a new * question type @@ -52,12 +60,203 @@ function ngT($single, $plural, $number) * * @return depending on $ReturnType param, returns a straight "array" of question types, or an list * +* Explanation of questiontype array: +* +* description : Question description +* subquestions : 0= Does not support subquestions x=Number of subquestion scales +* answerscales : 0= Does not need answers x=Number of answer scales (usually 1, but e.g. for dual scale question set to 2) +* assessable : 0=Does not support assessment values when editing answerd 1=Support assessment values */ function getQuestionTypeList($SelectedCode = "T", $ReturnType = "selector") { $publicurl = Yii::app()->getConfig('publicurl'); - - $qtypes = Question::typeList(); + $clang = Yii::app()->lang; + + $group['Arrays'] = $clang->gT('Arrays'); + $group['MaskQuestions'] = $clang->gT("Mask questions"); + $group['SinChoiceQues'] = $clang->gT("Single choice questions"); + $group['MulChoiceQues'] = $clang->gT("Multiple choice questions"); + $group['TextQuestions'] = $clang->gT("Text questions"); + + + $qtypes = array( + "1" => array('description' => $clang->gT("Array dual scale"), + 'group' => $group['Arrays'], + 'subquestions' => 1, + 'assessable' => 1, + 'hasdefaultvalues' => 0, + 'answerscales' => 2), + "5" => array('description' => $clang->gT("5 Point Choice"), + 'group' => $group['SinChoiceQues'], + 'subquestions' => 0, + 'hasdefaultvalues' => 0, + 'assessable' => 0, + 'answerscales' => 0), + "A" => array('description' => $clang->gT("Array (5 Point Choice)"), + 'group' => $group['Arrays'], + 'subquestions' => 1, + 'hasdefaultvalues' => 0, + 'assessable' => 1, + 'answerscales' => 0), + "B" => array('description' => $clang->gT("Array (10 Point Choice)"), + 'group' => $group['Arrays'], + 'subquestions' => 1, + 'hasdefaultvalues' => 0, + 'assessable' => 1, + 'answerscales' => 0), + "C" => array('description' => $clang->gT("Array (Yes/No/Uncertain)"), + 'group' => $group['Arrays'], + 'subquestions' => 1, + 'hasdefaultvalues' => 0, + 'assessable' => 1, + 'answerscales' => 0), + "D" => array('description' => $clang->gT("Date/Time"), + 'group' => $group['MaskQuestions'], + 'subquestions' => 0, + 'hasdefaultvalues' => 1, + 'assessable' => 0, + 'answerscales' => 0), + "E" => array('description' => $clang->gT("Array (Increase/Same/Decrease)"), + 'group' => $group['Arrays'], + 'subquestions' => 1, + 'hasdefaultvalues' => 0, + 'assessable' => 1, + 'answerscales' => 0), + "F" => array('description' => $clang->gT("Array"), + 'group' => $group['Arrays'], + 'subquestions' => 1, + 'hasdefaultvalues' => 0, + 'assessable' => 1, + 'answerscales' => 1), + "G" => array('description' => $clang->gT("Gender"), + 'group' => $group['MaskQuestions'], + 'subquestions' => 0, + 'hasdefaultvalues' => 0, + 'assessable' => 0, + 'answerscales' => 0), + "H" => array('description' => $clang->gT("Array by column"), + 'group' => $group['Arrays'], + 'hasdefaultvalues' => 0, + 'subquestions' => 1, + 'assessable' => 1, + 'answerscales' => 1), + "I" => array('description' => $clang->gT("Language Switch"), + 'group' => $group['MaskQuestions'], + 'hasdefaultvalues' => 0, + 'subquestions' => 0, + 'assessable' => 0, + 'answerscales' => 0), + "K" => array('description' => $clang->gT("Multiple Numerical Input"), + 'group' => $group['MaskQuestions'], + 'hasdefaultvalues' => 1, + 'subquestions' => 1, + 'assessable' => 1, + 'answerscales' => 0), + "L" => array('description' => $clang->gT("List (Radio)"), + 'group' => $group['SinChoiceQues'], + 'subquestions' => 0, + 'hasdefaultvalues' => 1, + 'assessable' => 1, + 'answerscales' => 1), + "M" => array('description' => $clang->gT("Multiple choice"), + 'group' => $group['MulChoiceQues'], + 'subquestions' => 1, + 'hasdefaultvalues' => 1, + 'assessable' => 1, + 'answerscales' => 0), + "N" => array('description' => $clang->gT("Numerical Input"), + 'group' => $group['MaskQuestions'], + 'subquestions' => 0, + 'hasdefaultvalues' => 1, + 'assessable' => 0, + 'answerscales' => 0), + "O" => array('description' => $clang->gT("List with comment"), + 'group' => $group['SinChoiceQues'], + 'subquestions' => 0, + 'hasdefaultvalues' => 1, + 'assessable' => 1, + 'answerscales' => 1), + "P" => array('description' => $clang->gT("Multiple choice with comments"), + 'group' => $group['MulChoiceQues'], + 'subquestions' => 1, + 'hasdefaultvalues' => 1, + 'assessable' => 1, + 'answerscales' => 0), + "Q" => array('description' => $clang->gT("Multiple Short Text"), + 'group' => $group['TextQuestions'], + 'subquestions' => 1, + 'hasdefaultvalues' => 1, + 'assessable' => 0, + 'answerscales' => 0), + "R" => array('description' => $clang->gT("Ranking"), + 'group' => $group['MaskQuestions'], + 'subquestions' => 0, + 'hasdefaultvalues' => 0, + 'assessable' => 1, + 'answerscales' => 1), + "S" => array('description' => $clang->gT("Short Free Text"), + 'group' => $group['TextQuestions'], + 'subquestions' => 0, + 'hasdefaultvalues' => 1, + 'assessable' => 0, + 'answerscales' => 0), + "T" => array('description' => $clang->gT("Long Free Text"), + 'group' => $group['TextQuestions'], + 'subquestions' => 0, + 'hasdefaultvalues' => 1, + 'assessable' => 0, + 'answerscales' => 0), + "U" => array('description' => $clang->gT("Huge Free Text"), + 'group' => $group['TextQuestions'], + 'subquestions' => 0, + 'hasdefaultvalues' => 1, + 'assessable' => 0, + 'answerscales' => 0), + "X" => array('description' => $clang->gT("Text display"), + 'group' => $group['MaskQuestions'], + 'subquestions' => 0, + 'hasdefaultvalues' => 0, + 'assessable' => 0, + 'answerscales' => 0), + "Y" => array('description' => $clang->gT("Yes/No"), + 'group' => $group['MaskQuestions'], + 'subquestions' => 0, + 'hasdefaultvalues' => 0, + 'assessable' => 0, + 'answerscales' => 0), + "!" => array('description' => $clang->gT("List (Dropdown)"), + 'group' => $group['SinChoiceQues'], + 'subquestions' => 0, + 'hasdefaultvalues' => 1, + 'assessable' => 1, + 'answerscales' => 1), + ":" => array('description' => $clang->gT("Array (Numbers)"), + 'group' => $group['Arrays'], + 'subquestions' => 2, + 'hasdefaultvalues' => 0, + 'assessable' => 1, + 'answerscales' => 0), + ";" => array('description' => $clang->gT("Array (Texts)"), + 'group' => $group['Arrays'], + 'subquestions' => 2, + 'hasdefaultvalues' => 0, + 'assessable' => 0, + 'answerscales' => 0), + "|" => array('description' => $clang->gT("File upload"), + 'group' => $group['MaskQuestions'], + 'subquestions' => 0, + 'hasdefaultvalues' => 0, + 'assessable' => 0, + 'answerscales' => 0), + "*" => array('description' => $clang->gT("Equation"), + 'group' => $group['MaskQuestions'], + 'subquestions' => 0, + 'hasdefaultvalues' => 0, + 'assessable' => 0, + 'answerscales' => 0), + ); + asort($qtypes); + if ($ReturnType == "array") return $qtypes; @@ -1559,7 +1758,9 @@ function getExtendedAnswer($iSurveyID, $sFieldCode, $sValue, $oLanguage) } break; case "|": //File upload - if (substr($sFieldCode, -9) != 'filecount') { + if (substr($sFieldCode, -9) == 'filecount') { + $this_answer = $oLanguage->gT("File count"); + } else { //Show the filename, size, title and comment -- no link! $files = json_decode($sValue); $sValue = ''; @@ -2591,8 +2792,8 @@ function createTimingsFieldMap($surveyid, $style='full', $force_refresh=false, $ $clang = new Limesurvey_lang($sLanguage); //checks to see if fieldmap has already been built for this page. - if (isset($timingsFieldMap[$surveyid][$style][App()->language]) && $force_refresh==false) { - return $timingsFieldMap[$surveyid][$style][App()->language]; + if (isset($timingsFieldMap[$surveyid][$style][$clang->langcode]) && $force_refresh==false) { + return $timingsFieldMap[$surveyid][$style][$clang->langcode]; } //do something @@ -2616,8 +2817,8 @@ function createTimingsFieldMap($surveyid, $style='full', $force_refresh=false, $ } } - $timingsFieldMap[$surveyid][$style][App()->language] = $fieldmap; - return $timingsFieldMap[$surveyid][$style][App()->language]; + $timingsFieldMap[$surveyid][$style][$clang->langcode] = $fieldmap; + return $timingsFieldMap[$surveyid][$style][$clang->langcode]; } /** @@ -4010,7 +4211,7 @@ function questionAttributes($returnByName=false) 'category'=>$clang->gT('Other'), 'sortorder'=>134, "inputtype"=>"text", - 'default'=>"png, gif, jpg, doc, odt", + 'default'=>"png, gif, doc, odt", "help"=>$clang->gT("Allowed file types in comma separated format. e.g. pdf,doc,odt"), "caption"=>$clang->gT("Allowed file types")); @@ -4076,6 +4277,14 @@ function categorySort($a, $b) return $result; } +// make sure the given string (which comes from a POST or GET variable) +// is safe to use in MySQL. This does nothing if gpc_magic_quotes is on. +function autoEscape($str) { + if (!get_magic_quotes_gpc()) { + return addslashes ($str); + } + return $str; +} // the opposite of the above: takes a POST or GET variable which may or // may not have been 'auto-quoted', and return the *unquoted* version. @@ -4611,6 +4820,13 @@ function CSVEscape($sString) return '"' . str_replace('"','""', $sString) . '"'; } +function convertCSVRowToArray($string, $separator, $quotechar) +{ + $fields=preg_split('/' . $separator . '(?=([^"]*"[^"]*")*(?![^"]*"))/',trim($string)); + $fields=array_map('CSVUnquote',$fields); + return $fields; +} + function createPassword() { $aCharacters = "ABCDEGHJIKLMNOPQURSTUVWXYZabcdefhjmnpqrstuvwxyz23456789"; @@ -5385,8 +5601,8 @@ function getUpdateInfo() { setGlobalSetting('SessionName',randomChars(64,'ABCDEFGHIJKLMNOPQRSTUVWXYZ!"$%&/()=?`+*~#",;.:abcdefghijklmnopqrstuvwxyz123456789')); } - require_once(APPPATH.'/third_party/http/http.php'); - $http=new http_class; + Yii::import('application.libraries.admin.http.httpRequestIt'); + $http=new httpRequestIt; $http->timeout=0; $http->data_timeout=0; @@ -5670,10 +5886,10 @@ function getQuotaCompletedCount($iSurveyId, $quotaid) $result = "N/A"; if(!tableExists("survey_{$iSurveyId}")) // Yii::app()->db->schema->getTable('{{survey_' . $iSurveyId . '}}' are not updated even after Yii::app()->db->schema->refresh(); return $result; - $aColumnName=SurveyDynamic::model($iSurveyId)->getTableSchema()->getColumnNames(); $quota_info = getQuotaInformation($iSurveyId, Survey::model()->findByPk($iSurveyId)->language, $quotaid); $quota = $quota_info[0]; - if (count($quota['members']) > 0) // Existence of table already tested + if (Yii::app()->db->schema->getTable('{{survey_' . $iSurveyId . '}}') && + count($quota['members']) > 0) { // Keep a list of fields for easy reference $fields_list = array(); @@ -5683,30 +5899,25 @@ function getQuotaCompletedCount($iSurveyId, $quotaid) foreach ($quota['members'] as $member) { - if(in_array($member['fieldname'],$aColumnName)) - $fields_list[$member['fieldname']][] = $member['value']; - else - return $result;// We return N/A even for activated survey - } + $criteria = new CDbCriteria; - $criteria = new CDbCriteria; - $criteria->condition="submitdate IS NOT NULL"; - $aParams=array(); - foreach ($fields_list as $fieldname=>$aValue) - { - if(count($aValue)==1) + foreach ($member['fieldnames'] as $fieldname) { - $criteria->addCondition("{$fieldname} = :{$fieldname}"); - $aParams[":{$fieldname}"]=$aValue[0]; - } - else - { - $criteria->addInCondition($fieldname,$aValue); // NO need params : addInCondition bind automatically + if (!in_array($fieldname, $fields_list)) + $fields_list[] = $fieldname; + + // Yii does not quote column names (duh!) so we have to do it. + $criteria->addColumnCondition(array(Yii::app()->db->quoteColumnName($fieldname) => $member['value']), 'OR'); } - // We can use directly addInCondition, but don't know what is speediest. + + $fields_query[$fieldname] = $criteria; } - if(!empty($aParams)) - $criteria->params=$aParams; + + $criteria = new CDbCriteria; + + foreach ($fields_list as $fieldname) + $criteria->mergeWith($fields_query[$fieldname]); + $criteria->mergeWith(array('condition'=>"submitdate IS NOT NULL")); $result = SurveyDynamic::model($iSurveyId)->count($criteria); } @@ -5827,10 +6038,10 @@ function includeKeypad() $clang = Yii::app()->lang; Yii::app()->getClientScript()->registerScriptFile(Yii::app()->getConfig('third_party').'jquery-keypad/jquery.keypad.min.js'); - $localefile = Yii::app()->getConfig('rootdir').'/third_party/jquery-keypad/jquery.keypad-'.App()->language.'.js'; - if (App()->language != 'en' && file_exists($localefile)) + $localefile = Yii::app()->getConfig('rootdir').'/third_party/jquery-keypad/jquery.keypad-'.$clang->langcode.'.js'; + if ($clang->langcode != 'en' && file_exists($localefile)) { - Yii::app()->getClientScript()->registerScriptFile(Yii::app()->getConfig('third_party').'jquery-keypad/jquery.keypad-'.App()->language.'.js'); + Yii::app()->getClientScript()->registerScriptFile(Yii::app()->getConfig('third_party').'jquery-keypad/jquery.keypad-'.$clang->langcode.'.js'); } Yii::app()->getClientScript()->registerCssFile(Yii::app()->getConfig('third_party') . "jquery-keypad/jquery.keypad.alt.css"); } @@ -5845,6 +6056,7 @@ function includeKeypad() function getQuotaInformation($surveyid,$language,$iQuotaID='all') { Yii::log('getQuotaInformation'); + global $clienttoken; $baselang = Survey::model()->findByPk($surveyid)->language; $aAttributes=array('sid' => $surveyid); if ($iQuotaID != 'all') @@ -5867,8 +6079,18 @@ function getQuotaInformation($surveyid,$language,$iQuotaID='all') foreach ($result as $_survey_quotas) { $survey_quotas = array_merge($_survey_quotas->attributes,$_survey_quotas->languagesettings[0]->attributes);// We have only one language, then we can use first only + // !!! Doubting this +# foreach ($_survey_quotas->defaultlanguage as $k => $v) +# $survey_quotas[$k] = $v; + + array_push($quota_info,array('Name' => $survey_quotas['name'], + 'Limit' => $survey_quotas['qlimit'], + 'Action' => $survey_quotas['action'], + 'Message' => $survey_quotas['quotals_message'], + 'Url' => $survey_quotas['quotals_url'], + 'UrlDescrip' => $survey_quotas['quotals_urldescrip'], + 'AutoloadUrl' => $survey_quotas['autoload_url'])); - array_push($quota_info,$survey_quotas); $result_qe = QuotaMember::model()->findAllByAttributes(array('quota_id'=>$survey_quotas['id'])); $quota_info[$x]['members'] = array(); if (count($result_qe) > 0) @@ -5876,47 +6098,42 @@ function getQuotaInformation($surveyid,$language,$iQuotaID='all') foreach ($result_qe as $quota_entry) { $quota_entry = $quota_entry->attributes; - $oMemberQuestion=Question::model()->findByAttributes(array('qid'=>$quota_entry['qid'], 'language'=>$baselang)); - if($oMemberQuestion) - { - $fieldname = "0"; + $result_quest=Question::model()->findByAttributes(array('qid'=>$quota_entry['qid'], 'language'=>$baselang)); + $qtype=$result_quest->attributes; - if ($oMemberQuestion->type == "I" || $oMemberQuestion->type == "G" || $oMemberQuestion->type == "Y") - { - $fieldname= $surveyid.'X'.$oMemberQuestion->gid.'X'.$quota_entry['qid']; - $value = $quota_entry['code']; - } + $fieldnames = "0"; - if($oMemberQuestion->type == "L" || $oMemberQuestion->type == "O" || $oMemberQuestion->type =="!") - { - $fieldname=$surveyid.'X'.$oMemberQuestion->gid.'X'.$quota_entry['qid']; - $value = $quota_entry['code']; - } + if ($qtype['type'] == "I" || $qtype['type'] == "G" || $qtype['type'] == "Y") + { + $fieldnames=array(0 => $surveyid.'X'.$qtype['gid'].'X'.$quota_entry['qid']); + $value = $quota_entry['code']; + } - if($oMemberQuestion->type == "M") - { - // Need to remove invalid $quota_entry['code'] - $fieldname=$surveyid.'X'.$oMemberQuestion->gid.'X'.$quota_entry['qid'].$quota_entry['code']; - $value = "Y"; - } + if($qtype['type'] == "L" || $qtype['type'] == "O" || $qtype['type'] =="!") + { + $fieldnames=array(0 => $surveyid.'X'.$qtype['gid'].'X'.$quota_entry['qid']); + $value = $quota_entry['code']; + } - if($oMemberQuestion->type == "A" || $oMemberQuestion->type == "B") - { - $temp = explode('-',$quota_entry['code']); - $fieldname=$surveyid.'X'.$oMemberQuestion->gid.'X'.$quota_entry['qid'].$temp[0]; - $value = $temp[1]; - } + if($qtype['type'] == "M") + { + $fieldnames=array(0 => $surveyid.'X'.$qtype['gid'].'X'.$quota_entry['qid'].$quota_entry['code']); + $value = "Y"; + } - array_push($quota_info[$x]['members'],array( - 'Title' => $oMemberQuestion->title, - 'type' => $oMemberQuestion->type, - 'code' => $quota_entry['code'], - 'value' => $value, - 'qid' => $quota_entry['qid'], - 'fieldname' => $fieldname - ) - ); + if($qtype['type'] == "A" || $qtype['type'] == "B") + { + $temp = explode('-',$quota_entry['code']); + $fieldnames=array(0 => $surveyid.'X'.$qtype['gid'].'X'.$quota_entry['qid'].$temp[0]); + $value = $temp[1]; } + + array_push($quota_info[$x]['members'],array('Title' => $qtype['title'], + 'type' => $qtype['type'], + 'code' => $quota_entry['code'], + 'value' => $value, + 'qid' => $quota_entry['qid'], + 'fieldnames' => $fieldnames)); } } $x++; @@ -7284,7 +7501,7 @@ function doesImportArraySupportLanguage($csvarray,$idkeysarray,$langfieldnum,$l foreach ($csvarray as $csvrow) { - $rowcontents = str_getcsv($csvrow,',','"'); + $rowcontents = convertCSVRowToArray($csvrow,',','"'); $rowid = ""; foreach ($idkeysarray as $idfieldnum) {