/** * This function generates an array containing the fieldcode, and matching data in the same order as the activate script * * @param string $surveyId The Survey ID * @param mixed $style 'short' (default) or 'full' - full creates extra information like default values * @param mixed $force_refresh - Forces to really refresh the array, not just take the session copy * @param int $questionid Limit to a certain qid only (for question preview) - default is false * @return array */ public static function createFieldMap(LimeSurvey $survey, $style = 'short', $force_refresh = false, $questionid = false, $sQuestionLanguage = null) { // global $dbprefix, $connect, $globalfieldmap, $clang, $aDuplicateQIDs; // $surveyid=sanitize_int($surveyid); //checks to see if fieldmap has already been built for this page. // if (isset(static::$globalfieldmap[$survey->sid][$style]['ru']) && $force_refresh==false) { // return static::$globalfieldmap[$survey->sid][$style]['ru']; // } $fieldmap["id"] = array("fieldname" => "id", 'sid' => $survey->sid, 'type' => "id", "gid" => "", "qid" => "", "aid" => ""); if ($style == "full") { $fieldmap["id"]['title'] = ""; $fieldmap["id"]['question'] = "ID"; //"Response ID"; $fieldmap["id"]['group_name'] = ""; } $fieldmap["submitdate"] = array("fieldname" => "submitdate", 'type' => "submitdate", 'sid' => $survey->sid, "gid" => "", "qid" => "", "aid" => ""); if ($style == "full") { $fieldmap["submitdate"]['title'] = ""; $fieldmap["submitdate"]['question'] = "Дата завершения"; //"Date submitted"; $fieldmap["submitdate"]['group_name'] = ""; } $fieldmap["lastpage"] = array("fieldname" => "lastpage", 'sid' => $survey->sid, 'type' => "lastpage", "gid" => "", "qid" => "", "aid" => ""); if ($style == "full") { $fieldmap["lastpage"]['title'] = ""; $fieldmap["lastpage"]['question'] = "Последняя страница"; //"Last page"; $fieldmap["lastpage"]['group_name'] = ""; } $fieldmap["startlanguage"] = array("fieldname" => "startlanguage", 'sid' => $survey->sid, 'type' => "startlanguage", "gid" => "", "qid" => "", "aid" => ""); if ($style == "full") { $fieldmap["startlanguage"]['title'] = ""; $fieldmap["startlanguage"]['question'] = "Язык"; //"Start language"; $fieldmap["startlanguage"]['group_name'] = ""; } //Check for any additional fields for this survey and create necessary fields (token and datestamp and ipaddr) $pquery = "SELECT anonymized, datestamp, ipaddr, refurl FROM {$survey->tableName()} WHERE sid={$survey->sid}"; $presult = $survey->getDbConnection()->createCommand($pquery)->queryAll(); //Checked foreach ($presult as $prow) { if ($prow['anonymized'] == "N") { $fieldmap["token"] = array("fieldname" => "token", 'sid' => $survey->sid, 'type' => "token", "gid" => "", "qid" => "", "aid" => ""); if ($style == "full") { $fieldmap["token"]['title'] = ""; $fieldmap["token"]['question'] = "Token"; //"Token"; $fieldmap["token"]['group_name'] = ""; } } if ($prow['datestamp'] == "Y") { $fieldmap["datestamp"] = array("fieldname" => "datestamp", 'type' => "datestamp", 'sid' => $survey->sid, "gid" => "", "qid" => "", "aid" => ""); if ($style == "full") { $fieldmap["datestamp"]['title'] = ""; $fieldmap["datestamp"]['question'] = "Дата последнего действия"; //"Date last action"; $fieldmap["datestamp"]['group_name'] = ""; } $fieldmap["startdate"] = array("fieldname" => "startdate", 'type' => "startdate", 'sid' => $survey->sid, "gid" => "", "qid" => "", "aid" => ""); if ($style == "full") { $fieldmap["startdate"]['title'] = ""; $fieldmap["startdate"]['question'] = "Дата начала"; //"Date started"; $fieldmap["startdate"]['group_name'] = ""; } } if ($prow['ipaddr'] == "Y") { $fieldmap["ipaddr"] = array("fieldname" => "ipaddr", 'type' => "ipaddress", 'sid' => $survey->sid, "gid" => "", "qid" => "", "aid" => ""); if ($style == "full") { $fieldmap["ipaddr"]['title'] = ""; $fieldmap["ipaddr"]['question'] = "IP"; //"IP address"; $fieldmap["ipaddr"]['group_name'] = ""; } } // Add 'refurl' to fieldmap. if ($prow['refurl'] == "Y") { $fieldmap["refurl"] = array("fieldname" => "refurl", 'type' => "url", 'sid' => $survey->sid, "gid" => "", "qid" => "", "aid" => ""); if ($style == "full") { $fieldmap["refurl"]['title'] = ""; $fieldmap["refurl"]['question'] = "referal URL"; //"Referrer URL"; $fieldmap["refurl"]['group_name'] = ""; } } } //Get list of questions if (is_null($sQuestionLanguage)) { $s_lang = 'ru'; //GetBaseLanguageFromSurveyID($surveyId); } else { $s_lang = $sQuestionLanguage; } $qtypes = static::getqtypelist('', 'array'); $aquery = "SELECT *, " . " (SELECT count(1) FROM lime_conditions c\n" . " WHERE questions.qid = c.qid) AS hasconditions,\n" . " (SELECT count(1) FROM lime_conditions c\n" . " WHERE questions.qid = c.cqid) AS usedinconditions\n" . " FROM lime_questions as questions, lime_groups as groups" . " WHERE questions.gid=groups.gid AND " . " questions.sid={$survey->sid} AND " . " questions.language='{$s_lang}' AND " . " questions.parent_qid=0 AND " . " groups.language='{$s_lang}' "; if ($questionid !== false) { $aquery .= " and questions.qid={$questionid} "; } $aquery .= " ORDER BY group_order, question_order"; $aresult = $survey->getDbConnection()->createCommand($aquery)->queryAll(); //Checked foreach ($aresult as $arow) { //With each question, create the appropriate field(s) if ($arow['hasconditions'] > 0) { $conditions = "Y"; } else { $conditions = "N"; } if ($arow['usedinconditions'] > 0) { $usedinconditions = "Y"; } else { // This question is not directly used in a condition, however we should // check if its SGQA code is not used as a value in another condition // as a @SGQA@ code $atsgqaQuery = "SELECT count(1) as sgqausedincondition " . "FROM lime_questions as q, " . "lime_conditions as c " . "WHERE c.qid=q.qid AND q.sid=" . $arow['sid'] . " AND " . "c.value like '@" . $arow['sid'] . "X" . $arow['gid'] . "X" . $arow['qid'] . "%'"; $atsgqaRow = $survey->getDbConnection()->createCommand($atsgqaQuery)->queryRow(); //Checked if ($atsgqaRow['sgqausedincondition'] == 0) { $usedinconditions = "N"; } else { $usedinconditions = "Y"; } } // Field identifier // GXQXSXA // G=Group Q=Question S=Subquestion A=Answer Option // If S or A don't exist then set it to 0 // Implicit (subqestion intermal to a question type ) or explicit qubquestions/answer count starts at 1 // Types "L", "!" , "O", "D", "G", "N", "X", "Y", "5","S","T","U" if ($qtypes[$arow['type']]['subquestions'] == 0 && $arow['type'] != "R" && $arow['type'] != "|") { $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}"; if (isset($fieldmap[$fieldname])) { $aDuplicateQIDs[$arow['qid']] = array('fieldname' => $fieldname, 'question' => $arow['question'], 'gid' => $arow['gid']); } $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => "{$arow['type']}", 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => ""); if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; if ($qtypes[$arow['type']]['hasdefaultvalues']) { if ($arow['same_default']) { $fieldmap[$fieldname]['defaultvalue'] = $survey->getDbConnection()->createCommand("SELECT defaultvalue FROM lime_defaultvalues WHERE qid={$arow['qid']} AND scale_id=0 AND language='ru'")->queryScalar(); } else { $fieldmap[$fieldname]['defaultvalue'] = $survey->getDbConnection()->createCommand("SELECT defaultvalue FROM lime_defaultvalues WHERE qid={$arow['qid']} AND scale_id=0 AND language='ru'")->queryScalar(); } } } switch ($arow['type']) { case "L": //RADIO LIST //RADIO LIST case "!": //DROPDOWN LIST if ($arow['other'] == "Y") { $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}other"; if (isset($fieldmap[$fieldname])) { $aDuplicateQIDs[$arow['qid']] = array('fieldname' => $fieldname, 'question' => $arow['question'], 'gid' => $arow['gid']); } $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => "other"); // dgk bug fix line above. aid should be set to "other" for export to append to the field name in the header line. if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['subquestion'] = "Other"; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; if ($arow['same_default']) { $fieldmap[$fieldname]['defaultvalue'] = $survey->getDbConnection()->createCommand("SELECT defaultvalue FROM lime_defaultvalues WHERE qid={$arow['qid']} AND scale_id=0 AND language='ru' and specialtype='other'")->queryScalar(); } } } break; case "O": //DROPDOWN LIST WITH COMMENT $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}comment"; if (isset($fieldmap[$fieldname])) { $aDuplicateQIDs[$arow['qid']] = array('fieldname' => $fieldname, 'question' => $arow['question'], 'gid' => $arow['gid']); } $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => "comment"); // dgk bug fix line below. aid should be set to "comment" for export to append to the field name in the header line. Also needed set the type element correctly. if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['subquestion'] = "Comment"; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; } break; } } elseif ($qtypes[$arow['type']]['subquestions'] == 2 && $qtypes[$arow['type']]['answerscales'] == 0) { //MULTI FLEXI $abrows = static::getSubQuestions($survey, $arow['qid'], $s_lang); //Now first process scale=1 $answerset = array(); foreach ($abrows as $key => $abrow) { if ($abrow['scale_id'] == 1) { $answerset[] = $abrow; unset($abrows[$key]); } } reset($abrows); foreach ($abrows as $abrow) { foreach ($answerset as $answer) { $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['title']}_{$answer['title']}"; if (isset($fieldmap[$fieldname])) { $aDuplicateQIDs[$arow['qid']] = array('fieldname' => $fieldname, 'question' => $arow['question'], 'gid' => $arow['gid']); } $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => $abrow['title'] . "_" . $answer['title'], "sqid" => $abrow['qid']); if ($abrow['other'] == "Y") { $alsoother = "Y"; } if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['subquestion1'] = $abrow['question']; $fieldmap[$fieldname]['subquestion2'] = $answer['question']; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; } } } unset($answerset); } elseif ($arow['type'] == "1") { $abrows = static::getSubQuestions($survey, $arow['qid'], $s_lang); foreach ($abrows as $abrow) { $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['title']}#0"; if (isset($fieldmap[$fieldname])) { $aDuplicateQIDs[$arow['qid']] = array('fieldname' => $fieldname, 'question' => $arow['question'], 'gid' => $arow['gid']); } $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => $abrow['title'], "scale_id" => 0); if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['subquestion'] = $abrow['question']; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['scale'] = 'Scale 1'; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; } $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['title']}#1"; if (isset($fieldmap[$fieldname])) { $aDuplicateQIDs[$arow['qid']] = array('fieldname' => $fieldname, 'question' => $arow['question'], 'gid' => $arow['gid']); } $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => $abrow['title'], "scale_id" => 1); if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['subquestion'] = $abrow['question']; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['scale'] = 'Scale 2'; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; } } } elseif ($arow['type'] == "R") { //MULTI ENTRY $slots = $survey->getDbConnection()->createCommand("select count(code) from lime_answers where qid={$arow['qid']} and language='{$s_lang}'")->queryScalar(); for ($i = 1; $i <= $slots; $i++) { $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$i}"; if (isset($fieldmap[$fieldname])) { $aDuplicateQIDs[$arow['qid']] = array('fieldname' => $fieldname, 'question' => $arow['question'], 'gid' => $arow['gid']); } $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => $i); if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['subquestion'] = sprintf('Rank %s', $i); $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; } } } elseif ($arow['type'] == "|") { $abquery = "SELECT value FROM lime_question_attributes" . " WHERE attribute='max_num_of_files' AND qid=" . $arow['qid']; $abrow = $survey->getDbConnection()->createCommand($abquery)->queryRow(); for ($i = 1; $i <= $abrow['value']; $i++) { $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}"; $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => ''); if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['max_files'] = $abrow['value']; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; } $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}" . "_filecount"; $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => "filecount"); if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = "filecount - " . $arow['question']; //$fieldmap[$fieldname]['subquestion']="Comment"; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; } } } else { //MULTI ENTRY $abrows = static::getSubQuestions($survey, $arow['qid'], $s_lang); foreach ($abrows as $abrow) { $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['title']}"; if (isset($fieldmap[$fieldname])) { $aDuplicateQIDs[$arow['qid']] = array('fieldname' => $fieldname, 'question' => $arow['question'], 'gid' => $arow['gid']); } $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => $abrow['title']); if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['subquestion'] = $abrow['question']; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; if ($arow['same_default']) { $fieldmap[$fieldname]['defaultvalue'] = $survey->getDbConnection()->createCommand("SELECT defaultvalue FROM lime_defaultvalues WHERE sqid={$abrow['qid']} and qid={$arow['qid']} AND scale_id=0 AND language='ru'")->queryScalar(); } } if ($arow['type'] == "P") { $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['title']}comment"; if (isset($fieldmap[$fieldname])) { $aDuplicateQIDs[$arow['qid']] = array('fieldname' => $fieldname, 'question' => $arow['question'], 'gid' => $arow['gid']); } $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => $abrow['title'] . "comment"); if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['subquestion'] = 'Comment'; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; } } } if ($arow['other'] == "Y" && ($arow['type'] == "M" || $arow['type'] == "P")) { $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}other"; if (isset($fieldmap[$fieldname])) { $aDuplicateQIDs[$arow['qid']] = array('fieldname' => $fieldname, 'question' => $arow['question'], 'gid' => $arow['gid']); } $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => "other"); if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['subquestion'] = 'Other'; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; } if ($arow['type'] == "P") { $fieldname = "{$arow['sid']}X{$arow['gid']}X{$arow['qid']}othercomment"; if (isset($fieldmap[$fieldname])) { $aDuplicateQIDs[$arow['qid']] = array('fieldname' => $fieldname, 'question' => $arow['question'], 'gid' => $arow['gid']); } $fieldmap[$fieldname] = array("fieldname" => $fieldname, 'type' => $arow['type'], 'sid' => $survey->sid, "gid" => $arow['gid'], "qid" => $arow['qid'], "aid" => "othercomment"); if ($style == "full") { $fieldmap[$fieldname]['title'] = $arow['title']; $fieldmap[$fieldname]['question'] = $arow['question']; $fieldmap[$fieldname]['subquestion'] = 'Other comment'; $fieldmap[$fieldname]['group_name'] = $arow['group_name']; $fieldmap[$fieldname]['mandatory'] = $arow['mandatory']; $fieldmap[$fieldname]['hasconditions'] = $conditions; $fieldmap[$fieldname]['usedinconditions'] = $usedinconditions; } } } } } if (isset($fieldmap)) { $globalfieldmap[$survey->sid][$style]['ru'] = $fieldmap; return $fieldmap; } return array(); }