示例#1
0
/**
* This function imports the old CSV data from 1.50 to 1.87 or older. Starting with 1.90 (DBVersion 143) there is an XML format instead
*
* @param array $sFullFilepath
* @returns array Information of imported questions/answers/etc.
*/
function CSVImportSurvey($sFullFilepath, $iDesiredSurveyId = NULL, $bTranslateLinks = true)
{
    Yii::app()->loadHelper('database');
    $clang = Yii::app()->lang;
    $handle = fopen($sFullFilepath, "r");
    while (!feof($handle)) {
        $buffer = fgets($handle);
        $bigarray[] = $buffer;
    }
    fclose($handle);
    $aIgnoredAnswers = array();
    $aSQIDReplacements = array();
    $aLIDReplacements = array();
    $aGIDReplacements = array();
    $substitutions = array();
    $aQuotaReplacements = array();
    $importresults['error'] = false;
    $importresults['importwarnings'] = array();
    $importresults['question_attributes'] = 0;
    if (isset($bigarray[0])) {
        $bigarray[0] = removeBOM($bigarray[0]);
    }
    // Now we try to determine the dataformat of the survey file.
    $importversion = 0;
    if (isset($bigarray[1]) && isset($bigarray[4]) && substr($bigarray[1], 0, 22) == "# SURVEYOR SURVEY DUMP") {
        $importversion = 100;
        // Version 0.99 or  1.0 file
    } elseif (substr($bigarray[0], 0, 24) == "# LimeSurvey Survey Dump" || substr($bigarray[0], 0, 25) == "# PHPSurveyor Survey Dump") {
        // Seems to be a >1.0 version file - these files carry the version information to read in line two
        $importversion = substr($bigarray[1], 12, 3);
    } else {
        $importresults['error'] = $clang->gT("This file is not a LimeSurvey survey file. Import failed.") . "\n";
        return $importresults;
    }
    if ((int) $importversion < 112) {
        $importresults['error'] = $clang->gT("This file is too old. Only files from LimeSurvey version 1.50 (DBVersion 112) and newer are supported.");
        return $importresults;
    }
    // okay.. now lets drop the first 9 lines and get to the data
    // This works for all versions
    for ($i = 0; $i < 9; $i++) {
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //SURVEYS
    if (array_search("# GROUPS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# GROUPS TABLE\n", $bigarray);
    } elseif (array_search("# GROUPS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# GROUPS TABLE\r\n", $bigarray);
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $surveyarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //GROUPS
    if (array_search("# QUESTIONS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# QUESTIONS TABLE\n", $bigarray);
    } elseif (array_search("# QUESTIONS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# QUESTIONS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $grouparray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //QUESTIONS
    if (array_search("# ANSWERS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# ANSWERS TABLE\n", $bigarray);
    } elseif (array_search("# ANSWERS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# ANSWERS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $questionarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //ANSWERS
    if (array_search("# CONDITIONS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# CONDITIONS TABLE\n", $bigarray);
    } elseif (array_search("# CONDITIONS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# CONDITIONS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $answerarray[] = str_replace("`default`", "`default_value`", $bigarray[$i]);
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //CONDITIONS
    if (array_search("# LABELSETS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# LABELSETS TABLE\n", $bigarray);
    } elseif (array_search("# LABELSETS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# LABELSETS TABLE\r\n", $bigarray);
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $conditionsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //LABELSETS
    if (array_search("# LABELS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# LABELS TABLE\n", $bigarray);
    } elseif (array_search("# LABELS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $labelsetsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //LABELS
    if (array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray)) {
        $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray);
    } elseif (array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $labelsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //Question attributes
    if (array_search("# ASSESSMENTS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# ASSESSMENTS TABLE\n", $bigarray);
    } elseif (array_search("# ASSESSMENTS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# ASSESSMENTS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $question_attributesarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //ASSESSMENTS
    if (array_search("# SURVEYS_LANGUAGESETTINGS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# SURVEYS_LANGUAGESETTINGS TABLE\n", $bigarray);
    } elseif (array_search("# SURVEYS_LANGUAGESETTINGS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# SURVEYS_LANGUAGESETTINGS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        //    if ($i<$stoppoint-2 || $i==count($bigarray)-1)
        if ($i < $stoppoint - 2) {
            $assessmentsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //LANGAUGE SETTINGS
    if (array_search("# QUOTA TABLE\n", $bigarray)) {
        $stoppoint = array_search("# QUOTA TABLE\n", $bigarray);
    } elseif (array_search("# QUOTA TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# QUOTA TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        //    if ($i<$stoppoint-2 || $i==count($bigarray)-1)
        //$bigarray[$i]=        trim($bigarray[$i]);
        if (isset($bigarray[$i]) && trim($bigarray[$i]) != '') {
            if (strpos($bigarray[$i], "#") === 0) {
                unset($bigarray[$i]);
                unset($bigarray[$i + 1]);
                unset($bigarray[$i + 2]);
                break;
            } else {
                $surveylsarray[] = $bigarray[$i];
            }
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //QUOTA
    if (array_search("# QUOTA_MEMBERS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# QUOTA_MEMBERS TABLE\n", $bigarray);
    } elseif (array_search("# QUOTA_MEMBERS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# QUOTA_MEMBERS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        //    if ($i<$stoppoint-2 || $i==count($bigarray)-1)
        if ($i < $stoppoint - 2) {
            $quotaarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //QUOTA MEMBERS
    if (array_search("# QUOTA_LANGUAGESETTINGS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# QUOTA_LANGUAGESETTINGS TABLE\n", $bigarray);
    } elseif (array_search("# QUOTA_LANGUAGESETTINGS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# QUOTA_LANGUAGESETTINGS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        //    if ($i<$stoppoint-2 || $i==count($bigarray)-1)
        if ($i < $stoppoint - 2) {
            $quotamembersarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //Whatever is the last table - currently
    //QUOTA LANGUAGE SETTINGS
    $stoppoint = count($bigarray) - 1;
    for ($i = 0; $i < $stoppoint - 1; $i++) {
        if ($i <= $stoppoint) {
            $quotalsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    if (isset($surveyarray)) {
        $importresults['surveys'] = count($surveyarray);
    } else {
        $importresults['surveys'] = 0;
    }
    if (isset($surveylsarray)) {
        $importresults['languages'] = count($surveylsarray) - 1;
    } else {
        $importresults['languages'] = 1;
    }
    if (isset($grouparray)) {
        $importresults['groups'] = count($grouparray) - 1;
    } else {
        $importresults['groups'] = 0;
    }
    if (isset($questionarray)) {
        $importresults['questions'] = count($questionarray);
    } else {
        $importresults['questions'] = 0;
    }
    if (isset($answerarray)) {
        $importresults['answers'] = count($answerarray);
    } else {
        $importresults['answers'] = 0;
    }
    if (isset($conditionsarray)) {
        $importresults['conditions'] = count($conditionsarray);
    } else {
        $importresults['conditions'] = 0;
    }
    if (isset($labelsetsarray)) {
        $importresults['labelsets'] = count($labelsetsarray);
    } else {
        $importresults['labelsets'] = 0;
    }
    if (isset($assessmentsarray)) {
        $importresults['assessments'] = count($assessmentsarray);
    } else {
        $importresults['assessments'] = 0;
    }
    if (isset($quotaarray)) {
        $importresults['quota'] = count($quotaarray);
    } else {
        $importresults['quota'] = 0;
    }
    if (isset($quotamembersarray)) {
        $importresults['quotamembers'] = count($quotamembersarray);
    } else {
        $importresults['quotamembers'] = 0;
    }
    if (isset($quotalsarray)) {
        $importresults['quotals'] = count($quotalsarray);
    } else {
        $importresults['quotals'] = 0;
    }
    // CREATE SURVEY
    if ($importresults['surveys'] > 0) {
        $importresults['surveys']--;
    }
    if ($importresults['answers'] > 0) {
        $importresults['answers'] = ($importresults['answers'] - 1) / $importresults['languages'];
    }
    if ($importresults['groups'] > 0) {
        $countgroups = ($importresults['groups'] - 1) / $importresults['languages'];
    }
    if ($importresults['questions'] > 0) {
        $importresults['questions'] = ($importresults['questions'] - 1) / $importresults['languages'];
    }
    if ($importresults['assessments'] > 0) {
        $importresults['assessments']--;
    }
    if ($importresults['conditions'] > 0) {
        $importresults['conditions']--;
    }
    if ($importresults['labelsets'] > 0) {
        $importresults['labelsets']--;
    }
    if ($importresults['quota'] > 0) {
        $importresults['quota']--;
    }
    $sfieldorders = convertCSVRowToArray($surveyarray[0], ',', '"');
    $sfieldcontents = convertCSVRowToArray($surveyarray[1], ',', '"');
    $surveyrowdata = array_combine($sfieldorders, $sfieldcontents);
    $iOldSID = $surveyrowdata["sid"];
    if (!$iOldSID) {
        if ($importingfrom == "http") {
            $importsurvey .= "<br /><div class='warningheader'>" . $clang->gT("Error") . "</div><br />\n";
            $importsurvey .= $clang->gT("Import of this survey file failed") . "<br />\n";
            $importsurvey .= $clang->gT("File does not contain LimeSurvey data in the correct format.") . "<br /><br />\n";
            //Couldn't find the SID - cannot continue
            $importsurvey .= "<input type='submit' value='" . $clang->gT("Main Admin Screen") . "' onclick=\"window.open('{$scriptname}', '_top')\" />\n";
            $importsurvey .= "</div>\n";
            unlink($sFullFilepath);
            //Delete the uploaded file
            return;
        } else {
            $clang->eT("Import of this survey file failed") . "\n" . $clang->gT("File does not contain LimeSurvey data in the correct format.") . "\n";
            return;
        }
    }
    if ($iDesiredSurveyId != NULL) {
        $iNewSID = GetNewSurveyID($iDesiredSurveyId);
    } else {
        $iNewSID = GetNewSurveyID($iOldSID);
    }
    $insert = $surveyarray[0];
    $sfieldorders = convertCSVRowToArray($surveyarray[0], ',', '"');
    $sfieldcontents = convertCSVRowToArray($surveyarray[1], ',', '"');
    $surveyrowdata = array_combine($sfieldorders, $sfieldcontents);
    // Set new owner ID
    $surveyrowdata['owner_id'] = Yii::app()->session['loginID'];
    // Set new survey ID
    $surveyrowdata['sid'] = $iNewSID;
    $surveyrowdata['active'] = 'N';
    if (validateTemplateDir($surveyrowdata['template']) !== $surveyrowdata['template']) {
        $importresults['importwarnings'][] = sprintf($clang->gT('Template %s not found, please review when activating.'), $surveyrowdata['template']);
    }
    //if (isset($surveyrowdata['datecreated'])) {$surveyrowdata['datecreated'] = $connect->BindTimeStamp($surveyrowdata['datecreated']);}
    unset($surveyrowdata['expires']);
    unset($surveyrowdata['attribute1']);
    unset($surveyrowdata['attribute2']);
    unset($surveyrowdata['usestartdate']);
    unset($surveyrowdata['notification']);
    unset($surveyrowdata['useexpiry']);
    unset($surveyrowdata['url']);
    unset($surveyrowdata['lastpage']);
    if (isset($surveyrowdata['private'])) {
        $surveyrowdata['anonymized'] = $surveyrowdata['private'];
        unset($surveyrowdata['private']);
    }
    if (isset($surveyrowdata['startdate'])) {
        unset($surveyrowdata['startdate']);
    }
    $surveyrowdata['bounce_email'] = $surveyrowdata['adminemail'];
    if (empty($surveyrowdata['datecreated'])) {
        $surveyrowdata['datecreated'] = new CDbExpression('NOW()');
    }
    $iNewSID = Survey::model()->insertNewSurvey($surveyrowdata) or safeDie("<br />" . $clang->gT("Import of this survey file failed") . "<br />{$surveyarray[0]}<br /><br />\n");
    // Now import the survey language settings
    $fieldorders = convertCSVRowToArray($surveylsarray[0], ',', '"');
    unset($surveylsarray[0]);
    foreach ($surveylsarray as $slsrow) {
        $fieldcontents = convertCSVRowToArray($slsrow, ',', '"');
        $surveylsrowdata = array_combine($fieldorders, $fieldcontents);
        // convert back the '\'.'n' char from the CSV file to true return char "\n"
        $surveylsrowdata = array_map('convertCSVReturnToReturn', $surveylsrowdata);
        // Convert the \n return char from welcometext to <br />
        // translate internal links
        if ($bTranslateLinks) {
            $surveylsrowdata['surveyls_title'] = translateLinks('survey', $iOldSID, $iNewSID, $surveylsrowdata['surveyls_title']);
            $surveylsrowdata['surveyls_description'] = translateLinks('survey', $iOldSID, $iNewSID, $surveylsrowdata['surveyls_description']);
            $surveylsrowdata['surveyls_welcometext'] = translateLinks('survey', $iOldSID, $iNewSID, $surveylsrowdata['surveyls_welcometext']);
            $surveylsrowdata['surveyls_urldescription'] = translateLinks('survey', $iOldSID, $iNewSID, $surveylsrowdata['surveyls_urldescription']);
            $surveylsrowdata['surveyls_email_invite'] = translateLinks('survey', $iOldSID, $iNewSID, $surveylsrowdata['surveyls_email_invite']);
            $surveylsrowdata['surveyls_email_remind'] = translateLinks('survey', $iOldSID, $iNewSID, $surveylsrowdata['surveyls_email_remind']);
            $surveylsrowdata['surveyls_email_register'] = translateLinks('survey', $iOldSID, $iNewSID, $surveylsrowdata['surveyls_email_register']);
            $surveylsrowdata['surveyls_email_confirm'] = translateLinks('survey', $iOldSID, $iNewSID, $surveylsrowdata['surveyls_email_confirm']);
        }
        unset($surveylsrowdata['lastpage']);
        $surveylsrowdata['surveyls_survey_id'] = $iNewSID;
        $lsiresult = Surveys_languagesettings::model()->insertNewSurvey($surveylsrowdata) or safeDie("<br />" . $clang->gT("Import of this survey file failed") . "<br />");
    }
    // The survey languagesettings are imported now
    $aLanguagesSupported = array();
    // this array will keep all the languages supported for the survey
    $sBaseLanguage = Survey::model()->findByPk($iNewSID)->language;
    $aLanguagesSupported[] = $sBaseLanguage;
    // adds the base language to the list of supported languages
    $aLanguagesSupported = array_merge($aLanguagesSupported, Survey::model()->findByPk($iNewSID)->additionalLanguages);
    // DO SURVEY_RIGHTS
    Survey_permissions::model()->giveAllSurveyPermissions(Yii::app()->session['loginID'], $iNewSID);
    $importresults['deniedcountls'] = 0;
    $qtypes = getQuestionTypeList("", "array");
    $results['labels'] = 0;
    $results['labelsets'] = 0;
    $results['answers'] = 0;
    $results['subquestions'] = 0;
    //Do label sets
    if (isset($labelsetsarray) && $labelsetsarray) {
        $csarray = buildLabelSetCheckSumArray();
        // build checksums over all existing labelsets
        $count = 0;
        foreach ($labelsetsarray as $lsa) {
            $fieldorders = convertCSVRowToArray($labelsetsarray[0], ',', '"');
            $fieldcontents = convertCSVRowToArray($lsa, ',', '"');
            if ($count == 0) {
                $count++;
                continue;
            }
            $labelsetrowdata = array_combine($fieldorders, $fieldcontents);
            // Save old labelid
            $oldlid = $labelsetrowdata['lid'];
            unset($labelsetrowdata['lid']);
            $lblsets = Labelsets::model();
            $lsiresult = $lblsets->insertRecords($labelsetrowdata);
            $results['labelsets']++;
            // Get the new insert id for the labels inside this labelset
            $newlid = Yii::app()->db->createCommand('Select LAST_INSERT_ID()')->query()->read();
            $newlid = $newlid['LAST_INSERT_ID()'];
            if ($labelsarray) {
                $count = 0;
                foreach ($labelsarray as $la) {
                    $lfieldorders = convertCSVRowToArray($labelsarray[0], ',', '"');
                    $lfieldcontents = convertCSVRowToArray($la, ',', '"');
                    if ($count == 0) {
                        $count++;
                        continue;
                    }
                    // Combine into one array with keys and values since its easier to handle
                    $labelrowdata = array_combine($lfieldorders, $lfieldcontents);
                    $labellid = $labelrowdata['lid'];
                    if ($importversion <= 132) {
                        $labelrowdata["assessment_value"] = (int) $labelrowdata["code"];
                    }
                    if ($labellid == $oldlid) {
                        $labelrowdata['lid'] = $newlid;
                        // translate internal links
                        if ($bTranslateLinks) {
                            $labelrowdata['title'] = translateLinks('label', $oldlid, $newlid, $labelrowdata['title']);
                        }
                        $liresult = Label::model()->insertRecords($labelrowdata);
                        if ($liresult !== false) {
                            $results['labels']++;
                        }
                    }
                }
            }
            //CHECK FOR DUPLICATE LABELSETS
            $thisset = "";
            $query2 = "SELECT code, title, sortorder, language, assessment_value\n            FROM {{labels}}\n            WHERE lid=" . $newlid . "\n            ORDER BY language, sortorder, code";
            $result2 = Yii::app()->db->createCommand($query2)->query() or die("Died querying labelset {$lid}<br />");
            foreach ($result2->readAll() as $row2) {
                $row2 = array_values($row2);
                $thisset .= implode('.', $row2);
            }
            // while
            $newcs = dechex(crc32($thisset) * 1);
            unset($lsmatch);
            if (isset($csarray)) {
                foreach ($csarray as $key => $val) {
                    if ($val == $newcs) {
                        $lsmatch = $key;
                    }
                }
            }
            if (isset($lsmatch) || Yii::app()->session['USER_RIGHT_MANAGE_LABEL'] != 1) {
                //There is a matching labelset or the user is not allowed to edit labels -
                // So, we will delete this one and refer to the matched one.
                $query = "DELETE FROM {{labels}} WHERE lid={$newlid}";
                $result = Yii::app()->db->createCommand($query)->execute();
                $results['labels'] = $results['labels'] - $result;
                $query = "DELETE FROM {{labelsets}} WHERE lid={$newlid}";
                $result = Yii::app()->db->createCommand($query)->execute();
                $results['labelsets'] = $results['labelsets'] - $result;
                $newlid = $lsmatch;
            } else {
                //There isn't a matching labelset, add this checksum to the $csarray array
                $csarray[$newlid] = $newcs;
            }
            //END CHECK FOR DUPLICATES
            $aLIDReplacements[$oldlid] = $newlid;
        }
    }
    // Import groups
    if (isset($grouparray) && $grouparray) {
        // do GROUPS
        $gafieldorders = convertCSVRowToArray($grouparray[0], ',', '"');
        unset($grouparray[0]);
        foreach ($grouparray as $ga) {
            $gacfieldcontents = convertCSVRowToArray($ga, ',', '"');
            $grouprowdata = array_combine($gafieldorders, $gacfieldcontents);
            //Now an additional integrity check if there are any groups not belonging into this survey
            if ($grouprowdata['sid'] != $iOldSID) {
                $results['fatalerror'] = $clang->gT("A group in the CSV/SQL file is not part of the same survey. The import of the survey was stopped.") . "<br />\n";
                return $results;
            }
            $grouprowdata['sid'] = $iNewSID;
            // remember group id
            $oldgid = $grouprowdata['gid'];
            //update/remove the old group id
            if (isset($aGIDReplacements[$oldgid])) {
                $grouprowdata['gid'] = $aGIDReplacements[$oldgid];
            } else {
                unset($grouprowdata['gid']);
            }
            // Everything set - now insert it
            $grouprowdata = array_map('convertCSVReturnToReturn', $grouprowdata);
            // translate internal links
            if ($bTranslateLinks) {
                $grouprowdata['group_name'] = translateLinks('survey', $iOldSID, $iNewSID, $grouprowdata['group_name']);
                $grouprowdata['description'] = translateLinks('survey', $iOldSID, $iNewSID, $grouprowdata['description']);
            }
            if (isset($grouprowdata['gid'])) {
                switchMSSQLIdentityInsert('groups', true);
            }
            $gres = Groups::model()->insertRecords($grouprowdata) or safeDie($clang->gT('Error') . ": Failed to insert group<br />\\<br />\n");
            if (isset($grouprowdata['gid'])) {
                switchMSSQLIdentityInsert('groups', false);
            }
            if (!isset($grouprowdata['gid'])) {
                $aGIDReplacements[$oldgid] = Yii::app()->db->createCommand('Select LAST_INSERT_ID()')->query()->read();
                $aGIDReplacements[$oldgid] = $aGIDReplacements[$oldgid]['LAST_INSERT_ID()'];
            }
        }
        // Fix sortorder of the groups  - if users removed groups manually from the csv file there would be gaps
        fixSortOrderGroups($iNewSID);
    }
    // GROUPS is DONE
    // Import questions
    if (isset($questionarray) && $questionarray) {
        $qafieldorders = convertCSVRowToArray($questionarray[0], ',', '"');
        unset($questionarray[0]);
        foreach ($questionarray as $qa) {
            $qacfieldcontents = convertCSVRowToArray($qa, ',', '"');
            $questionrowdata = array_combine($qafieldorders, $qacfieldcontents);
            $questionrowdata = array_map('convertCSVReturnToReturn', $questionrowdata);
            $questionrowdata["type"] = strtoupper($questionrowdata["type"]);
            // Skip not supported languages
            if (!in_array($questionrowdata['language'], $aLanguagesSupported)) {
                continue;
            }
            // replace the sid
            $questionrowdata["sid"] = $iNewSID;
            // Skip if gid is invalid
            if (!isset($aGIDReplacements[$questionrowdata['gid']])) {
                continue;
            }
            $questionrowdata["gid"] = $aGIDReplacements[$questionrowdata['gid']];
            if (isset($aQIDReplacements[$questionrowdata['qid']])) {
                $questionrowdata['qid'] = $aQIDReplacements[$questionrowdata['qid']];
            } else {
                $oldqid = $questionrowdata['qid'];
                unset($questionrowdata['qid']);
            }
            unset($oldlid1);
            unset($oldlid2);
            if (isset($questionrowdata['lid']) && $questionrowdata['lid'] > 0) {
                $oldlid1 = $questionrowdata['lid'];
            }
            if (isset($questionrowdata['lid1']) && $questionrowdata['lid1'] > 0) {
                $oldlid2 = $questionrowdata['lid1'];
            }
            unset($questionrowdata['lid']);
            unset($questionrowdata['lid1']);
            if ($questionrowdata['type'] == 'W') {
                $questionrowdata['type'] = '!';
            } elseif ($questionrowdata['type'] == 'Z') {
                $questionrowdata['type'] = 'L';
                $aIgnoredAnswers[] = $oldqid;
            }
            if (!isset($questionrowdata["question_order"]) || $questionrowdata["question_order"] == '') {
                $questionrowdata["question_order"] = 0;
            }
            // translate internal links
            if ($bTranslateLinks) {
                $questionrowdata['question'] = translateLinks('survey', $iOldSID, $iNewSID, $questionrowdata['question']);
                $questionrowdata['help'] = translateLinks('survey', $iOldSID, $iNewSID, $questionrowdata['help']);
            }
            if (isset($questionrowdata['qid'])) {
                switchMSSQLIdentityInsert('questions', true);
            }
            $qres = Questions::model()->insertRecords($questionrowdata) or safeDie($clang->gT("Error") . ": Failed to insert question<br />");
            if (isset($questionrowdata['qid'])) {
                switchMSSQLIdentityInsert('questions', false);
                $saveqid = $questionrowdata['qid'];
            } else {
                $aQIDReplacements[$oldqid] = Yii::app()->db->createCommand('Select LAST_INSERT_ID()')->query()->read();
                $aQIDReplacements[$oldqid] = $aQIDReplacements[$oldqid]['LAST_INSERT_ID()'];
                $saveqid = $aQIDReplacements[$oldqid];
            }
            // Now we will fix up old label sets where they are used as answers
            if ((isset($oldlid1) && isset($aLIDReplacements[$oldlid1]) || isset($oldlid2) && isset($aLIDReplacements[$oldlid2])) && ($qtypes[$questionrowdata['type']]['answerscales'] > 0 || $qtypes[$questionrowdata['type']]['subquestions'] > 1)) {
                $query = "select * from {{labels}} where lid={$aLIDReplacements[$oldlid1]} and language='{$questionrowdata['language']}'";
                $oldlabelsresult = Yii::app()->db->createCommand($query)->query();
                foreach ($oldlabelsresult->readAll() as $labelrow) {
                    if (in_array($labelrow['language'], $aLanguagesSupported)) {
                        if ($qtypes[$questionrowdata['type']]['subquestions'] < 2) {
                            $qinsert = "insert INTO {{answers}} (qid,code,answer,sortorder,language,assessment_value)\n                            VALUES ({$aQIDReplacements[$oldqid]},'" . $labelrow['code'] . "','" . $labelrow['title'] . "','" . $labelrow['sortorder'] . "','" . $labelrow['language'] . "','" . $labelrow['assessment_value'] . "')";
                            $qres = Yii::app()->db->createCommand($qinsert)->query() or safeDie($clang->gT("Error") . ": Failed to insert answer (lid1) <br />\n{$qinsert}<br />\n");
                        } else {
                            if (isset($aSQIDReplacements[$labelrow['code'] . '_' . $saveqid])) {
                                $fieldname = 'qid,';
                                $data = $aSQIDReplacements[$labelrow['code'] . '_' . $saveqid] . ',';
                            } else {
                                $fieldname = '';
                                $data = '';
                            }
                            $qinsert = "insert INTO {{questions}} ({$fieldname} parent_qid,title,question,question_order,language,scale_id,type, sid, gid)\n                            VALUES ({$data}{$aQIDReplacements[$oldqid]},'" . $labelrow['code'] . "','" . $labelrow['title'] . "','" . $labelrow['sortorder'] . "','" . $labelrow['language'] . "',1,'{$questionrowdata['type']}',{$questionrowdata['sid']},{$questionrowdata['gid']})";
                            $qres = Yii::app()->db->createCommand($qinsert)->query() or safeDie($clang->gT("Error") . ": Failed to insert question <br />\n{$qinsert}<br />\n");
                            if ($fieldname == '') {
                                $aSQIDReplacements[$labelrow['code'] . '_' . $saveqid] = Yii::app()->db->getCommandBuilder()->getLastInsertID('{{questions}}');
                            }
                        }
                    }
                }
                if (isset($oldlid2) && $qtypes[$questionrowdata['type']]['answerscales'] > 1) {
                    $query = "select * from {{labels}} where lid={$aLIDReplacements[$oldlid2]} and language='{$questionrowdata['language']}'";
                    $oldlabelsresult = Yii::app()->db->createCommand($query)->query();
                    foreach ($oldlabelsresult->readAll() as $labelrow) {
                        $qinsert = "insert INTO {{answers}} (qid,code,answer,sortorder,language,assessment_value,scale_id)\n                        VALUES ({$aQIDReplacements[$oldqid]},'" . $labelrow['code'] . "','" . $labelrow['title'] . "','" . $labelrow['sortorder'] . "','" . $labelrow['language'] . "','" . $labelrow['assessment_value'] . "',1)";
                        $qres = Yii::app()->db->createCommand($qinsert)->query() or safeDie($clang->gT("Error") . ": Failed to insert answer (lid2)<br />\n{$qinsert}<br />\n");
                    }
                }
            }
        }
    }
    //Do answers
    if (isset($answerarray) && $answerarray) {
        $answerfieldnames = convertCSVRowToArray($answerarray[0], ',', '"');
        unset($answerarray[0]);
        foreach ($answerarray as $aa) {
            $answerfieldcontents = convertCSVRowToArray($aa, ',', '"');
            $answerrowdata = array_combine($answerfieldnames, $answerfieldcontents);
            if (in_array($answerrowdata['qid'], $aIgnoredAnswers)) {
                // Due to a bug in previous LS versions there may be orphaned answers with question type Z (which is now L)
                // this way they are ignored
                continue;
            }
            if ($answerrowdata === false) {
                $importquestion .= '<br />' . $clang->gT("Faulty line in import - fields and data don't match") . ":" . implode(',', $answerfieldcontents);
            }
            // Skip not supported languages
            if (!in_array($answerrowdata['language'], $aLanguagesSupported)) {
                continue;
            }
            // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this answer is orphan -> error, skip this record)
            if (isset($aQIDReplacements[$answerrowdata["qid"]])) {
                $answerrowdata["qid"] = $aQIDReplacements[$answerrowdata["qid"]];
            } else {
                continue;
            }
            // a problem with this answer record -> don't consider
            if ($importversion <= 132) {
                $answerrowdata["assessment_value"] = (int) $answerrowdata["code"];
            }
            // Convert default values for single select questions
            $query1 = 'select type,gid from {{questions}} where qid=' . $answerrowdata["qid"];
            $resultquery1 = Yii::app()->db->createCommand($query1)->query();
            $questiontemp = $resultquery1->read();
            $oldquestion['newtype'] = $questiontemp['type'];
            $oldquestion['gid'] = $questiontemp['gid'];
            if ($answerrowdata['default_value'] == 'Y' && ($oldquestion['newtype'] == 'L' || $oldquestion['newtype'] == 'O' || $oldquestion['newtype'] == '!')) {
                $insertdata = array();
                $insertdata['qid'] = $newqid;
                $insertdata['language'] = $answerrowdata['language'];
                $insertdata['defaultvalue'] = $answerrowdata['answer'];
                $qres = Defaultvalues::model()->insertRecords($insertdata) or safeDie("Error: Failed to insert defaultvalue <br />");
            }
            // translate internal links
            if ($bTranslateLinks) {
                $answerrowdata['answer'] = translateLinks('survey', $iOldSID, $iNewSID, $answerrowdata['answer']);
            }
            // Everything set - now insert it
            $answerrowdata = array_map('convertCSVReturnToReturn', $answerrowdata);
            if ($qtypes[$oldquestion['newtype']]['subquestions'] > 0) {
                $questionrowdata = array();
                if (isset($aSQIDReplacements[$answerrowdata['code'] . $answerrowdata['qid']])) {
                    $questionrowdata['qid'] = $aSQIDReplacements[$answerrowdata['code'] . $answerrowdata['qid']];
                }
                $questionrowdata['parent_qid'] = $answerrowdata['qid'];
                $questionrowdata['sid'] = $iNewSID;
                $questionrowdata['gid'] = $oldquestion['gid'];
                $questionrowdata['title'] = $answerrowdata['code'];
                $questionrowdata['question'] = $answerrowdata['answer'];
                $questionrowdata['question_order'] = $answerrowdata['sortorder'];
                $questionrowdata['language'] = $answerrowdata['language'];
                $questionrowdata['type'] = $oldquestion['newtype'];
                if (isset($questionrowdata['qid'])) {
                    switchMSSQLIdentityInsert('questions', true);
                }
                if ($questionrowdata) {
                    XSSFilterArray($questionrowdata);
                }
                $qres = Questions::model()->insertRecords($questionrowdata) or safeDie("Error: Failed to insert subquestion <br />");
                if (!isset($questionrowdata['qid'])) {
                    $aSQIDReplacements[$answerrowdata['code'] . $answerrowdata['qid']] = Yii::app()->db->createCommand('Select LAST_INSERT_ID()')->query()->read();
                    $aSQIDReplacements[$answerrowdata['code'] . $answerrowdata['qid']] = $aSQIDReplacements[$answerrowdata['code'] . $answerrowdata['qid']]['LAST_INSERT_ID()'];
                } else {
                    switchMSSQLIdentityInsert('questions', false);
                }
                $results['subquestions']++;
                // also convert default values subquestions for multiple choice
                if ($answerrowdata['default_value'] == 'Y' && ($oldquestion['newtype'] == 'M' || $oldquestion['newtype'] == 'P')) {
                    $insertdata = array();
                    $insertdata['qid'] = $newqid;
                    $insertdata['sqid'] = $aSQIDReplacements[$answerrowdata['code']];
                    $insertdata['language'] = $answerrowdata['language'];
                    $insertdata['defaultvalue'] = 'Y';
                    if ($insertdata) {
                        XSSFilterArray($insertdata);
                    }
                    $qres = Defaultvalues::model()->insertRecords($insertdata) or safeDie("Error: Failed to insert defaultvalue <br />");
                }
            } else {
                unset($answerrowdata['default_value']);
                if ($answerrowdata) {
                    XSSFilterArray($answerrowdata);
                }
                $ares = Answers::model()->insertRecords($answerrowdata) or safeDie("Error: Failed to insert answer<br />");
                $results['answers']++;
            }
        }
    }
    // get all group ids and fix questions inside each group
    $gquery = "SELECT gid FROM {{groups}} where sid={$iNewSID} group by gid ORDER BY gid";
    //Get last question added (finds new qid)
    $gres = Yii::app()->db->createCommand($gquery)->query();
    foreach ($gres->readAll() as $grow) {
        Questions::model()->updateQuestionOrder($grow['gid'], $iNewSID);
    }
    //We've built two arrays along the way - one containing the old SID, GID and QIDs - and their NEW equivalents
    //and one containing the old 'extended fieldname' and its new equivalent.  These are needed to import conditions and question_attributes.
    if (isset($question_attributesarray) && $question_attributesarray) {
        //ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUES
        $fieldorders = convertCSVRowToArray($question_attributesarray[0], ',', '"');
        unset($question_attributesarray[0]);
        foreach ($question_attributesarray as $qar) {
            $fieldcontents = convertCSVRowToArray($qar, ',', '"');
            $qarowdata = array_combine($fieldorders, $fieldcontents);
            $newqid = "";
            $qarowdata["qid"] = $aQIDReplacements[$qarowdata["qid"]];
            unset($qarowdata["qaid"]);
            $result = Question_attributes::model()->insertRecords($qarowdata);
            if ($result > 0) {
                $importresults['question_attributes']++;
            }
        }
    }
    if (isset($assessmentsarray) && $assessmentsarray) {
        //ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUTES
        $fieldorders = convertCSVRowToArray($assessmentsarray[0], ',', '"');
        unset($assessmentsarray[0]);
        foreach ($assessmentsarray as $qar) {
            $fieldcontents = convertCSVRowToArray($qar, ',', '"');
            $asrowdata = array_combine($fieldorders, $fieldcontents);
            if (isset($asrowdata['link'])) {
                if (trim($asrowdata['link']) != '') {
                    $asrowdata['message'] = $asrowdata['message'] . '<br /><a href="' . $asrowdata['link'] . '">' . $asrowdata['link'] . '</a>';
                }
                unset($asrowdata['link']);
            }
            if ($asrowdata["gid"] > 0) {
                $asrowdata["gid"] = $aGIDReplacements[$asrowdata["gid"]];
            }
            $asrowdata["sid"] = $iNewSID;
            unset($asrowdata["id"]);
            $result = Assessments::model()->insertRecords($asrowdata) or safeDie("Couldn't insert assessment<br />");
            unset($newgid);
        }
    }
    if (isset($quotaarray) && $quotaarray) {
        //ONLY DO THIS IF THERE ARE QUOTAS
        $fieldorders = convertCSVRowToArray($quotaarray[0], ',', '"');
        unset($quotaarray[0]);
        foreach ($quotaarray as $qar) {
            $fieldcontents = convertCSVRowToArray($qar, ',', '"');
            $asrowdata = array_combine($fieldorders, $fieldcontents);
            $iOldSID = $asrowdata["sid"];
            foreach ($substitutions as $subs) {
                if ($iOldSID == $subs[0]) {
                    $iNewSID = $subs[3];
                }
            }
            $asrowdata["sid"] = $iNewSID;
            $oldid = $asrowdata["id"];
            unset($asrowdata["id"]);
            $quotadata[] = $asrowdata;
            //For use later if needed
            $result = Quota::model()->insertRecords($asrowdata) or safeDie("Couldn't insert quota<br />");
            $aQuotaReplacements[$oldid] = Yii::app()->db->createCommand('Select LAST_INSERT_ID()')->query()->read();
            $aQuotaReplacements[$oldid] = $aQuotaReplacements[$oldid]['LAST_INSERT_ID()'];
        }
    }
    if (isset($quotamembersarray) && $quotamembersarray) {
        //ONLY DO THIS IF THERE ARE QUOTA MEMBERS
        $count = 0;
        foreach ($quotamembersarray as $qar) {
            $fieldorders = convertCSVRowToArray($quotamembersarray[0], ',', '"');
            $fieldcontents = convertCSVRowToArray($qar, ',', '"');
            if ($count == 0) {
                $count++;
                continue;
            }
            $asrowdata = array_combine($fieldorders, $fieldcontents);
            $iOldSID = $asrowdata["sid"];
            $newqid = "";
            $newquotaid = "";
            $oldqid = $asrowdata['qid'];
            $oldquotaid = $asrowdata['quota_id'];
            foreach ($substitutions as $subs) {
                if ($iOldSID == $subs[0]) {
                    $iNewSID = $subs[3];
                }
                if ($oldqid == $subs[2]) {
                    $newqid = $subs[5];
                }
            }
            $newquotaid = $aQuotaReplacements[$oldquotaid];
            $asrowdata["sid"] = $iNewSID;
            $asrowdata["qid"] = $newqid;
            $asrowdata["quota_id"] = $newquotaid;
            unset($asrowdata["id"]);
            $result = Quota_members::model()->insertRecords($asrowdata) or safeDie("Couldn't insert quota<br />");
        }
    }
    if (isset($quotalsarray) && $quotalsarray) {
        //ONLY DO THIS IF THERE ARE QUOTA LANGUAGE SETTINGS
        $count = 0;
        foreach ($quotalsarray as $qar) {
            $fieldorders = convertCSVRowToArray($quotalsarray[0], ',', '"');
            $fieldcontents = convertCSVRowToArray($qar, ',', '"');
            if ($count == 0) {
                $count++;
                continue;
            }
            $asrowdata = array_combine($fieldorders, $fieldcontents);
            $newquotaid = "";
            $oldquotaid = $asrowdata['quotals_quota_id'];
            $newquotaid = $aQuotaReplacements[$oldquotaid];
            $asrowdata["quotals_quota_id"] = $newquotaid;
            unset($asrowdata["quotals_id"]);
            $result = Quota_languagesettings::model()->insertRecords($asrowdata) or safeDie("Couldn't insert quota<br />");
        }
    }
    //if there are quotas, but no quotals, then we need to create default dummy for each quota (this handles exports from pre-language quota surveys)
    if ($importresults['quota'] > 0 && (!isset($importresults['quotals']) || $importresults['quotals'] == 0)) {
        $i = 0;
        $defaultsurveylanguage = isset($defaultsurveylanguage) ? $defaultsurveylanguage : "en";
        foreach ($aQuotaReplacements as $oldquotaid => $newquotaid) {
            $asrowdata = array("quotals_quota_id" => $newquotaid, "quotals_language" => $defaultsurveylanguage, "quotals_name" => $quotadata[$i]["name"], "quotals_message" => $clang->gT("Sorry your responses have exceeded a quota on this survey."), "quotals_url" => "", "quotals_urldescrip" => "");
            $i++;
        }
        $result = Quota_languagesettings::model()->insertRecords($asrowdata) or safeDie("Couldn't insert quota<br />");
        $countquotals = $i;
    }
    // Do conditions
    if (isset($conditionsarray) && $conditionsarray) {
        //ONLY DO THIS IF THERE ARE CONDITIONS!
        $fieldorders = convertCSVRowToArray($conditionsarray[0], ',', '"');
        unset($conditionsarray[0]);
        // Exception for conditions based on attributes
        $aQIDReplacements[0] = 0;
        foreach ($conditionsarray as $car) {
            $fieldcontents = convertCSVRowToArray($car, ',', '"');
            $conditionrowdata = array_combine($fieldorders, $fieldcontents);
            unset($conditionrowdata["cid"]);
            if (!isset($conditionrowdata["method"]) || trim($conditionrowdata["method"]) == '') {
                $conditionrowdata["method"] = '==';
            }
            if (!isset($conditionrowdata["scenario"]) || trim($conditionrowdata["scenario"]) == '') {
                $conditionrowdata["scenario"] = 1;
            }
            $oldcqid = $conditionrowdata["cqid"];
            $query = 'select gid from {{questions}} where qid=' . $aQIDReplacements[$conditionrowdata["cqid"]];
            $res = Yii::app()->db->createCommand($query)->query();
            $resrow = $res->read();
            $oldgid = array_search($resrow['gid'], $aGIDReplacements);
            $conditionrowdata["qid"] = $aQIDReplacements[$conditionrowdata["qid"]];
            $conditionrowdata["cqid"] = $aQIDReplacements[$conditionrowdata["cqid"]];
            $oldcfieldname = $conditionrowdata["cfieldname"];
            $conditionrowdata["cfieldname"] = str_replace($iOldSID . 'X' . $oldgid . 'X' . $oldcqid, $iNewSID . 'X' . $aGIDReplacements[$oldgid] . 'X' . $conditionrowdata["cqid"], $conditionrowdata["cfieldname"]);
            $result = Conditions::model()->insertRecords($conditionrowdata) or safeDie("Couldn't insert condition<br />");
        }
    }
    LimeExpressionManager::RevertUpgradeConditionsToRelevance($iNewSID);
    LimeExpressionManager::UpgradeConditionsToRelevance($iNewSID);
    LimeExpressionManager::SetSurveyId($iNewSID);
    $importresults['importversion'] = $importversion;
    $importresults['newsid'] = $iNewSID;
    $importresults['oldsid'] = $iOldSID;
    return $importresults;
}
示例#2
0
                    {
                        $ignoredcolumns[]=$fieldname;
                    }
                }
                if (!in_array('firstname',$firstline) || !in_array('lastname',$firstline) || !in_array('email',$firstline))
                {
                    $tokenoutput .= "<div class='warningheader'>".$clang->gT("Error: Your uploaded file is missing one or more of the mandatory columns: 'firstname', 'lastname' or 'email'")."</div><br />";
                    $recordcount=count($tokenlistarray);
                    break;
                }

            }
            else
            {

                $line = convertCSVRowToArray($buffer,$separator,'"');

                if (count($firstline)!=count($line))
                {
                    $invalidformatlist[]=$recordcount;
                    $recordcount++;
                    continue;
                }
                $writearray=array_combine($firstline,$line);

                //kick out ignored columns
                foreach ($ignoredcolumns  as $column)
                {
                    unset($writearray[$column]);
                }
                $dupfound=false;
/**
*  Checks that each object from an array of CSV data [question-rows,answer-rows,labelsets-row] supports at least a given language
*
* @param mixed $csvarray array with a line of csv data per row
* @param mixed $idkeysarray  array of integers giving the csv-row numbers of the object keys
* @param mixed $langfieldnum  integer giving the csv-row number of the language(s) filed
*        ==> the language field  can be a single language code or a
*            space separated language code list
* @param mixed $langcode  the language code to be tested
* @param mixed $hasheader  if we should strip off the first line (if it contains headers)
*/
function doesImportArraySupportLanguage($csvarray, $idkeysarray, $langfieldnum, $langcode, $hasheader = false)
{
    // An array with one row per object id and langsupport status as value
    $objlangsupportarray = array();
    if ($hasheader === true) {
        // stripping first row to skip headers if any
        array_shift($csvarray);
    }
    foreach ($csvarray as $csvrow) {
        $rowcontents = convertCSVRowToArray($csvrow, ',', '"');
        $rowid = "";
        foreach ($idkeysarray as $idfieldnum) {
            $rowid .= $rowcontents[$idfieldnum] . "-";
        }
        $rowlangarray = explode(" ", @$rowcontents[$langfieldnum]);
        if (!isset($objlangsupportarray[$rowid])) {
            if (array_search($langcode, $rowlangarray) !== false) {
                $objlangsupportarray[$rowid] = "true";
            } else {
                $objlangsupportarray[$rowid] = "false";
            }
        } else {
            if ($objlangsupportarray[$rowid] == "false" && array_search($langcode, $rowlangarray) !== false) {
                $objlangsupportarray[$rowid] = "true";
            }
        }
    }
    // end foreach rown
    // If any of the object doesn't support the given language, return false
    if (array_search("false", $objlangsupportarray) === false) {
        return true;
    } else {
        return false;
    }
}
示例#4
0
function CSVImportLabelset($sFullFilepath, $options)
{
    global $dbprefix, $connect, $clang;
    $results['labelsets'] = 0;
    $results['labels'] = 0;
    $results['warnings'] = array();
    $csarray = buildLabelSetCheckSumArray();
    //$csarray is now a keyed array with the Checksum of each of the label sets, and the lid as the key
    $handle = fopen($sFullFilepath, "r");
    while (!feof($handle)) {
        $buffer = fgets($handle);
        //To allow for very long survey welcomes (up to 10k)
        $bigarray[] = $buffer;
    }
    fclose($handle);
    if (substr($bigarray[0], 0, 27) != "# LimeSurvey Label Set Dump" && substr($bigarray[0], 0, 28) != "# PHPSurveyor Label Set Dump") {
        $results['fatalerror'] = $clang->gT("This file is not a LimeSurvey label set file. Import failed.");
        return $results;
    }
    for ($i = 0; $i < 9; $i++) {
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //LABEL SETS
    if (array_search("# LABELS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# LABELS TABLE\n", $bigarray);
    } elseif (array_search("# LABELS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $labelsetsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //LABELS
    $stoppoint = count($bigarray) - 1;
    for ($i = 0; $i < $stoppoint; $i++) {
        // do not import empty lines
        if (trim($bigarray[$i]) != '') {
            $labelsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $countlabelsets = count($labelsetsarray) - 1;
    $countlabels = count($labelsarray) - 1;
    if (isset($labelsetsarray) && $labelsetsarray) {
        $count = 0;
        foreach ($labelsetsarray as $lsa) {
            $fieldorders = convertCSVRowToArray($labelsetsarray[0], ',', '"');
            $fieldcontents = convertCSVRowToArray($lsa, ',', '"');
            if ($count == 0) {
                $count++;
                continue;
            }
            $labelsetrowdata = array_combine($fieldorders, $fieldcontents);
            // Save old labelid
            $oldlid = $labelsetrowdata['lid'];
            // set the new language
            unset($labelsetrowdata['lid']);
            $newvalues = array_values($labelsetrowdata);
            $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
            // quote everything accordingly
            $lsainsert = "insert INTO {$dbprefix}labelsets (" . implode(',', array_keys($labelsetrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
            //handle db prefix
            $lsiresult = $connect->Execute($lsainsert);
            $results['labelsets']++;
            // Get the new insert id for the labels inside this labelset
            $newlid = $connect->Insert_ID("{$dbprefix}labelsets", 'lid');
            if ($labelsarray) {
                $count = 0;
                $lfieldorders = convertCSVRowToArray($labelsarray[0], ',', '"');
                unset($labelsarray[0]);
                foreach ($labelsarray as $la) {
                    $lfieldcontents = convertCSVRowToArray($la, ',', '"');
                    // Combine into one array with keys and values since its easier to handle
                    $labelrowdata = array_combine($lfieldorders, $lfieldcontents);
                    $labellid = $labelrowdata['lid'];
                    if ($labellid == $oldlid) {
                        $labelrowdata['lid'] = $newlid;
                        // translate internal links
                        $labelrowdata['title'] = translink('label', $oldlid, $newlid, $labelrowdata['title']);
                        if (!isset($labelrowdata["assessment_value"])) {
                            $labelrowdata["assessment_value"] = (int) $labelrowdata["code"];
                        }
                        $newvalues = array_values($labelrowdata);
                        $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
                        // quote everything accordingly
                        $lainsert = "insert INTO {$dbprefix}labels (" . implode(',', array_keys($labelrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
                        //handle db prefix
                        $liresult = $connect->Execute($lainsert);
                        $results['labels']++;
                    }
                }
            }
            //CHECK FOR DUPLICATE LABELSETS
            if (isset($_POST['checkforduplicates'])) {
                $thisset = "";
                $query2 = "SELECT code, title, sortorder, language, assessment_value\n                           FROM " . db_table_name('labels') . "\n                           WHERE lid=" . $newlid . "\n                           ORDER BY language, sortorder, code";
                $result2 = db_execute_num($query2) or safe_die("Died querying labelset {$lid}<br />{$query2}<br />" . $connect->ErrorMsg());
                while ($row2 = $result2->FetchRow()) {
                    $thisset .= implode('.', $row2);
                }
                // while
                $newcs = dechex(crc32($thisset) * 1);
                unset($lsmatch);
                if (isset($csarray) && $options['checkforduplicates'] == 'on') {
                    foreach ($csarray as $key => $val) {
                        //			echo $val."-".$newcs."<br/>";  For debug purposes
                        if ($val == $newcs) {
                            $lsmatch = $key;
                        }
                    }
                }
                if (isset($lsmatch)) {
                    //There is a matching labelset. So, we will delete this one and refer
                    //to the matched one.
                    $query = "DELETE FROM {$dbprefix}labels WHERE lid={$newlid}";
                    $result = $connect->Execute($query) or safe_die("Couldn't delete labels<br />{$query}<br />" . $connect->ErrorMsg());
                    $query = "DELETE FROM {$dbprefix}labelsets WHERE lid={$newlid}";
                    $result = $connect->Execute($query) or safe_die("Couldn't delete labelset<br />{$query}<br />" . $connect->ErrorMsg());
                    $newlid = $lsmatch;
                    $results['warnings'][] = $clang->gT("Label set was not imported because the same label set already exists.") . " " . sprintf($clang->gT("Existing LID: %s"), $newlid);
                }
                //END CHECK FOR DUPLICATES
            }
        }
    }
    return $results;
}
 function uploadCSV()
 {
     $clang = $this->getController()->lang;
     unset(Yii::app()->session['summary']);
     $characterset = Yii::app()->request->getPost('characterset');
     $separator = Yii::app()->request->getPost('separatorused');
     $newarray = Yii::app()->request->getPost('newarray');
     $mappedarray = Yii::app()->request->getPost('mappedarray', false);
     $filterblankemails = Yii::app()->request->getPost('filterbea');
     $overwrite = Yii::app()->request->getPost('overwrite');
     $sFilePath = Yii::app()->getConfig('tempdir') . '/' . basename(Yii::app()->request->getPost('fullfilepath'));
     $errorinupload = "";
     $recordcount = 0;
     $mandatory = 0;
     $mincriteria = 0;
     $imported = 0;
     $dupcount = 0;
     $overwritten = 0;
     $dupreason = "nameemail";
     //Default duplicate comparison method
     $duplicatelist = array();
     $invalidemaillist = array();
     $invalidformatlist = array();
     $invalidattribute = array();
     $invalidparticipantid = array();
     $aGlobalErrors = array();
     /* If no mapped array */
     if (!$mappedarray) {
         $mappedarray = array();
     }
     /* Adjust system settings to read file with MAC line endings */
     @ini_set('auto_detect_line_endings', true);
     /* Open the uploaded file into an array */
     $tokenlistarray = file($sFilePath);
     // open it and trim the endings
     $separator = Yii::app()->request->getPost('separatorused');
     $uploadcharset = Yii::app()->request->getPost('characterset');
     /* The $newarray contains a list of fields that will be used
        to create new attributes */
     if (!empty($newarray)) {
         /* Create a new entry in the lime_participant_attribute_names table,
            and it's associated lime_participant_attribute_names_lang table
            for each NEW attribute being created in this import process */
         foreach ($newarray as $key => $value) {
             $aData = array('attribute_type' => 'TB', 'attribute_name' => $value, 'visible' => 'FALSE');
             $insertid = ParticipantAttributeName::model()->storeAttributeCSV($aData);
             /* Keep a record of the attribute_id for this new attribute
                in the $mappedarray string. For example, if the new attribute
                has attribute_id of 35 and is called "gender",
                $mappedarray['35']='gender' */
             $mappedarray[$insertid] = $value;
         }
     }
     if (!isset($uploadcharset)) {
         $uploadcharset = 'auto';
     }
     foreach ($tokenlistarray as $buffer) {
         //Iterate through the CSV file line by line
         $buffer = @mb_convert_encoding($buffer, "UTF-8", $uploadcharset);
         $firstname = "";
         $lastname = "";
         $email = "";
         $language = "";
         if ($recordcount == 0) {
             //The first time we iterate through the file we look at the very
             //first line, which contains field names, not values to import
             // Pick apart the first line
             $buffer = removeBOM($buffer);
             $attrid = ParticipantAttributeName::model()->getAttributeID();
             $allowedfieldnames = array('participant_id', 'firstname', 'lastname', 'email', 'language', 'blacklisted');
             $aFilterDuplicateFields = array('firstname', 'lastname', 'email');
             if (!empty($mappedarray)) {
                 foreach ($mappedarray as $key => $value) {
                     array_push($allowedfieldnames, strtolower($value));
                 }
             }
             //For Attributes
             switch ($separator) {
                 case 'comma':
                     $separator = ',';
                     break;
                 case 'semicolon':
                     $separator = ';';
                     break;
                 default:
                     $comma = substr_count($buffer, ',');
                     $semicolon = substr_count($buffer, ';');
                     if ($semicolon > $comma) {
                         $separator = ';';
                     } else {
                         $separator = ',';
                     }
             }
             $firstline = convertCSVRowToArray($buffer, $separator, '"');
             $firstline = array_map('trim', $firstline);
             $ignoredcolumns = array();
             //now check the first line for invalid fields
             foreach ($firstline as $index => $fieldname) {
                 $firstline[$index] = preg_replace("/(.*) <[^,]*>\$/", "\$1", $fieldname);
                 $fieldname = $firstline[$index];
                 if (!in_array(strtolower($fieldname), $allowedfieldnames) && !in_array($fieldname, $mappedarray)) {
                     $ignoredcolumns[] = $fieldname;
                 } else {
                     $firstline[$index] = strtolower($fieldname);
                 }
             }
             if (!in_array('firstname', $firstline) && !in_array('lastname', $firstline) && !in_array('email', $firstline) && !in_array('participant_id', $firstline)) {
                 $recordcount = count($tokenlistarray);
                 break;
             }
         } else {
             // After looking at the first line, we now import the actual values
             $line = convertCSVRowToArray($buffer, $separator, '"');
             if (count($firstline) != count($line)) {
                 $invalidformatlist[] = $recordcount;
                 continue;
             }
             $writearray = array_combine($firstline, $line);
             //kick out ignored columns
             foreach ($ignoredcolumns as $column) {
                 unset($writearray[$column]);
             }
             // Add aFilterDuplicateFields not in CSV to writearray : quick fix
             foreach ($aFilterDuplicateFields as $sFilterDuplicateField) {
                 if (!in_array($sFilterDuplicateField, $firstline)) {
                     $writearray[$sFilterDuplicateField] = "";
                 }
             }
             $invalidemail = false;
             $dupfound = false;
             $thisduplicate = 0;
             //Check for duplicate participants
             $aData = array('firstname' => $writearray['firstname'], 'lastname' => $writearray['lastname'], 'email' => $writearray['email'], 'owner_uid' => Yii::app()->session['loginID']);
             //HACK - converting into SQL instead of doing an array search
             if (in_array('participant_id', $firstline)) {
                 $dupreason = "participant_id";
                 $aData = "participant_id = " . Yii::app()->db->quoteValue($writearray['participant_id']);
             } else {
                 $dupreason = "nameemail";
                 $aData = "firstname = " . Yii::app()->db->quoteValue($writearray['firstname']) . " AND lastname = " . Yii::app()->db->quoteValue($writearray['lastname']) . " AND email = " . Yii::app()->db->quoteValue($writearray['email']) . " AND owner_uid = '" . Yii::app()->session['loginID'] . "'";
             }
             //End of HACK
             $aData = Participant::model()->checkforDuplicate($aData, "participant_id");
             if ($aData !== false) {
                 $thisduplicate = 1;
                 $dupcount++;
                 if ($overwrite == "true") {
                     //Although this person already exists, we want to update the mapped attribute values
                     if (!empty($mappedarray)) {
                         //The mapped array contains the attributes we are
                         //saving in this import
                         foreach ($mappedarray as $attid => $attname) {
                             if (!empty($attname)) {
                                 $bData = array('participant_id' => $aData, 'attribute_id' => $attid, 'value' => $writearray[strtolower($attname)]);
                                 ParticipantAttribute::model()->updateParticipantAttributeValue($bData);
                             } else {
                                 //If the value is empty, don't write the value
                             }
                         }
                         $overwritten++;
                     }
                 }
             }
             if ($thisduplicate == 1) {
                 $dupfound = true;
                 $duplicatelist[] = $writearray['firstname'] . " " . $writearray['lastname'] . " (" . $writearray['email'] . ")";
             }
             //Checking the email address is in a valid format
             $invalidemail = false;
             $writearray['email'] = trim($writearray['email']);
             if ($writearray['email'] != '') {
                 $aEmailAddresses = explode(';', $writearray['email']);
                 // Ignore additional email addresses
                 $sEmailaddress = $aEmailAddresses[0];
                 if (!validateEmailAddress($sEmailaddress)) {
                     $invalidemail = true;
                     $invalidemaillist[] = $line[0] . " " . $line[1] . " (" . $line[2] . ")";
                 }
             }
             if (!$dupfound && !$invalidemail) {
                 //If it isn't a duplicate value or an invalid email, process the entry as a new participant
                 //First, process the known fields
                 if (!isset($writearray['participant_id']) || $writearray['participant_id'] == "") {
                     $uuid = $this->gen_uuid();
                     //Generate a UUID for the new participant
                     $writearray['participant_id'] = $uuid;
                 }
                 if (isset($writearray['emailstatus']) && trim($writearray['emailstatus'] == '')) {
                     unset($writearray['emailstatus']);
                 }
                 if (!isset($writearray['language']) || $writearray['language'] == "") {
                     $writearray['language'] = "en";
                 }
                 if (!isset($writearray['blacklisted']) || $writearray['blacklisted'] == "") {
                     $writearray['blacklisted'] = "N";
                 }
                 $writearray['owner_uid'] = Yii::app()->session['loginID'];
                 if (isset($writearray['validfrom']) && trim($writearray['validfrom'] == '')) {
                     unset($writearray['validfrom']);
                 }
                 if (isset($writearray['validuntil']) && trim($writearray['validuntil'] == '')) {
                     unset($writearray['validuntil']);
                 }
                 $dontimport = false;
                 if ($filterblankemails == "accept" && $writearray['email'] == "" || $writearray['firstname'] == "" || $writearray['lastname'] == "") {
                     //The mandatory fields of email, firstname and lastname
                     //must be filled, but one or more are empty
                     $mandatory++;
                     $dontimport = true;
                 } else {
                     foreach ($writearray as $key => $value) {
                         if (!empty($mappedarray)) {
                             //The mapped array contains the attributes we are
                             //saving in this import
                             if (in_array($key, $allowedfieldnames)) {
                                 foreach ($mappedarray as $attid => $attname) {
                                     if (strtolower($attname) == $key) {
                                         if (!empty($value)) {
                                             $aData = array('participant_id' => $writearray['participant_id'], 'attribute_id' => $attid, 'value' => $value);
                                             ParticipantAttributeName::model()->saveParticipantAttributeValue($aData);
                                         } else {
                                             //If the value is empty, don't write the value
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
                 //If any of the mandatory fields are blank, then don't import this user
                 if (!$dontimport) {
                     Participant::model()->insertParticipantCSV($writearray);
                     $imported++;
                 }
             }
             $mincriteria++;
         }
         $recordcount++;
     }
     unlink($sFilePath);
     $aData = array();
     $aData['clang'] = $clang;
     $aData['recordcount'] = $recordcount - 1;
     $aData['duplicatelist'] = $duplicatelist;
     $aData['mincriteria'] = $mincriteria;
     $aData['imported'] = $imported;
     $aData['errorinupload'] = $errorinupload;
     $aData['invalidemaillist'] = $invalidemaillist;
     $aData['mandatory'] = $mandatory;
     $aData['invalidattribute'] = $invalidattribute;
     $aData['invalidparticipantid'] = $invalidparticipantid;
     $aData['overwritten'] = $overwritten;
     $aData['dupreason'] = $dupreason;
     $aData['aGlobalErrors'] = $aGlobalErrors;
     $this->getController()->renderPartial('/admin/participants/uploadSummary_view', $aData);
 }
/**
* This function imports the old CSV data from 1.50 to 1.87 or older. Starting with 1.90 (DBVersion 143) there is an XML format instead
*
* @param array $sFullFilepath
* @returns array Information of imported questions/answers/etc.
*/
function CSVImportSurvey($sFullFilepath,$iDesiredSurveyId=NULL)
{
    global $dbprefix, $connect, $timeadjust, $clang;

    $handle = fopen($sFullFilepath, "r");
    while (!feof($handle))
    {

        $buffer = fgets($handle);
        $bigarray[] = $buffer;
    }
    fclose($handle);

    $aIgnoredAnswers=array();
    $aSQIDReplacements=array();
    $aLIDReplacements=array();
    $aGIDReplacements=array();
    $substitutions=array();
    $aQuotaReplacements=array();
    $importresults['error']=false;
    $importresults['importwarnings']=array();
    $importresults['question_attributes']=0;

    if (isset($bigarray[0])) $bigarray[0]=removeBOM($bigarray[0]);

    // Now we try to determine the dataformat of the survey file.
    $importversion=0;
    if (isset($bigarray[1]) && isset($bigarray[4])&& (substr($bigarray[1], 0, 22) == "# SURVEYOR SURVEY DUMP"))
    {
        $importversion = 100;  // Version 0.99 or  1.0 file
    }
    elseif
    (substr($bigarray[0], 0, 24) == "# LimeSurvey Survey Dump" || substr($bigarray[0], 0, 25) == "# PHPSurveyor Survey Dump")
    {  // Seems to be a >1.0 version file - these files carry the version information to read in line two
        $importversion=substr($bigarray[1], 12, 3);
    }
    else    // unknown file - show error message
    {
        $importresults['error'] = $clang->gT("This file is not a LimeSurvey survey file. Import failed.")."\n";
        return $importresults;
    }

    if  ((int)$importversion<112)
    {
        $importresults['error'] = $clang->gT("This file is too old. Only files from LimeSurvey version 1.50 (DBVersion 112) and newer are supported.");
        return $importresults;
    }

    // okay.. now lets drop the first 9 lines and get to the data
    // This works for all versions
    for ($i=0; $i<9; $i++)
    {
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);


    //SURVEYS
    if (array_search("# GROUPS TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# GROUPS TABLE\n", $bigarray);
    }
    elseif (array_search("# GROUPS TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# GROUPS TABLE\r\n", $bigarray);
    }
    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        if ($i<$stoppoint-2) {$surveyarray[] = $bigarray[$i];}
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);

    //GROUPS
    if (array_search("# QUESTIONS TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# QUESTIONS TABLE\n", $bigarray);
    }
    elseif (array_search("# QUESTIONS TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# QUESTIONS TABLE\r\n", $bigarray);
    }
    else
    {
        $stoppoint = count($bigarray)-1;
    }
    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        if ($i<$stoppoint-2) {$grouparray[] = $bigarray[$i];}
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);

    //QUESTIONS
    if (array_search("# ANSWERS TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# ANSWERS TABLE\n", $bigarray);
    }
    elseif (array_search("# ANSWERS TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# ANSWERS TABLE\r\n", $bigarray);
    }
    else
    {
        $stoppoint = count($bigarray)-1;
    }
    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        if ($i<$stoppoint-2)
        {
            $questionarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);

    //ANSWERS
    if (array_search("# CONDITIONS TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# CONDITIONS TABLE\n", $bigarray);
    }
    elseif (array_search("# CONDITIONS TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# CONDITIONS TABLE\r\n", $bigarray);
    }
    else
    {
        $stoppoint = count($bigarray)-1;
    }
    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        if ($i<$stoppoint-2)
        {
            $answerarray[] = str_replace("`default`", "`default_value`", $bigarray[$i]);
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);

    //CONDITIONS
    if (array_search("# LABELSETS TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# LABELSETS TABLE\n", $bigarray);
    }
    elseif (array_search("# LABELSETS TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# LABELSETS TABLE\r\n", $bigarray);
    }
    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        if ($i<$stoppoint-2) {$conditionsarray[] = $bigarray[$i];}
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);

    //LABELSETS
    if (array_search("# LABELS TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# LABELS TABLE\n", $bigarray);
    }
    elseif (array_search("# LABELS TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray);
    }
    else
    {
        $stoppoint = count($bigarray)-1;
    }
    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        if ($i<$stoppoint-2) {$labelsetsarray[] = $bigarray[$i];}
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);

    //LABELS
    if (array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray);
    }
    elseif (array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray);
    }
    else
    {
        $stoppoint = count($bigarray)-1;
    }

    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        if ($i<$stoppoint-2) {$labelsarray[] = $bigarray[$i];}
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);

    //Question attributes
    if (array_search("# ASSESSMENTS TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# ASSESSMENTS TABLE\n", $bigarray);
    }
    elseif (array_search("# ASSESSMENTS TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# ASSESSMENTS TABLE\r\n", $bigarray);
    }
    else
    {
        $stoppoint = count($bigarray)-1;
    }
    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        if ($i<$stoppoint-2) {$question_attributesarray[] = $bigarray[$i];}
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);


    //ASSESSMENTS
    if (array_search("# SURVEYS_LANGUAGESETTINGS TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# SURVEYS_LANGUAGESETTINGS TABLE\n", $bigarray);
    }
    elseif (array_search("# SURVEYS_LANGUAGESETTINGS TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# SURVEYS_LANGUAGESETTINGS TABLE\r\n", $bigarray);
    }
    else
    {
        $stoppoint = count($bigarray)-1;
    }
    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        //    if ($i<$stoppoint-2 || $i==count($bigarray)-1)
        if ($i<$stoppoint-2)
        {
            $assessmentsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);

    //LANGAUGE SETTINGS
    if (array_search("# QUOTA TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# QUOTA TABLE\n", $bigarray);
    }
    elseif (array_search("# QUOTA TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# QUOTA TABLE\r\n", $bigarray);
    }
    else
    {
        $stoppoint = count($bigarray)-1;
    }
    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        //    if ($i<$stoppoint-2 || $i==count($bigarray)-1)
        //$bigarray[$i]=        trim($bigarray[$i]);
        if (isset($bigarray[$i]) && (trim($bigarray[$i])!=''))
        {
            if (strpos($bigarray[$i],"#")===0)
            {
                unset($bigarray[$i]);
                unset($bigarray[$i+1]);
                unset($bigarray[$i+2]);
                break ;
            }
            else
            {
                $surveylsarray[] = $bigarray[$i];
            }
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);

    //QUOTA
    if (array_search("# QUOTA_MEMBERS TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# QUOTA_MEMBERS TABLE\n", $bigarray);
    }
    elseif (array_search("# QUOTA_MEMBERS TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# QUOTA_MEMBERS TABLE\r\n", $bigarray);
    }
    else
    {
        $stoppoint = count($bigarray)-1;
    }
    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        //    if ($i<$stoppoint-2 || $i==count($bigarray)-1)
        if ($i<$stoppoint-2)
        {
            $quotaarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);

    //QUOTA MEMBERS
    if (array_search("# QUOTA_LANGUAGESETTINGS TABLE\n", $bigarray))
    {
        $stoppoint = array_search("# QUOTA_LANGUAGESETTINGS TABLE\n", $bigarray);
    }
    elseif (array_search("# QUOTA_LANGUAGESETTINGS TABLE\r\n", $bigarray))
    {
        $stoppoint = array_search("# QUOTA_LANGUAGESETTINGS TABLE\r\n", $bigarray);
    }
    else
    {
        $stoppoint = count($bigarray)-1;
    }
    for ($i=0; $i<=$stoppoint+1; $i++)
    {
        //    if ($i<$stoppoint-2 || $i==count($bigarray)-1)
        if ($i<$stoppoint-2)
        {
            $quotamembersarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);


    //Whatever is the last table - currently
    //QUOTA LANGUAGE SETTINGS
    $stoppoint = count($bigarray)-1;
    for ($i=0; $i<$stoppoint-1; $i++)
    {
        if ($i<=$stoppoint) {$quotalsarray[] = $bigarray[$i];}
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);

    if (isset($surveyarray)) {$importresults['surveys'] = count($surveyarray);} else {$importresults['surveys'] = 0;}
    if (isset($surveylsarray)) {$importresults['languages'] = count($surveylsarray)-1;} else {$importresults['languages'] = 1;}
    if (isset($grouparray)) {$importresults['groups'] = count($grouparray)-1;} else {$importresults['groups'] = 0;}
    if (isset($questionarray)) {$importresults['questions'] = count($questionarray);} else {$importresults['questions']=0;}
    if (isset($answerarray)) {$importresults['answers'] = count($answerarray);} else {$importresults['answers']=0;}
    if (isset($conditionsarray)) {$importresults['conditions'] = count($conditionsarray);} else {$importresults['conditions']=0;}
    if (isset($labelsetsarray)) {$importresults['labelsets'] = count($labelsetsarray);} else {$importresults['labelsets']=0;}
    if (isset($assessmentsarray)) {$importresults['assessments']=count($assessmentsarray);} else {$importresults['assessments']=0;}
    if (isset($quotaarray)) {$importresults['quota']=count($quotaarray);} else {$importresults['quota']=0;}
    if (isset($quotamembersarray)) {$importresults['quotamembers']=count($quotamembersarray);} else {$importresults['quotamembers']=0;}
    if (isset($quotalsarray)) {$importresults['quotals']=count($quotalsarray);} else {$importresults['quotals']=0;}

    // CREATE SURVEY

    if ($importresults['surveys']>0){$importresults['surveys']--;};
    if ($importresults['answers']>0){$importresults['answers']=($importresults['answers']-1)/$importresults['languages'];};
    if ($importresults['groups']>0){$countgroups=($importresults['groups']-1)/$importresults['languages'];};
    if ($importresults['questions']>0){$importresults['questions']=($importresults['questions']-1)/$importresults['languages'];};
    if ($importresults['assessments']>0){$importresults['assessments']--;};
    if ($importresults['conditions']>0){$importresults['conditions']--;};
    if ($importresults['labelsets']>0){$importresults['labelsets']--;};
    if ($importresults['quota']>0){$importresults['quota']--;};
    $sfieldorders  =convertCSVRowToArray($surveyarray[0],',','"');
    $sfieldcontents=convertCSVRowToArray($surveyarray[1],',','"');
    $surveyrowdata=array_combine($sfieldorders,$sfieldcontents);
    $oldsid=$surveyrowdata["sid"];

    if($iDesiredSurveyId!=NULL)
        $oldsid = $iDesiredSurveyId;

    if (!$oldsid)
    {
        if ($importingfrom == "http")
        {
            $importsurvey .= "<br /><div class='warningheader'>".$clang->gT("Error")."</div><br />\n";
            $importsurvey .= $clang->gT("Import of this survey file failed")."<br />\n";
            $importsurvey .= $clang->gT("File does not contain LimeSurvey data in the correct format.")."<br /><br />\n"; //Couldn't find the SID - cannot continue
            $importsurvey .= "<input type='submit' value='".$clang->gT("Main Admin Screen")."' onclick=\"window.open('$scriptname', '_top')\" />\n";
            $importsurvey .= "</div>\n";
            unlink($sFullFilepath); //Delete the uploaded file
            return;
        }
        else
        {
            echo $clang->gT("Import of this survey file failed")."\n".$clang->gT("File does not contain LimeSurvey data in the correct format.")."\n";
            return;
        }
    }

    $newsid = GetNewSurveyID($oldsid);

    $insert=$surveyarray[0];
    $sfieldorders  =convertCSVRowToArray($surveyarray[0],',','"');
    $sfieldcontents=convertCSVRowToArray($surveyarray[1],',','"');
    $surveyrowdata=array_combine($sfieldorders,$sfieldcontents);
    // Set new owner ID
    $surveyrowdata['owner_id']=$_SESSION['loginID'];
    // Set new survey ID
    $surveyrowdata['sid']=$newsid;
    $surveyrowdata['active']='N';

    if (validate_templatedir($surveyrowdata['template'])!==$surveyrowdata['template']) $importresults['importwarnings'][] = sprintf($clang->gT('Template %s not found, please review when activating.'),$surveyrowdata['template']);

    if (isset($surveyrowdata['datecreated'])) {$surveyrowdata['datecreated']=$connect->BindTimeStamp($surveyrowdata['datecreated']);}
    unset($surveyrowdata['expires']);
    unset($surveyrowdata['attribute1']);
    unset($surveyrowdata['attribute2']);
    unset($surveyrowdata['usestartdate']);
    unset($surveyrowdata['notification']);
    unset($surveyrowdata['useexpiry']);
    unset($surveyrowdata['url']);
    unset($surveyrowdata['lastpage']);
    if (isset($surveyrowdata['private'])){
        $surveyrowdata['anonymized']=$surveyrowdata['private'];
        unset($surveyrowdata['private']);
    }
    if (isset($surveyrowdata['startdate'])) {unset($surveyrowdata['startdate']);}
    $surveyrowdata['bounce_email']=$surveyrowdata['adminemail'];
    if (!isset($surveyrowdata['datecreated']) || $surveyrowdata['datecreated']=='' || $surveyrowdata['datecreated']=='null') {$surveyrowdata['datecreated']=$connect->BindTimeStamp(date_shift(date("Y-m-d H:i:s"), "Y-m-d", $timeadjust));}

    $values=array_values($surveyrowdata);
    $values=array_map(array(&$connect, "qstr"),$values); // quote everything accordingly
    $insert = "INSERT INTO {$dbprefix}surveys (".implode(',',array_keys($surveyrowdata)).") VALUES (".implode(',',$values).")"; //handle db prefix
    $iresult = $connect->Execute($insert) or safe_die("<br />".$clang->gT("Import of this survey file failed")."<br />\n[$insert]<br />{$surveyarray[0]}<br /><br />\n" . $connect->ErrorMsg());

    // Now import the survey language settings
    $fieldorders=convertCSVRowToArray($surveylsarray[0],',','"');
    unset($surveylsarray[0]);
    foreach ($surveylsarray as $slsrow) {
        $fieldcontents=convertCSVRowToArray($slsrow,',','"');
        $surveylsrowdata=array_combine($fieldorders,$fieldcontents);
        // convert back the '\'.'n' char from the CSV file to true return char "\n"
        $surveylsrowdata=array_map('convertCsvreturn2return', $surveylsrowdata);
        // Convert the \n return char from welcometext to <br />

        // translate internal links
        $surveylsrowdata['surveyls_title']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_title']);
        $surveylsrowdata['surveyls_description']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_description']);
        $surveylsrowdata['surveyls_welcometext']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_welcometext']);
        $surveylsrowdata['surveyls_urldescription']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_urldescription']);
        $surveylsrowdata['surveyls_email_invite']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_email_invite']);
        $surveylsrowdata['surveyls_email_remind']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_email_remind']);
        $surveylsrowdata['surveyls_email_register']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_email_register']);
        $surveylsrowdata['surveyls_email_confirm']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_email_confirm']);
        unset($surveylsrowdata['lastpage']);
        $surveylsrowdata['surveyls_survey_id']=$newsid;
        $newvalues=array_values($surveylsrowdata);
        $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly
        $lsainsert = "INSERT INTO {$dbprefix}surveys_languagesettings (".implode(',',array_keys($surveylsrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix
        $lsiresult=$connect->Execute($lsainsert) or safe_die("<br />".$clang->gT("Import of this survey file failed")."<br />\n[$lsainsert]<br />\n" . $connect->ErrorMsg() );
    }

    // The survey languagesettings are imported now
    $aLanguagesSupported = array();  // this array will keep all the languages supported for the survey

    $sBaseLanguage = GetBaseLanguageFromSurveyID($newsid);
    $aLanguagesSupported[]=$sBaseLanguage;     // adds the base language to the list of supported languages
    $aLanguagesSupported=array_merge($aLanguagesSupported,GetAdditionalLanguagesFromSurveyID($newsid));


    // DO SURVEY_RIGHTS
    GiveAllSurveyPermissions($_SESSION['loginID'],$newsid);
    $importresults['deniedcountls'] =0;


    $qtypes = getqtypelist("" ,"array");
    $results['labels']=0;
    $results['labelsets']=0;
    $results['answers']=0;
    $results['subquestions']=0;

    //Do label sets
    if (isset($labelsetsarray) && $labelsetsarray)
    {
        $csarray=buildLabelSetCheckSumArray();   // build checksums over all existing labelsets
        $count=0;
        foreach ($labelsetsarray as $lsa) {
            $fieldorders  =convertCSVRowToArray($labelsetsarray[0],',','"');
            $fieldcontents=convertCSVRowToArray($lsa,',','"');
            if ($count==0) {$count++; continue;}

            $labelsetrowdata=array_combine($fieldorders,$fieldcontents);

            // Save old labelid
            $oldlid=$labelsetrowdata['lid'];

            unset($labelsetrowdata['lid']);
            $newvalues=array_values($labelsetrowdata);
            $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly
            $lsainsert = "INSERT INTO {$dbprefix}labelsets (".implode(',',array_keys($labelsetrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix
            $lsiresult=$connect->Execute($lsainsert);
            $results['labelsets']++;
            // Get the new insert id for the labels inside this labelset
            $newlid=$connect->Insert_ID("{$dbprefix}labelsets",'lid');

            if ($labelsarray) {
                $count=0;
                foreach ($labelsarray as $la) {
                    $lfieldorders  =convertCSVRowToArray($labelsarray[0],',','"');
                    $lfieldcontents=convertCSVRowToArray($la,',','"');
                    if ($count==0) {$count++; continue;}

                    // Combine into one array with keys and values since its easier to handle
                    $labelrowdata=array_combine($lfieldorders,$lfieldcontents);
                    $labellid=$labelrowdata['lid'];
                    if ($importversion<=132)
                    {
                        $labelrowdata["assessment_value"]=(int)$labelrowdata["code"];
                    }
                    if ($labellid == $oldlid) {
                        $labelrowdata['lid']=$newlid;

                        // translate internal links
                        $labelrowdata['title']=translink('label', $oldlid, $newlid, $labelrowdata['title']);

                        $newvalues=array_values($labelrowdata);
                        $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly
                        $lainsert = "INSERT INTO {$dbprefix}labels (".implode(',',array_keys($labelrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix
                        $liresult=$connect->Execute($lainsert);
                        if ($liresult!==false) $results['labels']++;
                    }
                }
            }

            //CHECK FOR DUPLICATE LABELSETS
            $thisset="";

            $query2 = "SELECT code, title, sortorder, language, assessment_value
                       FROM {$dbprefix}labels
                       WHERE lid=".$newlid."
                       ORDER BY language, sortorder, code";
            $result2 = db_execute_num($query2) or safe_die("Died querying labelset $lid<br />$query2<br />".$connect->ErrorMsg());
            while($row2=$result2->FetchRow())
            {
                $thisset .= implode('.', $row2);
            } // while
            $newcs=dechex(crc32($thisset)*1);
            unset($lsmatch);
            if (isset($csarray))
            {
                foreach($csarray as $key=>$val)
                {
                    if ($val == $newcs)
                    {
                        $lsmatch=$key;
                    }
                }
            }
            if (isset($lsmatch) || ($_SESSION['USER_RIGHT_MANAGE_LABEL'] != 1))
            {
                //There is a matching labelset or the user is not allowed to edit labels -
                // So, we will delete this one and refer to the matched one.
                $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid";
                $result=$connect->Execute($query) or safe_die("Couldn't delete labels<br />$query<br />".$connect->ErrorMsg());
                $results['labels']=$results['labels']-$connect->Affected_Rows();

                $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid";
                $result=$connect->Execute($query) or safe_die("Couldn't delete labelset<br />$query<br />".$connect->ErrorMsg());
                $results['labelsets']=$results['labelsets']-$connect->Affected_Rows();
                $newlid=$lsmatch;
            }
            else
            {
                //There isn't a matching labelset, add this checksum to the $csarray array
                $csarray[$newlid]=$newcs;
            }
            //END CHECK FOR DUPLICATES
            $aLIDReplacements[$oldlid]=$newlid;
        }
    }

    // Import groups
    if (isset($grouparray) && $grouparray)
    {
        // do GROUPS
        $gafieldorders=convertCSVRowToArray($grouparray[0],',','"');
        unset($grouparray[0]);
        foreach ($grouparray as $ga)
        {
            $gacfieldcontents=convertCSVRowToArray($ga,',','"');
            $grouprowdata=array_combine($gafieldorders,$gacfieldcontents);

            //Now an additional integrity check if there are any groups not belonging into this survey
            if ($grouprowdata['sid'] != $oldsid)
            {
                $results['fatalerror'] = $clang->gT("A group in the CSV/SQL file is not part of the same survey. The import of the survey was stopped.")."<br />\n";
                return $results;
            }
            $grouprowdata['sid']=$newsid;
            // remember group id
            $oldgid=$grouprowdata['gid'];

            //update/remove the old group id
            if (isset($aGIDReplacements[$oldgid]))
            $grouprowdata['gid'] = $aGIDReplacements[$oldgid];
            else
            unset($grouprowdata['gid']);

            // Everything set - now insert it
            $grouprowdata=array_map('convertCsvreturn2return', $grouprowdata);

            // translate internal links
            $grouprowdata['group_name']=translink('survey', $oldsid, $newsid, $grouprowdata['group_name']);
            $grouprowdata['description']=translink('survey', $oldsid, $newsid, $grouprowdata['description']);

            if (isset($grouprowdata['gid'])) db_switchIDInsert('groups',true);
            $tablename=$dbprefix.'groups';
            $ginsert = $connect->GetinsertSQL($tablename,$grouprowdata);
            $gres = $connect->Execute($ginsert) or safe_die($clang->gT('Error').": Failed to insert group<br />\n$ginsert<br />\n".$connect->ErrorMsg());
            if (isset($grouprowdata['gid'])) db_switchIDInsert('groups',false);
            //GET NEW GID
            if (!isset($grouprowdata['gid'])) {$aGIDReplacements[$oldgid]=$connect->Insert_ID("{$dbprefix}groups","gid");}
        }
        // Fix sortorder of the groups  - if users removed groups manually from the csv file there would be gaps
        fixSortOrderGroups($newsid);
    }
    // GROUPS is DONE

    // Import questions
    if (isset($questionarray) && $questionarray)
    {
        $qafieldorders=convertCSVRowToArray($questionarray[0],',','"');
        unset($questionarray[0]);
        foreach ($questionarray as $qa)
        {
            $qacfieldcontents=convertCSVRowToArray($qa,',','"');
            $questionrowdata=array_combine($qafieldorders,$qacfieldcontents);
            $questionrowdata=array_map('convertCsvreturn2return', $questionrowdata);
            $questionrowdata["type"]=strtoupper($questionrowdata["type"]);

            // Skip not supported languages
            if (!in_array($questionrowdata['language'],$aLanguagesSupported))
                continue;

            // replace the sid
            $questionrowdata["sid"] = $newsid;
            // Skip if gid is invalid
            if (!isset($aGIDReplacements[$questionrowdata['gid']])) continue;
            $questionrowdata["gid"] = $aGIDReplacements[$questionrowdata['gid']];
            if (isset($aQIDReplacements[$questionrowdata['qid']]))
            {
                $questionrowdata['qid']=$aQIDReplacements[$questionrowdata['qid']];
            }
            else
            {
                $oldqid=$questionrowdata['qid'];
                unset($questionrowdata['qid']);
            }

            unset($oldlid1); unset($oldlid2);
            if ((isset($questionrowdata['lid']) && $questionrowdata['lid']>0))
            {
                $oldlid1=$questionrowdata['lid'];
            }
            if ((isset($questionrowdata['lid1']) && $questionrowdata['lid1']>0))
            {
                $oldlid2=$questionrowdata['lid1'];
            }
            unset($questionrowdata['lid']);
            unset($questionrowdata['lid1']);
            if ($questionrowdata['type']=='W')
            {
                $questionrowdata['type']='!';
            }
            elseif ($questionrowdata['type']=='Z')
            {
                $questionrowdata['type']='L';
                $aIgnoredAnswers[]=$oldqid;
            }

            if (!isset($questionrowdata["question_order"]) || $questionrowdata["question_order"]=='') {$questionrowdata["question_order"]=0;}
            // translate internal links
            $questionrowdata['title']=translink('survey', $oldsid, $newsid, $questionrowdata['title']);
            $questionrowdata['question']=translink('survey', $oldsid, $newsid, $questionrowdata['question']);
            $questionrowdata['help']=translink('survey', $oldsid, $newsid, $questionrowdata['help']);


            if (isset($questionrowdata['qid'])) {
                db_switchIDInsert('questions',true);
            }

            $tablename=$dbprefix.'questions';
            $qinsert = $connect->GetInsertSQL($tablename,$questionrowdata);
            $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert question<br />\n$qinsert<br />\n".$connect->ErrorMsg());

            if (isset($questionrowdata['qid'])) {
                db_switchIDInsert('questions',false);
                $saveqid=$questionrowdata['qid'];
            }
            else
            {
                $aQIDReplacements[$oldqid]=$connect->Insert_ID("{$dbprefix}questions",'qid');
                $saveqid=$aQIDReplacements[$oldqid];
            }


            // Now we will fix up old label sets where they are used as answers
            if (((isset($oldlid1) && isset($aLIDReplacements[$oldlid1])) || (isset($oldlid2) && isset($aLIDReplacements[$oldlid2]))) && ($qtypes[$questionrowdata['type']]['answerscales']>0 || $qtypes[$questionrowdata['type']]['subquestions']>1))
            {
                $query="select * from ".db_table_name('labels')." where lid={$aLIDReplacements[$oldlid1]} and language='{$questionrowdata['language']}'";
                $oldlabelsresult=db_execute_assoc($query);
                while($labelrow=$oldlabelsresult->FetchRow())
                {
                    if (in_array($labelrow['language'],$aLanguagesSupported))
                    {

                        if ($qtypes[$questionrowdata['type']]['subquestions']<2)
                        {
                            $qinsert = "insert INTO ".db_table_name('answers')." (qid,code,answer,sortorder,language,assessment_value)
                                        VALUES ({$aQIDReplacements[$oldqid]},".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",".db_quoteall($labelrow['assessment_value']).")";
                            $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert answer (lid1) <br />\n$qinsert<br />\n".$connect->ErrorMsg());
                        }
                        else
                        {
                            if (isset($aSQIDReplacements[$labelrow['code'].'_'.$saveqid])){
                               $fieldname='qid,';
                               $data=$aSQIDReplacements[$labelrow['code'].'_'.$saveqid].',';
                            }
                            else{
                               $fieldname='' ;
                               $data='';
                            }

                            $qinsert = "insert INTO ".db_table_name('questions')." ($fieldname parent_qid,title,question,question_order,language,scale_id,type, sid, gid)
                                        VALUES ($data{$aQIDReplacements[$oldqid]},".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",1,'{$questionrowdata['type']}',{$questionrowdata['sid']},{$questionrowdata['gid']})";
                            $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert question <br />\n$qinsert<br />\n".$connect->ErrorMsg());
                            if ($fieldname=='')
                            {
                               $aSQIDReplacements[$labelrow['code'].'_'.$saveqid]=$connect->Insert_ID("{$dbprefix}questions","qid");
                            }
                        }
                    }
                }
                if (isset($oldlid2) && $qtypes[$questionrowdata['type']]['answerscales']>1)
                {
                    $query="select * from ".db_table_name('labels')." where lid={$aLIDReplacements[$oldlid2]} and language='{$questionrowdata['language']}'";
                    $oldlabelsresult=db_execute_assoc($query);
                    while($labelrow=$oldlabelsresult->FetchRow())
                    {
                        $qinsert = "insert INTO ".db_table_name('answers')." (qid,code,answer,sortorder,language,assessment_value,scale_id)
                                    VALUES ({$aQIDReplacements[$oldqid]},".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",".db_quoteall($labelrow['assessment_value']).",1)";
                        $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert answer (lid2)<br />\n$qinsert<br />\n".$connect->ErrorMsg());
                    }
                }
            }
        }
    }

    //Do answers
    if (isset($answerarray) && $answerarray)
    {
        $answerfieldnames = convertCSVRowToArray($answerarray[0],',','"');
        unset($answerarray[0]);
        foreach ($answerarray as $aa)
        {
            $answerfieldcontents = convertCSVRowToArray($aa,',','"');
            $answerrowdata = array_combine($answerfieldnames,$answerfieldcontents);
            if (in_array($answerrowdata['qid'],$aIgnoredAnswers))
            {
                 // Due to a bug in previous LS versions there may be orphaned answers with question type Z (which is now L)
                 // this way they are ignored
                 continue;
            }
            if ($answerrowdata===false)
            {
                $importquestion.='<br />'.$clang->gT("Faulty line in import - fields and data don't match").":".implode(',',$answerfieldcontents);
            }
            // Skip not supported languages
            if (!in_array($answerrowdata['language'],$aLanguagesSupported))
                continue;

            // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this answer is orphan -> error, skip this record)
            if (isset($aQIDReplacements[$answerrowdata["qid"]]))
            $answerrowdata["qid"] = $aQIDReplacements[$answerrowdata["qid"]];
            else
            continue; // a problem with this answer record -> don't consider

            if ($importversion<=132)
            {
                $answerrowdata["assessment_value"]=(int)$answerrowdata["code"];
            }
            // Convert default values for single select questions
            $questiontemp=$connect->GetRow('select type,gid from '.db_table_name('questions').' where qid='.$answerrowdata["qid"]);
            $oldquestion['newtype']=$questiontemp['type'];
            $oldquestion['gid']=$questiontemp['gid'];
            if ($answerrowdata['default_value']=='Y' && ($oldquestion['newtype']=='L' || $oldquestion['newtype']=='O' || $oldquestion['newtype']=='!'))
                            {
                $insertdata=array();
                $insertdata['qid']=$newqid;
                $insertdata['language']=$answerrowdata['language'];
                $insertdata['defaultvalue']=$answerrowdata['answer'];
                $query=$connect->GetInsertSQL($dbprefix.'defaultvalues',$insertdata);
                $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert defaultvalue <br />{$query}<br />\n".$connect->ErrorMsg());

            }
            // translate internal links
            $answerrowdata['answer']=translink('survey', $oldsid, $newsid, $answerrowdata['answer']);
            // Everything set - now insert it
            $answerrowdata = array_map('convertCsvreturn2return', $answerrowdata);

            if ($qtypes[$oldquestion['newtype']]['subquestions']>0) //hmmm.. this is really a subquestion
            {
                $questionrowdata=array();
                if (isset($aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']])){
                   $questionrowdata['qid']=$aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']];
                }
                $questionrowdata['parent_qid']=$answerrowdata['qid'];;
                $questionrowdata['sid']=$newsid;
                $questionrowdata['gid']=$oldquestion['gid'];
                $questionrowdata['title']=$answerrowdata['code'];
                $questionrowdata['question']=$answerrowdata['answer'];
                $questionrowdata['question_order']=$answerrowdata['sortorder'];
                $questionrowdata['language']=$answerrowdata['language'];
                $questionrowdata['type']=$oldquestion['newtype'];

                $tablename=$dbprefix.'questions';
                $query=$connect->GetInsertSQL($tablename,$questionrowdata);
                if (isset($questionrowdata['qid'])) db_switchIDInsert('questions',true);
                $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert subquestion <br />{$query}<br />".$connect->ErrorMsg());
                if (!isset($questionrowdata['qid']))
                {
                   $aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']]=$connect->Insert_ID("{$dbprefix}questions","qid");
                }
                else
                {
                    db_switchIDInsert('questions',false);
                }
                $results['subquestions']++;
                // also convert default values subquestions for multiple choice
                if ($answerrowdata['default_value']=='Y' && ($oldquestion['newtype']=='M' || $oldquestion['newtype']=='P'))
                {
                    $insertdata=array();
                    $insertdata['qid']=$newqid;
                    $insertdata['sqid']=$aSQIDReplacements[$answerrowdata['code']];
                    $insertdata['language']=$answerrowdata['language'];
                    $insertdata['defaultvalue']='Y';
                    $tablename=$dbprefix.'defaultvalues';
                    $query=$connect->GetInsertSQL($tablename,$insertdata);
                    $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert defaultvalue <br />{$query}<br />\n".$connect->ErrorMsg());
                }

            }
            else   // insert answers
            {
                unset($answerrowdata['default_value']);
                $tablename=$dbprefix.'answers';
                $query=$connect->GetInsertSQL($tablename,$answerrowdata);
                $ares = $connect->Execute($query) or safe_die ("Error: Failed to insert answer<br />{$query}<br />\n".$connect->ErrorMsg());
                $results['answers']++;
            }

        }
    }

    // get all group ids and fix questions inside each group
    $gquery = "SELECT gid FROM {$dbprefix}groups where sid=$newsid group by gid ORDER BY gid"; //Get last question added (finds new qid)
    $gres = db_execute_assoc($gquery);
    while ($grow = $gres->FetchRow())
    {
        fixsortorderQuestions($grow['gid'], $newsid);
    }

    //We've built two arrays along the way - one containing the old SID, GID and QIDs - and their NEW equivalents
    //and one containing the old 'extended fieldname' and its new equivalent.  These are needed to import conditions and question_attributes.
    if (isset($question_attributesarray) && $question_attributesarray) {//ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUES
        $fieldorders  =convertCSVRowToArray($question_attributesarray[0],',','"');
        unset($question_attributesarray[0]);
        foreach ($question_attributesarray as $qar) {
            $fieldcontents=convertCSVRowToArray($qar,',','"');
            $qarowdata=array_combine($fieldorders,$fieldcontents);
            $newqid="";
            $qarowdata["qid"]=$aQIDReplacements[$qarowdata["qid"]];
            unset($qarowdata["qaid"]);

            $newvalues=array_values($qarowdata);
            $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly
            $qainsert = "insert INTO {$dbprefix}question_attributes (".implode(',',array_keys($qarowdata)).") VALUES (".implode(',',$newvalues).")";
            $result=$connect->Execute($qainsert); // no safe_die since some LimeSurvey version export duplicate question attributes - these are just ignored
            if ($connect->Affected_Rows()>0) {$importresults['question_attributes']++;}
        }
    }

    if (isset($assessmentsarray) && $assessmentsarray) {//ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUTES
        $fieldorders=convertCSVRowToArray($assessmentsarray[0],',','"');
        unset($assessmentsarray[0]);
        foreach ($assessmentsarray as $qar)
        {
            $fieldcontents=convertCSVRowToArray($qar,',','"');
            $asrowdata=array_combine($fieldorders,$fieldcontents);
            if (isset($asrowdata['link']))
            {
                if (trim($asrowdata['link'])!='') $asrowdata['message']=$asrowdata['message'].'<br /><a href="'.$asrowdata['link'].'">'.$asrowdata['link'].'</a>';
                unset($asrowdata['link']);
            }
            if  ($asrowdata["gid"]>0)
            {
                $asrowdata["gid"]=$aGIDReplacements[$asrowdata["gid"]];
            }

            $asrowdata["sid"]=$newsid;
            unset($asrowdata["id"]);

            $tablename=$dbprefix.'assessments';
            $asinsert = $connect->GetInsertSQL($tablename,$asrowdata);
            $result=$connect->Execute($asinsert) or safe_die ("Couldn't insert assessment<br />$asinsert<br />".$connect->ErrorMsg());

            unset($newgid);
        }
    }

    if (isset($quotaarray) && $quotaarray) {//ONLY DO THIS IF THERE ARE QUOTAS
        $fieldorders=convertCSVRowToArray($quotaarray[0],',','"');
        unset($quotaarray[0]);
        foreach ($quotaarray as $qar)
        {
            $fieldcontents=convertCSVRowToArray($qar,',','"');

            $asrowdata=array_combine($fieldorders,$fieldcontents);

            $oldsid=$asrowdata["sid"];
            foreach ($substitutions as $subs) {
                if ($oldsid==$subs[0]) {$newsid=$subs[3];}
            }

            $asrowdata["sid"]=$newsid;
            $oldid = $asrowdata["id"];
            unset($asrowdata["id"]);
            $quotadata[]=$asrowdata; //For use later if needed
            $tablename=$dbprefix.'quota';
            $asinsert = $connect->getInsertSQL($tablename,$asrowdata);
            $result=$connect->Execute($asinsert) or safe_die ("Couldn't insert quota<br />$asinsert<br />".$connect->ErrorMsg());
            $aQuotaReplacements[$oldid] = $connect->Insert_ID(db_table_name_nq('quota'),"id");
        }
    }

    if (isset($quotamembersarray) && $quotamembersarray) {//ONLY DO THIS IF THERE ARE QUOTA MEMBERS
        $count=0;
        foreach ($quotamembersarray as $qar) {

            $fieldorders  =convertCSVRowToArray($quotamembersarray[0],',','"');
            $fieldcontents=convertCSVRowToArray($qar,',','"');
            if ($count==0) {$count++; continue;}

            $asrowdata=array_combine($fieldorders,$fieldcontents);

            $oldsid=$asrowdata["sid"];
            $newqid="";
            $newquotaid="";
            $oldqid=$asrowdata['qid'];
            $oldquotaid=$asrowdata['quota_id'];

            foreach ($substitutions as $subs) {
                if ($oldsid==$subs[0]) {$newsid=$subs[3];}
                if ($oldqid==$subs[2]) {$newqid=$subs[5];}
            }

            $newquotaid=$aQuotaReplacements[$oldquotaid];

            $asrowdata["sid"]=$newsid;
            $asrowdata["qid"]=$newqid;
            $asrowdata["quota_id"]=$newquotaid;
            unset($asrowdata["id"]);

            $tablename=$dbprefix.'quota_members';
            $asinsert = $connect->getInsertSQL($tablename,$asrowdata);

            $result=$connect->Execute($asinsert) or safe_die ("Couldn't insert quota<br />$asinsert<br />".$connect->ErrorMsg());

        }
    }

    if (isset($quotalsarray) && $quotalsarray) {//ONLY DO THIS IF THERE ARE QUOTA LANGUAGE SETTINGS
        $count=0;
        foreach ($quotalsarray as $qar) {

            $fieldorders  =convertCSVRowToArray($quotalsarray[0],',','"');
            $fieldcontents=convertCSVRowToArray($qar,',','"');
            if ($count==0) {$count++; continue;}

            $asrowdata=array_combine($fieldorders,$fieldcontents);

            $newquotaid="";
            $oldquotaid=$asrowdata['quotals_quota_id'];

            $newquotaid=$aQuotaReplacements[$oldquotaid];

            $asrowdata["quotals_quota_id"]=$newquotaid;
            unset($asrowdata["quotals_id"]);

            $tablename=$dbprefix.'quota_languagesettings';
            $asinsert = $connect->getInsertSQL($tablename,$asrowdata);
            $result=$connect->Execute($asinsert) or safe_die ("Couldn't insert quota<br />$asinsert<br />".$connect->ErrorMsg());
        }
    }

    //if there are quotas, but no quotals, then we need to create default dummy for each quota (this handles exports from pre-language quota surveys)
    if ($importresults['quota'] > 0 && (!isset($importresults['quotals']) || $importresults['quotals'] == 0)) {
        $i=0;
        $defaultsurveylanguage=isset($defaultsurveylanguage) ? $defaultsurveylanguage : "en";
        foreach($aQuotaReplacements as $oldquotaid=>$newquotaid) {
            $asrowdata=array("quotals_quota_id" => $newquotaid,
                             "quotals_language" => $defaultsurveylanguage,
                             "quotals_name" => $quotadata[$i]["name"],
                             "quotals_message" => $clang->gT("Sorry your responses have exceeded a quota on this survey."),
                             "quotals_url" => "",
                             "quotals_urldescrip" => "");
            $i++;
        }
        $tablename=$dbprefix.'quota_languagesettings';
        $asinsert = $connect->getInsertSQL($tablename,$asrowdata);
        $result=$connect->Execute($asinsert) or safe_die ("Couldn't insert quota<br />$asinsert<br />".$connect->ErrorMsg());
        $countquotals=$i;
    }

    // Do conditions
    if (isset($conditionsarray) && $conditionsarray) {//ONLY DO THIS IF THERE ARE CONDITIONS!
        $fieldorders  =convertCSVRowToArray($conditionsarray[0],',','"');
        unset($conditionsarray[0]);
       // Exception for conditions based on attributes
        $aQIDReplacements[0]=0;
        foreach ($conditionsarray as $car) {
            $fieldcontents=convertCSVRowToArray($car,',','"');
            $conditionrowdata=array_combine($fieldorders,$fieldcontents);

            unset($conditionrowdata["cid"]);
            if (!isset($conditionrowdata["method"]) || trim($conditionrowdata["method"])=='')
            {
                $conditionrowdata["method"]='==';
            }
            if (!isset($conditionrowdata["scenario"]) || trim($conditionrowdata["scenario"])=='')
            {
                $conditionrowdata["scenario"]=1;
            }
            $oldcqid=$conditionrowdata["cqid"];
            $oldgid=array_search($connect->GetOne('select gid from '.db_table_name('questions').' where qid='.$aQIDReplacements[$conditionrowdata["cqid"]]),$aGIDReplacements);
            $conditionrowdata["qid"]=$aQIDReplacements[$conditionrowdata["qid"]];
            $conditionrowdata["cqid"]=$aQIDReplacements[$conditionrowdata["cqid"]];
            $oldcfieldname=$conditionrowdata["cfieldname"];
            $conditionrowdata["cfieldname"]=str_replace($oldsid.'X'.$oldgid.'X'.$oldcqid,$newsid.'X'.$aGIDReplacements[$oldgid].'X'.$conditionrowdata["cqid"],$conditionrowdata["cfieldname"]);

            $tablename=$dbprefix.'conditions';
            $conditioninsert = $connect->getInsertSQL($tablename,$conditionrowdata);
            $result=$connect->Execute($conditioninsert) or safe_die ("Couldn't insert condition<br />$conditioninsert<br />".$connect->ErrorMsg());

        }
    }
    $importresults['importversion']=$importversion;
    $importresults['newsid']=$newsid;
    $importresults['oldsid']=$oldsid;
    return $importresults;
}
示例#7
0
 /**
  *
  * Enter description here...
  * @param $surveyid
  * @param $sMod
  * @param $newGroup
  * @return unknown_type
  */
 function importQuestion($surveyid, $sMod, $newGroup = false)
 {
     global $connect;
     global $dbprefix;
     $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
     include "lsrc.config.php";
     $newsid = $surveyid;
     $this->debugLsrc("wir sind in " . __FUNCTION__ . " Line " . __LINE__ . ", START OK {$dbprefix} ");
     //$getGidSql = "SELECT gid FROM {$dbprefix}  ";
     $getGidSql = "SELECT gid\r\n\t                   FROM {$dbprefix}groups \r\n\t                   WHERE sid=" . $surveyid . " AND language='" . GetBaseLanguageFromSurveyID($surveyid) . "'\r\n\t                   ORDER BY gid desc ";
     $getGidRs = db_execute_num($getGidSql);
     $gidRow = $getGidRs->FetchRow();
     $gid = $gidRow[0];
     if ($gid == '') {
         $this->debugLsrc("No Group for importing the question, available!");
         return "No Group for importing the question, available! Import failed.";
     }
     if ($newGroup === true) {
         ++$gid;
     }
     $the_full_file_path = $queDir . $sMod . ".csv";
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK {$the_full_file_path} ");
     $handle = fopen($the_full_file_path, "r");
     while (!feof($handle)) {
         $buffer = fgets($handle, 10240);
         //To allow for very long survey welcomes (up to 10k)
         $bigarray[] = $buffer;
     }
     fclose($handle);
     // Now we try to determine the dataformat of the survey file.
     if (substr($bigarray[1], 0, 24) == "# SURVEYOR QUESTION DUMP" && substr($bigarray[4], 0, 29) == "# http://www.phpsurveyor.org/") {
         $importversion = 100;
         // version 1.0 file
     } elseif (substr($bigarray[1], 0, 24) == "# SURVEYOR QUESTION DUMP" && substr($bigarray[4], 0, 37) == "# http://phpsurveyor.sourceforge.net/") {
         $importversion = 99;
         // Version 0.99 file or older - carries a different URL
     } elseif (substr($bigarray[0], 0, 26) == "# LimeSurvey Question Dump" || substr($bigarray[0], 0, 27) == "# PHPSurveyor Question Dump") {
         // Wow.. this seems to be a >1.0 version file - these files carry the version information to read in line two
         $importversion = substr($bigarray[1], 12, 3);
     } else {
         //		      $importquestion .= "<strong><font color='red'>".("Error")."</font></strong>\n";
         //		      $importquestion .= ("This file is not a LimeSurvey question file. Import failed.")."\n";
         //		      $importquestion .= "</font></td></tr></table>\n";
         //		      $importquestion .= "</body>\n</html>\n";
         //		      unlink($the_full_file_path);
         return "This is not a Limesurvey question file. Import failed";
     }
     //		if ($importversion != $dbversionnumber)
     //		{
     ////		    $importquestion .= "<strong><font color='red'>".("Error")."</font></strong>\n";
     ////		    $importquestion .= ("Sorry, importing questions is limited to the same version. Import failed.")."\n";
     ////		    $importquestion .= "</font></td></tr></table>\n";
     ////		    $importquestion .= "</body>\n</html>\n";
     ////		    unlink($the_full_file_path);
     //		    return;
     //		}
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
     for ($i = 0; $i < 9; $i++) {
         unset($bigarray[$i]);
     }
     $bigarray = array_values($bigarray);
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
     //QUESTIONS
     if (array_search("# ANSWERS TABLE\n", $bigarray)) {
         $stoppoint = array_search("# ANSWERS TABLE\n", $bigarray);
     } elseif (array_search("# ANSWERS TABLE\r\n", $bigarray)) {
         $stoppoint = array_search("# ANSWERS TABLE\r\n", $bigarray);
     } else {
         $stoppoint = count($bigarray) - 1;
     }
     for ($i = 0; $i <= $stoppoint + 1; $i++) {
         if ($i < $stoppoint - 2) {
             $questionarray[] = $bigarray[$i];
         }
         unset($bigarray[$i]);
     }
     $bigarray = array_values($bigarray);
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
     //ANSWERS
     if (array_search("# LABELSETS TABLE\n", $bigarray)) {
         $stoppoint = array_search("# LABELSETS TABLE\n", $bigarray);
     } elseif (array_search("# LABELSETS TABLE\r\n", $bigarray)) {
         $stoppoint = array_search("# LABELSETS TABLE\r\n", $bigarray);
     } else {
         $stoppoint = count($bigarray) - 1;
     }
     for ($i = 0; $i <= $stoppoint + 1; $i++) {
         if ($i < $stoppoint - 2) {
             $answerarray[] = str_replace("`default`", "`default_value`", $bigarray[$i]);
         }
         unset($bigarray[$i]);
     }
     $bigarray = array_values($bigarray);
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
     //LABELSETS
     if (array_search("# LABELS TABLE\n", $bigarray)) {
         $stoppoint = array_search("# LABELS TABLE\n", $bigarray);
     } elseif (array_search("# LABELS TABLE\r\n", $bigarray)) {
         $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray);
     } else {
         $stoppoint = count($bigarray) - 1;
     }
     for ($i = 0; $i <= $stoppoint + 1; $i++) {
         if ($i < $stoppoint - 2) {
             $labelsetsarray[] = $bigarray[$i];
         }
         unset($bigarray[$i]);
     }
     $bigarray = array_values($bigarray);
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
     //LABELS
     if (array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray)) {
         $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray);
     } elseif (array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray)) {
         $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray);
     } else {
         $stoppoint = count($bigarray) - 1;
     }
     for ($i = 0; $i <= $stoppoint + 1; $i++) {
         if ($i < $stoppoint - 2) {
             $labelsarray[] = $bigarray[$i];
         }
         unset($bigarray[$i]);
     }
     $bigarray = array_values($bigarray);
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
     //Question_attributes
     if (!isset($noconditions) || $noconditions != "Y") {
         $stoppoint = count($bigarray);
         for ($i = 0; $i <= $stoppoint + 1; $i++) {
             if ($i < $stoppoint - 1) {
                 $question_attributesarray[] = $bigarray[$i];
             }
             unset($bigarray[$i]);
         }
     }
     $bigarray = array_values($bigarray);
     if (isset($questionarray)) {
         $countquestions = count($questionarray) - 1;
     } else {
         $countquestions = 0;
     }
     if (isset($answerarray)) {
         $answerfieldnames = convertCSVRowToArray($answerarray[0], ',', '"');
         unset($answerarray[0]);
         $countanswers = count($answerarray);
     } else {
         $countanswers = 0;
     }
     if (isset($labelsetsarray)) {
         $countlabelsets = count($labelsetsarray) - 1;
     } else {
         $countlabelsets = 0;
     }
     if (isset($labelsarray)) {
         $countlabels = count($labelsarray) - 1;
     } else {
         $countlabels = 0;
     }
     if (isset($question_attributesarray)) {
         $countquestion_attributes = count($question_attributesarray) - 1;
     } else {
         $countquestion_attributes = 0;
     }
     $languagesSupported = array();
     // this array will keep all the languages supported for the survey
     // Let's check that imported objects support at least the survey's baselang
     $langcode = GetBaseLanguageFromSurveyID($surveyid);
     $languagesSupported[$langcode] = 1;
     // adds the base language to the list of supported languages
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
     if ($countquestions > 0) {
         $questionfieldnames = convertCSVRowToArray($questionarray[0], ',', '"');
         $langfieldnum = array_search("language", $questionfieldnames);
         $qidfieldnum = array_search("qid", $questionfieldnames);
         $questionssupportbaselang = bDoesImportarraySupportsLanguage($questionarray, array($qidfieldnum), $langfieldnum, $langcode, true);
         if (!$questionssupportbaselang) {
             //				$importquestion .= "<strong><font color='red'>".("Error")."</font></strong>\n"
             //				.("You can't import a question which doesn't support the current survey's base language")."\n"
             //				."</td></tr></table>\n";
             //				unlink($the_full_file_path);
             return "You can't import a question which doesn't support the current survey's base language";
         }
     }
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
     foreach (GetAdditionalLanguagesFromSurveyID($surveyid) as $language) {
         $languagesSupported[$language] = 1;
     }
     // Let's assume that if the questions do support tye baselang
     // Then the answers do support it as well.
     // ==> So the following section is commented for now
     //if ($countanswers > 0)
     //{
     //	$langfieldnum = array_search("language", $answerfieldnames);
     //	$answercodefilednum1 =  array_search("qid", $answerfieldnames);
     //	$answercodefilednum2 =  array_search("code", $answerfieldnames);
     //	$answercodekeysarr = Array($answercodefilednum1,$answercodefilednum2);
     //	$answerssupportbaselang = bDoesImportarraySupportsLanguage($answerarray,$answercodekeysarr,$langfieldnum,$langcode);
     //	if (!$answerssupportbaselang)
     //	{
     //		$importquestion .= "<strong><font color='red'>".("Error")."</font></strong>\n"
     //		.("You can't import answers which don't support current survey's base language")."\n"
     //		."</td></tr></table>\n";
     //		return;
     //	}
     //
     //}
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
     if ($countlabelsets > 0) {
         $labelsetfieldname = convertCSVRowToArray($labelsetsarray[0], ',', '"');
         $langfieldnum = array_search("languages", $labelsetfieldname);
         $lidfilednum = array_search("lid", $labelsetfieldname);
         $labelsetssupportbaselang = bDoesImportarraySupportsLanguage($labelsetsarray, array($lidfilednum), $langfieldnum, $langcode, true);
         if (!$labelsetssupportbaselang) {
             //				$importquestion .= "<strong><font color='red'>".("Error")."</font></strong>\n"
             //				.("You can't import label sets which don't support the current survey's base language")."\n"
             //				."</td></tr></table>\n";
             //				unlink($the_full_file_path);
             return "You can't import label sets which don't support the current survey's base language";
         }
     }
     // I assume that if a labelset supports the survey's baselang,
     // then it's labels do support it as well
     // GET SURVEY AND GROUP DETAILS
     //$surveyid=$postsid;
     //$gid=$postgid;
     $newsid = $surveyid;
     $newgid = $gid;
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
     //DO ANY LABELSETS FIRST, SO WE CAN KNOW WHAT THEIR NEW LID IS FOR THE QUESTIONS
     if (isset($labelsetsarray) && $labelsetsarray) {
         $csarray = buildLabelSetCheckSumArray();
         // build checksums over all existing labelsets
         $count = 0;
         $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
         foreach ($labelsetsarray as $lsa) {
             $fieldorders = convertCSVRowToArray($labelsetsarray[0], ',', '"');
             $fieldcontents = convertCSVRowToArray($lsa, ',', '"');
             if ($count == 0) {
                 $count++;
                 continue;
             }
             $labelsetrowdata = array_combine($fieldorders, $fieldcontents);
             // Save old labelid
             $oldlid = $labelsetrowdata['lid'];
             // set the new language
             unset($labelsetrowdata['lid']);
             $newvalues = array_values($labelsetrowdata);
             $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
             // quote everything accordingly
             $lsainsert = "INSERT INTO {$dbprefix}labelsets (" . implode(',', array_keys($labelsetrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
             //handle db prefix
             $lsiresult = $connect->Execute($lsainsert);
             // Get the new insert id for the labels inside this labelset
             $newlid = $connect->Insert_ID("{$dbprefix}labelsets", "lid");
             if ($labelsarray) {
                 $count = 0;
                 foreach ($labelsarray as $la) {
                     $lfieldorders = convertCSVRowToArray($labelsarray[0], ',', '"');
                     $lfieldcontents = convertCSVRowToArray($la, ',', '"');
                     if ($count == 0) {
                         $count++;
                         continue;
                     }
                     // Combine into one array with keys and values since its easier to handle
                     $labelrowdata = array_combine($lfieldorders, $lfieldcontents);
                     $labellid = $labelrowdata['lid'];
                     if ($labellid == $oldlid) {
                         $labelrowdata['lid'] = $newlid;
                         // translate internal links
                         $labelrowdata['title'] = translink('label', $oldlid, $newlid, $labelrowdata['title']);
                         $newvalues = array_values($labelrowdata);
                         $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
                         // quote everything accordingly
                         $lainsert = "INSERT INTO {$dbprefix}labels (" . implode(',', array_keys($labelrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
                         //handle db prefix
                         $liresult = $connect->Execute($lainsert);
                     }
                 }
             }
             //CHECK FOR DUPLICATE LABELSETS
             $thisset = "";
             $query2 = "SELECT code, title, sortorder, language\r\n\t\t                   FROM {$dbprefix}labels\r\n\t\t                   WHERE lid=" . $newlid . "\r\n\t\t                   ORDER BY language, sortorder, code";
             $result2 = db_execute_num($query2) or $this->debugLsrc("Died querying labelset {$lid}{$query2}" . $connect->ErrorMsg());
             while ($row2 = $result2->FetchRow()) {
                 $thisset .= implode('.', $row2);
             }
             // while
             $newcs = dechex(crc32($thisset) * 1);
             unset($lsmatch);
             if (isset($csarray)) {
                 foreach ($csarray as $key => $val) {
                     if ($val == $newcs) {
                         $lsmatch = $key;
                     }
                 }
             }
             if (isset($lsmatch)) {
                 //There is a matching labelset. So, we will delete this one and refer
                 //to the matched one.
                 $query = "DELETE FROM {$dbprefix}labels WHERE lid={$newlid}";
                 $result = $connect->Execute($query) or $this->debugLsrc("Couldn't delete labels{$query}" . $connect->ErrorMsg());
                 $query = "DELETE FROM {$dbprefix}labelsets WHERE lid={$newlid}";
                 $result = $connect->Execute($query) or $this->debugLsrc("Couldn't delete labelset{$query}" . $connect->ErrorMsg());
                 $newlid = $lsmatch;
             } else {
                 //There isn't a matching labelset, add this checksum to the $csarray array
                 $csarray[$newlid] = $newcs;
             }
             //END CHECK FOR DUPLICATES
             $labelreplacements[] = array($oldlid, $newlid);
         }
     }
     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
     // QUESTIONS, THEN ANSWERS FOR QUESTIONS IN A NESTED FORMAT!
     if (isset($questionarray) && $questionarray) {
         $qafieldorders = convertCSVRowToArray($questionarray[0], ',', '"');
         unset($questionarray[0]);
         //Assuming we will only import one question at a time we will now find out the maximum question order in this group
         //and save it for later
         $qmaxqo = "SELECT MAX(question_order) AS maxqo FROM " . db_table_name('questions') . " WHERE sid={$newsid} AND gid={$newgid}";
         $qres = db_execute_assoc($qmaxqo) or $this->debugLsrc("Error: " . ": Failed to find out maximum question order value\n{$qmaxqo}\n" . $connect->ErrorMsg());
         $qrow = $qres->FetchRow();
         $newquestionorder = $qrow['maxqo'] + 1;
         $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
         foreach ($questionarray as $qa) {
             $qacfieldcontents = convertCSVRowToArray($qa, ',', '"');
             $newfieldcontents = $qacfieldcontents;
             $questionrowdata = array_combine($qafieldorders, $qacfieldcontents);
             if (isset($languagesSupported[$questionrowdata["language"]])) {
                 $oldqid = $questionrowdata['qid'];
                 $oldsid = $questionrowdata['sid'];
                 $oldgid = $questionrowdata['gid'];
                 // Remove qid field if there is no newqid; and set it to newqid if it's set
                 if (!isset($newqid)) {
                     unset($questionrowdata['qid']);
                 } else {
                     $questionrowdata['qid'] = $newqid;
                 }
                 $questionrowdata["sid"] = $newsid;
                 $questionrowdata["gid"] = $newgid;
                 $questionrowdata["question_order"] = $newquestionorder;
                 $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
                 // Now we will fix up the label id
                 $type = $questionrowdata["type"];
                 //Get the type
                 if ($type == "F" || $type == "H" || $type == "1" || $type == ":" || $type == ";") {
                     //IF this is a flexible label array, update the lid entry
                     $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
                     if (isset($labelreplacements)) {
                         foreach ($labelreplacements as $lrp) {
                             if ($lrp[0] == $questionrowdata["lid"]) {
                                 $questionrowdata["lid"] = $lrp[1];
                             }
                             if ($lrp[0] == $questionrowdata["lid1"]) {
                                 $questionrowdata["lid1"] = $lrp[1];
                             }
                         }
                     }
                 }
                 $other = $questionrowdata["other"];
                 //Get 'other' field value
                 $oldlid = $questionrowdata["lid"];
                 $questionrowdata = array_map('convertCsvreturn2return', $questionrowdata);
                 // translate internal links
                 $questionrowdata['title'] = translink('survey', $oldsid, $newsid, $questionrowdata['title']);
                 $questionrowdata['question'] = translink('survey', $oldsid, $newsid, $questionrowdata['question']);
                 $questionrowdata['help'] = translink('survey', $oldsid, $newsid, $questionrowdata['help']);
                 $newvalues = array_values($questionrowdata);
                 $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
                 // quote everything accordingly
                 $qinsert = "INSERT INTO {$dbprefix}questions (" . implode(',', array_keys($questionrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
                 $qres = $connect->Execute($qinsert) or $this->debugLsrc("Error: " . ": Failed to insert question\n{$qinsert}\n" . $connect->ErrorMsg());
                 $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
                 // set the newqid only if is not set
                 if (!isset($newqid)) {
                     $newqid = $connect->Insert_ID("{$dbprefix}questions", "qid");
                 }
             }
         }
         $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
         //NOW DO ANSWERS FOR THIS QID - Is called just once and only if there was a question
         if (isset($answerarray) && $answerarray) {
             foreach ($answerarray as $aa) {
                 $answerfieldcontents = convertCSVRowToArray($aa, ',', '"');
                 $answerrowdata = array_combine($answerfieldnames, $answerfieldcontents);
                 if ($answerrowdata === false) {
                     $importquestion .= '' . "Faulty line in import - fields and data don't match" . ":" . implode(',', $answerfieldcontents);
                 }
                 if (isset($languagesSupported[$answerrowdata["language"]])) {
                     $code = $answerrowdata["code"];
                     $thisqid = $answerrowdata["qid"];
                     $answerrowdata["qid"] = $newqid;
                     // translate internal links
                     $answerrowdata['answer'] = translink('survey', $oldsid, $newsid, $answerrowdata['answer']);
                     $newvalues = array_values($answerrowdata);
                     $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
                     // quote everything accordingly
                     $ainsert = "INSERT INTO {$dbprefix}answers (" . implode(',', array_keys($answerrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
                     $ares = $connect->Execute($ainsert) or $this->debugLsrc("Error: " . ": Failed to insert answer\n{$ainsert}\n" . $connect->ErrorMsg());
                 }
             }
         }
         $this->debugLsrc("wir sind in " . __FILE__ . " - " . __FUNCTION__ . " Line " . __LINE__ . ", OK ");
         // Finally the question attributes - Is called just once and only if there was a question
         if (isset($question_attributesarray) && $question_attributesarray) {
             //ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUES
             $fieldorders = convertCSVRowToArray($question_attributesarray[0], ',', '"');
             unset($question_attributesarray[0]);
             foreach ($question_attributesarray as $qar) {
                 $fieldcontents = convertCSVRowToArray($qar, ',', '"');
                 $qarowdata = array_combine($fieldorders, $fieldcontents);
                 $qarowdata["qid"] = $newqid;
                 unset($qarowdata["qaid"]);
                 $newvalues = array_values($qarowdata);
                 $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
                 // quote everything accordingly
                 $qainsert = "INSERT INTO {$dbprefix}question_attributes (" . implode(',', array_keys($qarowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
                 $result = $connect->Execute($qainsert) or $this->debugLsrc("Couldn't insert question_attribute{$qainsert}" . $connect->ErrorMsg());
             }
         }
     }
     $this->debugLsrc("wir sind in - " . __FUNCTION__ . " Line " . __LINE__ . ", FERTIG ");
     // CONDITIONS is DONE
     return array('gid' => $newgid, 'qid' => $newqid);
     //return $newgid;
 }
示例#8
0
/**
* This function imports an old-school question group file (*.csv,*.sql)
*
* @param mixed $sFullFilepath Full file patch to the import file
* @param mixed $newsid  Survey ID to which the question is attached
*/
function CSVImportGroup($sFullFilepath, $newsid)
{
    global $dbprefix, $connect, $clang;
    $aLIDReplacements = array();
    $aQIDReplacements = array();
    // this array will have the "new qid" for the questions, the key will be the "old qid"
    $aGIDReplacements = array();
    $handle = fopen($sFullFilepath, "r");
    while (!feof($handle)) {
        $buffer = fgets($handle);
        $bigarray[] = $buffer;
    }
    fclose($handle);
    if (substr($bigarray[0], 0, 23) != "# LimeSurvey Group Dump") {
        $results['fatalerror'] = $clang->gT("This file is not a LimeSurvey question file. Import failed.");
        $importversion = 0;
    } else {
        $importversion = (int) trim(substr($bigarray[1], 12));
    }
    if ((int) $importversion < 112) {
        $results['fatalerror'] = $clang->gT("This file is too old. Only files from LimeSurvey version 1.50 (DBVersion 112) and newer are supported.");
    }
    for ($i = 0; $i < 9; $i++) {
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //GROUPS
    if (array_search("# QUESTIONS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# QUESTIONS TABLE\n", $bigarray);
    } elseif (array_search("# QUESTIONS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# QUESTIONS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $grouparray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //QUESTIONS
    if (array_search("# ANSWERS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# ANSWERS TABLE\n", $bigarray);
    } elseif (array_search("# ANSWERS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# ANSWERS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $questionarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //ANSWERS
    if (array_search("# CONDITIONS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# CONDITIONS TABLE\n", $bigarray);
    } elseif (array_search("# CONDITIONS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# CONDITIONS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $answerarray[] = str_replace("`default`", "`default_value`", $bigarray[$i]);
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //CONDITIONS
    if (array_search("# LABELSETS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# LABELSETS TABLE\n", $bigarray);
    } elseif (array_search("# LABELSETS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# LABELSETS TABLE\r\n", $bigarray);
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $conditionsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //LABELSETS
    if (array_search("# LABELS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# LABELS TABLE\n", $bigarray);
    } elseif (array_search("# LABELS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $labelsetsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //LABELS
    if (array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray)) {
        $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray);
    } elseif (array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $labelsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //Question attributes
    if (!isset($noconditions) || $noconditions != "Y") {
        // stoppoint is the last line number
        // this is an empty line after the QA CSV lines
        $stoppoint = count($bigarray) - 1;
        for ($i = 0; $i <= $stoppoint + 1; $i++) {
            if ($i <= $stoppoint - 1) {
                $question_attributesarray[] = $bigarray[$i];
            }
            unset($bigarray[$i]);
        }
    }
    $bigarray = array_values($bigarray);
    $countgroups = 0;
    if (isset($questionarray)) {
        $questionfieldnames = convertCSVRowToArray($questionarray[0], ',', '"');
        unset($questionarray[0]);
        $countquestions = 0;
    }
    if (isset($answerarray)) {
        $answerfieldnames = convertCSVRowToArray($answerarray[0], ',', '"');
        unset($answerarray[0]);
        $countanswers = count($answerarray);
    } else {
        $countanswers = 0;
    }
    $aLanguagesSupported = array();
    // this array will keep all the languages supported for the survey
    $sBaseLanguage = GetBaseLanguageFromSurveyID($newsid);
    $aLanguagesSupported[] = $sBaseLanguage;
    // adds the base language to the list of supported languages
    $aLanguagesSupported = array_merge($aLanguagesSupported, GetAdditionalLanguagesFromSurveyID($newsid));
    // Let's check that imported objects support at least the survey's baselang
    $langcode = GetBaseLanguageFromSurveyID($newsid);
    if (isset($grouparray)) {
        $groupfieldnames = convertCSVRowToArray($grouparray[0], ',', '"');
        $langfieldnum = array_search("language", $groupfieldnames);
        $gidfieldnum = array_search("gid", $groupfieldnames);
        $groupssupportbaselang = bDoesImportarraySupportsLanguage($grouparray, array($gidfieldnum), $langfieldnum, $sBaseLanguage, true);
        if (!$groupssupportbaselang) {
            $results['fatalerror'] = $clang->gT("You can't import a group which doesn't support at least the survey base language.");
            return $results;
        }
    }
    if (isset($questionarray)) {
        $langfieldnum = array_search("language", $questionfieldnames);
        $qidfieldnum = array_search("qid", $questionfieldnames);
        $questionssupportbaselang = bDoesImportarraySupportsLanguage($questionarray, array($qidfieldnum), $langfieldnum, $sBaseLanguage, true);
        if (!$questionssupportbaselang) {
            $results['fatalerror'] = $clang->gT("You can't import a question which doesn't support at least the survey base language.");
            return $results;
        }
    }
    if ($countanswers > 0) {
        $langfieldnum = array_search("language", $answerfieldnames);
        $answercodefilednum1 = array_search("qid", $answerfieldnames);
        $answercodefilednum2 = array_search("code", $answerfieldnames);
        $answercodekeysarr = array($answercodefilednum1, $answercodefilednum2);
        $answerssupportbaselang = bDoesImportarraySupportsLanguage($answerarray, $answercodekeysarr, $langfieldnum, $sBaseLanguage);
        if (!$answerssupportbaselang) {
            $results['fatalerror'] = $clang->gT("You can't import answers which doesn't support at least the survey base language.");
            return $results;
        }
    }
    if (count($labelsetsarray) > 1) {
        $labelsetfieldname = convertCSVRowToArray($labelsetsarray[0], ',', '"');
        $langfieldnum = array_search("languages", $labelsetfieldname);
        $lidfilednum = array_search("lid", $labelsetfieldname);
        $labelsetssupportbaselang = bDoesImportarraySupportsLanguage($labelsetsarray, array($lidfilednum), $langfieldnum, $sBaseLanguage, true);
        if (!$labelsetssupportbaselang) {
            $results['fatalerror'] = $clang->gT("You can't import label sets which don't support the current survey's base language");
            return $results;
        }
    }
    // I assume that if a labelset supports the survey's baselang,
    // then it's labels do support it as well
    //DO ANY LABELSETS FIRST, SO WE CAN KNOW WHAT THEIR NEW LID IS FOR THE QUESTIONS
    $results['labelsets'] = 0;
    $qtypes = getqtypelist("", "array");
    $results['labels'] = 0;
    $results['labelsets'] = 0;
    $results['answers'] = 0;
    $results['subquestions'] = 0;
    //Do label sets
    if (isset($labelsetsarray) && $labelsetsarray) {
        $csarray = buildLabelSetCheckSumArray();
        // build checksums over all existing labelsets
        $count = 0;
        foreach ($labelsetsarray as $lsa) {
            $fieldorders = convertCSVRowToArray($labelsetsarray[0], ',', '"');
            $fieldcontents = convertCSVRowToArray($lsa, ',', '"');
            if ($count == 0) {
                $count++;
                continue;
            }
            $labelsetrowdata = array_combine($fieldorders, $fieldcontents);
            // Save old labelid
            $oldlid = $labelsetrowdata['lid'];
            unset($labelsetrowdata['lid']);
            $newvalues = array_values($labelsetrowdata);
            $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
            // quote everything accordingly
            $lsainsert = "INSERT INTO {$dbprefix}labelsets (" . implode(',', array_keys($labelsetrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
            //handle db prefix
            $lsiresult = $connect->Execute($lsainsert);
            $results['labelsets']++;
            // Get the new insert id for the labels inside this labelset
            $newlid = $connect->Insert_ID("{$dbprefix}labelsets", 'lid');
            if ($labelsarray) {
                $count = 0;
                foreach ($labelsarray as $la) {
                    $lfieldorders = convertCSVRowToArray($labelsarray[0], ',', '"');
                    $lfieldcontents = convertCSVRowToArray($la, ',', '"');
                    if ($count == 0) {
                        $count++;
                        continue;
                    }
                    // Combine into one array with keys and values since its easier to handle
                    $labelrowdata = array_combine($lfieldorders, $lfieldcontents);
                    $labellid = $labelrowdata['lid'];
                    if ($importversion <= 132) {
                        $labelrowdata["assessment_value"] = (int) $labelrowdata["code"];
                    }
                    if ($labellid == $oldlid) {
                        $labelrowdata['lid'] = $newlid;
                        // translate internal links
                        $labelrowdata['title'] = translink('label', $oldlid, $newlid, $labelrowdata['title']);
                        $newvalues = array_values($labelrowdata);
                        $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
                        // quote everything accordingly
                        $lainsert = "INSERT INTO {$dbprefix}labels (" . implode(',', array_keys($labelrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
                        //handle db prefix
                        $liresult = $connect->Execute($lainsert);
                        if ($liresult !== false) {
                            $results['labels']++;
                        }
                    }
                }
            }
            //CHECK FOR DUPLICATE LABELSETS
            $thisset = "";
            $query2 = "SELECT code, title, sortorder, language, assessment_value\n                       FROM {$dbprefix}labels\n                       WHERE lid=" . $newlid . "\n                       ORDER BY language, sortorder, code";
            $result2 = db_execute_num($query2) or safe_die("Died querying labelset {$lid}<br />{$query2}<br />" . $connect->ErrorMsg());
            while ($row2 = $result2->FetchRow()) {
                $thisset .= implode('.', $row2);
            }
            // while
            $newcs = dechex(crc32($thisset) * 1);
            unset($lsmatch);
            if (isset($csarray)) {
                foreach ($csarray as $key => $val) {
                    if ($val == $newcs) {
                        $lsmatch = $key;
                    }
                }
            }
            if (isset($lsmatch) || $_SESSION['USER_RIGHT_MANAGE_LABEL'] != 1) {
                //There is a matching labelset or the user is not allowed to edit labels -
                // So, we will delete this one and refer to the matched one.
                $query = "DELETE FROM {$dbprefix}labels WHERE lid={$newlid}";
                $result = $connect->Execute($query) or safe_die("Couldn't delete labels<br />{$query}<br />" . $connect->ErrorMsg());
                $results['labels'] = $results['labels'] - $connect->Affected_Rows();
                $query = "DELETE FROM {$dbprefix}labelsets WHERE lid={$newlid}";
                $result = $connect->Execute($query) or safe_die("Couldn't delete labelset<br />{$query}<br />" . $connect->ErrorMsg());
                $results['labelsets'] = $results['labelsets'] - $connect->Affected_Rows();
                $newlid = $lsmatch;
            } else {
                //There isn't a matching labelset, add this checksum to the $csarray array
                $csarray[$newlid] = $newcs;
            }
            //END CHECK FOR DUPLICATES
            $aLIDReplacements[$oldlid] = $newlid;
        }
    }
    // Import groups
    if (isset($grouparray) && $grouparray) {
        // do GROUPS
        $gafieldorders = convertCSVRowToArray($grouparray[0], ',', '"');
        unset($grouparray[0]);
        $newgid = 0;
        $group_order = 0;
        // just to initialize this variable
        foreach ($grouparray as $ga) {
            $gacfieldcontents = convertCSVRowToArray($ga, ',', '"');
            $grouprowdata = array_combine($gafieldorders, $gacfieldcontents);
            // Skip not supported languages
            if (!in_array($grouprowdata['language'], $aLanguagesSupported)) {
                $skippedlanguages[] = $grouprowdata['language'];
                // this is for the message in the end.
                continue;
            }
            // replace the sid
            $oldsid = $grouprowdata['sid'];
            $grouprowdata['sid'] = $newsid;
            // replace the gid  or remove it if needed (it also will calculate the group order if is a new group)
            $oldgid = $grouprowdata['gid'];
            if ($newgid == 0) {
                unset($grouprowdata['gid']);
                // find the maximum group order and use this grouporder+1 to assign it to the new group
                $qmaxgo = "select max(group_order) as maxgo from " . db_table_name('groups') . " where sid={$newsid}";
                $gres = db_execute_assoc($qmaxgo) or safe_die($clang->gT("Error") . " Failed to find out maximum group order value<br />\n{$qmaxqo}<br />\n" . $connect->ErrorMsg());
                $grow = $gres->FetchRow();
                $group_order = $grow['maxgo'] + 1;
            } else {
                $grouprowdata['gid'] = $newgid;
            }
            $grouprowdata["group_order"] = $group_order;
            // Everything set - now insert it
            $grouprowdata = array_map('convertCsvreturn2return', $grouprowdata);
            // translate internal links
            $grouprowdata['group_name'] = translink('survey', $oldsid, $newsid, $grouprowdata['group_name']);
            $grouprowdata['description'] = translink('survey', $oldsid, $newsid, $grouprowdata['description']);
            db_switchIDInsert('groups', true);
            $tablename = $dbprefix . 'groups';
            $ginsert = $connect->GetinsertSQL($tablename, $grouprowdata);
            $gres = $connect->Execute($ginsert) or safe_die($clang->gT('Error') . ": Failed to insert group<br />\n{$ginsert}<br />\n" . $connect->ErrorMsg());
            db_switchIDInsert('groups', false);
            //GET NEW GID  .... if is not done before and we count a group if a new gid is required
            if ($newgid == 0) {
                $newgid = $connect->Insert_ID("{$dbprefix}groups", 'gid');
                $countgroups++;
            }
        }
        // GROUPS is DONE
        // Import questions
        if (isset($questionarray) && $questionarray) {
            foreach ($questionarray as $qa) {
                $qacfieldcontents = convertCSVRowToArray($qa, ',', '"');
                $questionrowdata = array_combine($questionfieldnames, $qacfieldcontents);
                $questionrowdata = array_map('convertCsvreturn2return', $questionrowdata);
                $questionrowdata["type"] = strtoupper($questionrowdata["type"]);
                // Skip not supported languages
                if (!in_array($questionrowdata['language'], $aLanguagesSupported)) {
                    continue;
                }
                // replace the sid
                $questionrowdata["sid"] = $newsid;
                // replace the gid (if the gid is not in the oldgid it means there is a problem with the exported record, so skip it)
                if ($questionrowdata['gid'] == $oldgid) {
                    $questionrowdata['gid'] = $newgid;
                } else {
                    continue;
                }
                // a problem with this question record -> don't consider
                if (isset($aQIDReplacements[$questionrowdata['qid']])) {
                    $questionrowdata['qid'] = $aQIDReplacements[$questionrowdata['qid']];
                } else {
                    $oldqid = $questionrowdata['qid'];
                    unset($questionrowdata['qid']);
                }
                // Save the following values - will need them for proper conversion later                if ((int)$questionrowdata['lid']>0)
                unset($oldlid1);
                unset($oldlid2);
                if (isset($questionrowdata['lid']) && $questionrowdata['lid'] > 0) {
                    $oldlid1 = $questionrowdata['lid'];
                }
                if (isset($questionrowdata['lid1']) && $questionrowdata['lid1'] > 0) {
                    $oldlid2 = $questionrowdata['lid1'];
                }
                unset($questionrowdata['lid']);
                unset($questionrowdata['lid1']);
                if ($questionrowdata['type'] == 'W') {
                    $questionrowdata['type'] = '!';
                } elseif ($questionrowdata['type'] == 'Z') {
                    $questionrowdata['type'] = 'L';
                }
                if (!isset($questionrowdata["question_order"]) || $questionrowdata["question_order"] == '') {
                    $questionrowdata["question_order"] = 0;
                }
                $questionrowdata = array_map('convertCsvreturn2return', $questionrowdata);
                // translate internal links
                $questionrowdata['title'] = translink('survey', $oldsid, $newsid, $questionrowdata['title']);
                $questionrowdata['question'] = translink('survey', $oldsid, $newsid, $questionrowdata['question']);
                $questionrowdata['help'] = translink('survey', $oldsid, $newsid, $questionrowdata['help']);
                $newvalues = array_values($questionrowdata);
                $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
                // quote everything accordingly
                if (isset($questionrowdata['qid'])) {
                    db_switchIDInsert('questions', true);
                }
                $tablename = $dbprefix . 'questions';
                $qinsert = $connect->GetInsertSQL($tablename, $questionrowdata);
                $qres = $connect->Execute($qinsert) or safe_die($clang->gT("Error") . ": Failed to insert question<br />\n{$qinsert}<br />\n" . $connect->ErrorMsg());
                $results['questions']++;
                //GET NEW QID  .... if is not done before and we count a question if a new qid is required
                if (isset($questionrowdata['qid'])) {
                    $saveqid = $questionrowdata['qid'];
                } else {
                    $aQIDReplacements[$oldqid] = $connect->Insert_ID("{$dbprefix}questions", 'qid');
                    $saveqid = $aQIDReplacements[$oldqid];
                }
                $qtypes = getqtypelist("", "array");
                $aSQIDReplacements = array();
                db_switchIDInsert('questions', false);
                // Now we will fix up old label sets where they are used as answers
                if ((isset($oldlid1) || isset($oldlid2)) && ($qtypes[$questionrowdata['type']]['answerscales'] > 0 || $qtypes[$questionrowdata['type']]['subquestions'] > 1)) {
                    $query = "select * from " . db_table_name('labels') . " where lid={$aLIDReplacements[$oldlid1]} and language='{$questionrowdata['language']}'";
                    $oldlabelsresult = db_execute_assoc($query);
                    while ($labelrow = $oldlabelsresult->FetchRow()) {
                        if (in_array($labelrow['language'], $aLanguagesSupported)) {
                            if ($qtypes[$questionrowdata['type']]['subquestions'] < 2) {
                                $qinsert = "insert INTO " . db_table_name('answers') . " (qid,code,answer,sortorder,language,assessment_value)\n                                        VALUES ({$aQIDReplacements[$oldqid]}," . db_quoteall($labelrow['code']) . "," . db_quoteall($labelrow['title']) . "," . db_quoteall($labelrow['sortorder']) . "," . db_quoteall($labelrow['language']) . "," . db_quoteall($labelrow['assessment_value']) . ")";
                                $qres = $connect->Execute($qinsert) or safe_die($clang->gT("Error") . ": Failed to insert answer (lid1) <br />\n{$qinsert}<br />\n" . $connect->ErrorMsg());
                            } else {
                                if (isset($aSQIDReplacements[$labelrow['code'] . '_' . $saveqid])) {
                                    $fieldname = 'qid,';
                                    $data = $aSQIDReplacements[$labelrow['code'] . '_' . $saveqid] . ',';
                                } else {
                                    $fieldname = '';
                                    $data = '';
                                }
                                $qinsert = "insert INTO " . db_table_name('questions') . " ({$fieldname} parent_qid,title,question,question_order,language,scale_id,type, sid, gid)\n                                        VALUES ({$data}{$aQIDReplacements[$oldqid]}," . db_quoteall($labelrow['code']) . "," . db_quoteall($labelrow['title']) . "," . db_quoteall($labelrow['sortorder']) . "," . db_quoteall($labelrow['language']) . ",1,'{$questionrowdata['type']}',{$questionrowdata['sid']},{$questionrowdata['gid']})";
                                $qres = $connect->Execute($qinsert) or safe_die($clang->gT("Error") . ": Failed to insert question <br />\n{$qinsert}<br />\n" . $connect->ErrorMsg());
                                if ($fieldname == '') {
                                    $aSQIDReplacements[$labelrow['code'] . '_' . $saveqid] = $connect->Insert_ID("{$dbprefix}questions", "qid");
                                }
                            }
                        }
                    }
                    if (isset($oldlid2) && $qtypes[$questionrowdata['type']]['answerscales'] > 1) {
                        $query = "select * from " . db_table_name('labels') . " where lid={$aLIDReplacements[$oldlid2]} and language='{$questionrowdata['language']}'";
                        $oldlabelsresult = db_execute_assoc($query);
                        while ($labelrow = $oldlabelsresult->FetchRow()) {
                            $qinsert = "insert INTO " . db_table_name('answers') . " (qid,code,answer,sortorder,language,assessment_value,scale_id)\n                                    VALUES ({$aQIDReplacements[$oldqid]}," . db_quoteall($labelrow['code']) . "," . db_quoteall($labelrow['title']) . "," . db_quoteall($labelrow['sortorder']) . "," . db_quoteall($labelrow['language']) . "," . db_quoteall($labelrow['assessment_value']) . ",1)";
                            $qres = $connect->Execute($qinsert) or safe_die($clang->gT("Error") . ": Failed to insert answer (lid2)<br />\n{$qinsert}<br />\n" . $connect->ErrorMsg());
                        }
                    }
                }
            }
        }
        //Do answers
        $results['subquestions'] = 0;
        if (isset($answerarray) && $answerarray) {
            foreach ($answerarray as $aa) {
                $answerfieldcontents = convertCSVRowToArray($aa, ',', '"');
                $answerrowdata = array_combine($answerfieldnames, $answerfieldcontents);
                if ($answerrowdata === false) {
                    $importquestion .= '<br />' . $clang->gT("Faulty line in import - fields and data don't match") . ":" . implode(',', $answerfieldcontents);
                }
                // Skip not supported languages
                if (!in_array($answerrowdata['language'], $aLanguagesSupported)) {
                    continue;
                }
                // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this answer is orphan -> error, skip this record)
                if (isset($aQIDReplacements[$answerrowdata["qid"]])) {
                    $answerrowdata["qid"] = $aQIDReplacements[$answerrowdata["qid"]];
                } else {
                    continue;
                }
                // a problem with this answer record -> don't consider
                if ($importversion <= 132) {
                    $answerrowdata["assessment_value"] = (int) $answerrowdata["code"];
                }
                // Convert default values for single select questions
                $questiontemp = $connect->GetRow('select type,gid from ' . db_table_name('questions') . ' where qid=' . $answerrowdata["qid"]);
                $oldquestion['newtype'] = $questiontemp['type'];
                $oldquestion['gid'] = $questiontemp['gid'];
                if ($answerrowdata['default_value'] == 'Y' && ($oldquestion['newtype'] == 'L' || $oldquestion['newtype'] == 'O' || $oldquestion['newtype'] == '!')) {
                    $insertdata = array();
                    $insertdata['qid'] = $newqid;
                    $insertdata['language'] = $answerrowdata['language'];
                    $insertdata['defaultvalue'] = $answerrowdata['answer'];
                    $query = $connect->GetInsertSQL($dbprefix . 'defaultvalues', $insertdata);
                    $qres = $connect->Execute($query) or safe_die("Error: Failed to insert defaultvalue <br />{$query}<br />\n" . $connect->ErrorMsg());
                }
                // translate internal links
                $answerrowdata['answer'] = translink('survey', $oldsid, $newsid, $answerrowdata['answer']);
                // Everything set - now insert it
                $answerrowdata = array_map('convertCsvreturn2return', $answerrowdata);
                if ($qtypes[$oldquestion['newtype']]['subquestions'] > 0) {
                    $questionrowdata = array();
                    if (isset($aSQIDReplacements[$answerrowdata['code'] . $answerrowdata['qid']])) {
                        $questionrowdata['qid'] = $aSQIDReplacements[$answerrowdata['code'] . $answerrowdata['qid']];
                    }
                    $questionrowdata['parent_qid'] = $answerrowdata['qid'];
                    $questionrowdata['sid'] = $newsid;
                    $questionrowdata['gid'] = $oldquestion['gid'];
                    $questionrowdata['title'] = $answerrowdata['code'];
                    $questionrowdata['question'] = $answerrowdata['answer'];
                    $questionrowdata['question_order'] = $answerrowdata['sortorder'];
                    $questionrowdata['language'] = $answerrowdata['language'];
                    $questionrowdata['type'] = $oldquestion['newtype'];
                    $tablename = $dbprefix . 'questions';
                    $query = $connect->GetInsertSQL($tablename, $questionrowdata);
                    if (isset($questionrowdata['qid'])) {
                        db_switchIDInsert('questions', true);
                    }
                    $qres = $connect->Execute($query) or safe_die("Error: Failed to insert subquestion <br />{$query}<br />" . $connect->ErrorMsg());
                    if (!isset($questionrowdata['qid'])) {
                        $aSQIDReplacements[$answerrowdata['code'] . $answerrowdata['qid']] = $connect->Insert_ID("{$dbprefix}questions", "qid");
                    } else {
                        db_switchIDInsert('questions', false);
                    }
                    $results['subquestions']++;
                    // also convert default values subquestions for multiple choice
                    if ($answerrowdata['default_value'] == 'Y' && ($oldquestion['newtype'] == 'M' || $oldquestion['newtype'] == 'P')) {
                        $insertdata = array();
                        $insertdata['qid'] = $newqid;
                        $insertdata['sqid'] = $aSQIDReplacements[$answerrowdata['code']];
                        $insertdata['language'] = $answerrowdata['language'];
                        $insertdata['defaultvalue'] = 'Y';
                        $tablename = $dbprefix . 'defaultvalues';
                        $query = $connect->GetInsertSQL($tablename, $insertdata);
                        $qres = $connect->Execute($query) or safe_die("Error: Failed to insert defaultvalue <br />{$query}<br />\n" . $connect->ErrorMsg());
                    }
                } else {
                    unset($answerrowdata['default_value']);
                    $tablename = $dbprefix . 'answers';
                    $query = $connect->GetInsertSQL($tablename, $answerrowdata);
                    $ares = $connect->Execute($query) or safe_die("Error: Failed to insert answer<br />{$query}<br />\n" . $connect->ErrorMsg());
                    $results['answers']++;
                }
            }
        }
        // ANSWERS is DONE
        // Fix sortorder of the groups  - if users removed groups manually from the csv file there would be gaps
        fixSortOrderGroups($surveyid);
        //... and for the questions inside the groups
        // get all group ids and fix questions inside each group
        $gquery = "SELECT gid FROM {$dbprefix}groups where sid={$newsid} group by gid ORDER BY gid";
        //Get last question added (finds new qid)
        $gres = db_execute_assoc($gquery);
        while ($grow = $gres->FetchRow()) {
            fixsortorderQuestions($grow['gid'], $newsid);
        }
    }
    $results['question_attributes'] = 0;
    // Finally the question attributes - it is called just once and only if there was a question
    if (isset($question_attributesarray) && $question_attributesarray) {
        //ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUES
        $fieldorders = convertCSVRowToArray($question_attributesarray[0], ',', '"');
        unset($question_attributesarray[0]);
        foreach ($question_attributesarray as $qar) {
            $fieldcontents = convertCSVRowToArray($qar, ',', '"');
            $qarowdata = array_combine($fieldorders, $fieldcontents);
            // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this attribute is orphan -> error, skip this record)
            if (isset($aQIDReplacements[$qarowdata["qid"]])) {
                $qarowdata["qid"] = $aQIDReplacements[$qarowdata["qid"]];
            } else {
                continue;
            }
            // a problem with this answer record -> don't consider
            unset($qarowdata["qaid"]);
            $tablename = "{$dbprefix}question_attributes";
            $qainsert = $connect->GetInsertSQL($tablename, $qarowdata);
            $result = $connect->Execute($qainsert);
            if ($result !== false) {
                $results['question_attributes']++;
            }
        }
    }
    // ATTRIBUTES is DONE
    // do CONDITIONS
    $results['conditions'] = 0;
    if (isset($conditionsarray) && $conditionsarray) {
        $fieldorders = convertCSVRowToArray($conditionsarray[0], ',', '"');
        unset($conditionsarray[0]);
        foreach ($conditionsarray as $car) {
            $fieldcontents = convertCSVRowToArray($car, ',', '"');
            $conditionrowdata = array_combine($fieldorders, $fieldcontents);
            $oldqid = $conditionrowdata["qid"];
            $oldcqid = $conditionrowdata["cqid"];
            // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this condition is orphan -> error, skip this record)
            if (isset($aQIDReplacements[$oldqid])) {
                $conditionrowdata["qid"] = $aQIDReplacements[$oldqid];
            } else {
                continue;
            }
            // a problem with this answer record -> don't consider
            // replace the cqid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this condition is orphan -> error, skip this record)
            if (isset($aQIDReplacements[$oldcqid])) {
                $conditionrowdata["cqid"] = $aQIDReplacements[$oldcqid];
            } else {
                continue;
            }
            // a problem with this answer record -> don't consider
            list($oldcsid, $oldcgid, $oldqidanscode) = explode("X", $conditionrowdata["cfieldname"], 3);
            if ($oldcgid != $oldgid) {
                // this means that the condition is in another group (so it should not have to be been exported -> skip it
                continue;
            }
            unset($conditionrowdata["cid"]);
            // recreate the cfieldname with the new IDs
            if (preg_match("/^\\+/", $oldcsid)) {
                $newcfieldname = '+' . $newsid . "X" . $newgid . "X" . $conditionrowdata["cqid"] . substr($oldqidanscode, strlen($oldqid));
            } else {
                $newcfieldname = $newsid . "X" . $newgid . "X" . $conditionrowdata["cqid"] . substr($oldqidanscode, strlen($oldqid));
            }
            $conditionrowdata["cfieldname"] = $newcfieldname;
            if (!isset($conditionrowdata["method"]) || trim($conditionrowdata["method"]) == '') {
                $conditionrowdata["method"] = '==';
            }
            $newvalues = array_values($conditionrowdata);
            $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
            // quote everything accordingly
            $conditioninsert = "insert INTO {$dbprefix}conditions (" . implode(',', array_keys($conditionrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
            $result = $connect->Execute($conditioninsert) or safe_die("Couldn't insert condition<br />{$conditioninsert}<br />" . $connect->ErrorMsg());
            $results['conditions']++;
        }
    }
    LimeExpressionManager::RevertUpgradeConditionsToRelevance($newsid);
    LimeExpressionManager::UpgradeConditionsToRelevance($newsid);
    $results['groups'] = 1;
    $results['newgid'] = $newgid;
    return $results;
}
示例#9
0
 /**
  * import from csv
  */
 function import($iSurveyId)
 {
     $clang = $this->getController()->lang;
     $iSurveyId = (int) $iSurveyId;
     if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'import')) {
         Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
         $this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
     }
     // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
     $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
     if (!$bTokenExists) {
         self::_newtokentable($iSurveyId);
     }
     App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . 'tokens.js');
     $aEncodings = aEncodingsArray();
     if (Yii::app()->request->getPost('submit')) {
         if (Yii::app()->request->getPost('csvcharset') && Yii::app()->request->getPost('csvcharset')) {
             $uploadcharset = Yii::app()->request->getPost('csvcharset');
             if (!array_key_exists($uploadcharset, $aEncodings)) {
                 $uploadcharset = 'auto';
             }
             $filterduplicatetoken = Yii::app()->request->getPost('filterduplicatetoken') && Yii::app()->request->getPost('filterduplicatetoken') == 'on';
             $filterblankemail = Yii::app()->request->getPost('filterblankemail') && Yii::app()->request->getPost('filterblankemail') == 'on';
         }
         $attrfieldnames = getAttributeFieldNames($iSurveyId);
         $duplicatelist = array();
         $invalidemaillist = array();
         $invalidformatlist = array();
         $firstline = array();
         $sPath = Yii::app()->getConfig('tempdir');
         $sFileTmpName = $_FILES['the_file']['tmp_name'];
         $sFilePath = $sPath . '/' . randomChars(20);
         if (!@move_uploaded_file($sFileTmpName, $sFilePath)) {
             $aData['sError'] = $clang->gT("Upload file not found. Check your permissions and path ({$sFilePath}) for the upload directory");
             $aData['aEncodings'] = $aEncodings;
             $aData['iSurveyId'] = $aData['surveyid'] = $iSurveyId;
             $aData['thissurvey'] = getSurveyInfo($iSurveyId);
             $this->_renderWrappedTemplate('token', array('tokenbar', 'csvupload'), $aData);
         } else {
             $xz = 0;
             $recordcount = 0;
             $xv = 0;
             // This allows to read file with MAC line endings too
             @ini_set('auto_detect_line_endings', true);
             // open it and trim the ednings
             $tokenlistarray = file($sFilePath);
             $sBaseLanguage = Survey::model()->findByPk($iSurveyId)->language;
             if (!Yii::app()->request->getPost('filterduplicatefields') || Yii::app()->request->getPost('filterduplicatefields') && count(Yii::app()->request->getPost('filterduplicatefields')) == 0) {
                 $filterduplicatefields = array('firstname', 'lastname', 'email');
             } else {
                 $filterduplicatefields = Yii::app()->request->getPost('filterduplicatefields');
             }
             $separator = returnGlobal('separator');
             foreach ($tokenlistarray as $buffer) {
                 $buffer = @mb_convert_encoding($buffer, "UTF-8", $uploadcharset);
                 if ($recordcount == 0) {
                     // Parse first line (header) from CSV
                     $buffer = removeBOM($buffer);
                     $allowedfieldnames = array('firstname', 'lastname', 'email', 'emailstatus', 'token', 'language', 'validfrom', 'validuntil', 'usesleft');
                     $allowedfieldnames = array_merge($attrfieldnames, $allowedfieldnames);
                     switch ($separator) {
                         case 'comma':
                             $separator = ',';
                             break;
                         case 'semicolon':
                             $separator = ';';
                             break;
                         default:
                             $comma = substr_count($buffer, ',');
                             $semicolon = substr_count($buffer, ';');
                             if ($semicolon > $comma) {
                                 $separator = ';';
                             } else {
                                 $separator = ',';
                             }
                     }
                     $firstline = convertCSVRowToArray($buffer, $separator, '"');
                     $firstline = array_map('trim', $firstline);
                     $ignoredcolumns = array();
                     // Now check the first line for invalid fields
                     foreach ($firstline as $index => $fieldname) {
                         $firstline[$index] = preg_replace("/(.*) <[^,]*>\$/", "\$1", $fieldname);
                         $fieldname = $firstline[$index];
                         if (!in_array($fieldname, $allowedfieldnames)) {
                             $ignoredcolumns[] = $fieldname;
                         }
                     }
                     if (!in_array('firstname', $firstline) || !in_array('lastname', $firstline) || !in_array('email', $firstline)) {
                         $recordcount = count($tokenlistarray);
                         break;
                     }
                 } else {
                     $line = convertCSVRowToArray($buffer, $separator, '"');
                     if (count($firstline) != count($line)) {
                         $invalidformatlist[] = $recordcount;
                         $recordcount++;
                         continue;
                     }
                     $writearray = array_combine($firstline, $line);
                     //kick out ignored columns
                     foreach ($ignoredcolumns as $column) {
                         unset($writearray[$column]);
                     }
                     $dupfound = false;
                     $invalidemail = false;
                     if ($filterduplicatetoken != false) {
                         $dupquery = "SELECT count(tid) from {{tokens_" . intval($iSurveyId) . "}} where 1=1";
                         foreach ($filterduplicatefields as $field) {
                             if (isset($writearray[$field])) {
                                 $dupquery .= " and " . Yii::app()->db->quoteColumnName($field) . " = " . Yii::app()->db->quoteValue($writearray[$field]);
                             }
                         }
                         $dupresult = Yii::app()->db->createCommand($dupquery)->queryScalar();
                         if ($dupresult > 0) {
                             $dupfound = true;
                             $duplicatelist[] = Yii::app()->db->quoteValue($writearray['firstname']) . " " . Yii::app()->db->quoteValue($writearray['lastname']) . " (" . Yii::app()->db->quoteValue($writearray['email']) . ")";
                         }
                     }
                     $writearray['email'] = trim($writearray['email']);
                     //treat blank emails
                     if ($filterblankemail && $writearray['email'] == '') {
                         $invalidemail = true;
                         $invalidemaillist[] = $line[0] . " " . $line[1] . " ( )";
                     }
                     if ($writearray['email'] != '') {
                         $aEmailAddresses = explode(';', $writearray['email']);
                         foreach ($aEmailAddresses as $sEmailaddress) {
                             if (!validateEmailAddress($sEmailaddress)) {
                                 $invalidemail = true;
                                 $invalidemaillist[] = $line[0] . " " . $line[1] . " (" . $line[2] . ")";
                             }
                         }
                     }
                     if (!isset($writearray['token'])) {
                         $writearray['token'] = '';
                     } else {
                         $writearray['token'] = sanitize_token($writearray['token']);
                     }
                     if (!$dupfound && !$invalidemail) {
                         if (!isset($writearray['emailstatus']) || $writearray['emailstatus'] == '') {
                             $writearray['emailstatus'] = "OK";
                         }
                         if (!isset($writearray['usesleft']) || $writearray['usesleft'] == '') {
                             $writearray['usesleft'] = 1;
                         }
                         if (!isset($writearray['language']) || $writearray['language'] == "") {
                             $writearray['language'] = $sBaseLanguage;
                         }
                         if (isset($writearray['validfrom']) && trim($writearray['validfrom'] == '')) {
                             unset($writearray['validfrom']);
                         }
                         if (isset($writearray['validuntil']) && trim($writearray['validuntil'] == '')) {
                             unset($writearray['validuntil']);
                         }
                         // sanitize it before writing into table
                         foreach ($writearray as $key => $value) {
                             if (substr($value, 0, 1) == '"' && substr($value, -1) == '"') {
                                 $value = substr($value, 1, -1);
                             }
                             $sanitizedArray[Yii::app()->db->quoteColumnName($key)] = Yii::app()->db->quoteValue($value);
                         }
                         $iq = "INSERT INTO {{tokens_{$iSurveyId}}} \n" . "(" . implode(',', array_keys($writearray)) . ") \n" . "VALUES (" . implode(",", $sanitizedArray) . ")";
                         $ir = Yii::app()->db->createCommand($iq)->execute();
                         if (!$ir) {
                             $duplicatelist[] = $writearray['firstname'] . " " . $writearray['lastname'] . " (" . $writearray['email'] . ")";
                         } else {
                             $xz++;
                         }
                     }
                     $xv++;
                 }
                 $recordcount++;
             }
             $recordcount = $recordcount - 1;
             unlink($sFilePath);
             $aData['tokenlistarray'] = $tokenlistarray;
             $aData['xz'] = $xz;
             $aData['xv'] = $xv;
             $aData['recordcount'] = $recordcount;
             $aData['firstline'] = $firstline;
             $aData['duplicatelist'] = $duplicatelist;
             $aData['invalidformatlist'] = $invalidformatlist;
             $aData['invalidemaillist'] = $invalidemaillist;
             $aData['thissurvey'] = getSurveyInfo($iSurveyId);
             $aData['iSurveyId'] = $aData['surveyid'] = $iSurveyId;
             $this->_renderWrappedTemplate('token', array('tokenbar', 'csvpost'), $aData);
         }
     } else {
         $aData['aEncodings'] = $aEncodings;
         $aData['iSurveyId'] = $iSurveyId;
         $aData['thissurvey'] = getSurveyInfo($iSurveyId);
         $aData['surveyid'] = $iSurveyId;
         $aTokenTableFields = getTokenFieldsAndNames($iSurveyId);
         unset($aTokenTableFields['sent']);
         unset($aTokenTableFields['remindersent']);
         unset($aTokenTableFields['remindercount']);
         unset($aTokenTableFields['usesleft']);
         foreach ($aTokenTableFields as $sKey => $sValue) {
             if ($sValue['description'] != $sKey) {
                 $sValue['description'] .= ' - ' . $sKey;
             }
             $aNewTokenTableFields[$sKey] = $sValue['description'];
         }
         $aData['aTokenTableFields'] = $aNewTokenTableFields;
         $this->_renderWrappedTemplate('token', array('tokenbar', 'csvupload'), $aData);
     }
 }
示例#10
0
 /**
  * import from csv
  */
 function import($iSurveyId)
 {
     // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
     $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
     if (!$bTokenExists) {
         self::_newtokentable($iSurveyId);
     }
     $clang = $this->getController()->lang;
     $iSurveyId = (int) $iSurveyId;
     if (!hasSurveyPermission($iSurveyId, 'tokens', 'create')) {
         die('access denied');
     }
     $this->getController()->_js_admin_includes(Yii::app()->getConfig('adminscripts') . 'tokens.js');
     $aEncodings = array("armscii8" => $clang->gT("ARMSCII-8 Armenian"), "ascii" => $clang->gT("US ASCII"), "auto" => $clang->gT("Automatic"), "big5" => $clang->gT("Big5 Traditional Chinese"), "binary" => $clang->gT("Binary pseudo charset"), "cp1250" => $clang->gT("Windows Central European"), "cp1251" => $clang->gT("Windows Cyrillic"), "cp1256" => $clang->gT("Windows Arabic"), "cp1257" => $clang->gT("Windows Baltic"), "cp850" => $clang->gT("DOS West European"), "cp852" => $clang->gT("DOS Central European"), "cp866" => $clang->gT("DOS Russian"), "cp932" => $clang->gT("SJIS for Windows Japanese"), "dec8" => $clang->gT("DEC West European"), "eucjpms" => $clang->gT("UJIS for Windows Japanese"), "euckr" => $clang->gT("EUC-KR Korean"), "gb2312" => $clang->gT("GB2312 Simplified Chinese"), "gbk" => $clang->gT("GBK Simplified Chinese"), "geostd8" => $clang->gT("GEOSTD8 Georgian"), "greek" => $clang->gT("ISO 8859-7 Greek"), "hebrew" => $clang->gT("ISO 8859-8 Hebrew"), "hp8" => $clang->gT("HP West European"), "keybcs2" => $clang->gT("DOS Kamenicky Czech-Slovak"), "koi8r" => $clang->gT("KOI8-R Relcom Russian"), "koi8u" => $clang->gT("KOI8-U Ukrainian"), "latin1" => $clang->gT("cp1252 West European"), "latin2" => $clang->gT("ISO 8859-2 Central European"), "latin5" => $clang->gT("ISO 8859-9 Turkish"), "latin7" => $clang->gT("ISO 8859-13 Baltic"), "macce" => $clang->gT("Mac Central European"), "macroman" => $clang->gT("Mac West European"), "sjis" => $clang->gT("Shift-JIS Japanese"), "swe7" => $clang->gT("7bit Swedish"), "tis620" => $clang->gT("TIS620 Thai"), "ucs2" => $clang->gT("UCS-2 Unicode"), "ujis" => $clang->gT("EUC-JP Japanese"), "utf8" => $clang->gT("UTF-8 Unicode"));
     if (Yii::app()->request->getPost('submit')) {
         if (Yii::app()->request->getPost('csvcharset') && Yii::app()->request->getPost('csvcharset')) {
             $uploadcharset = Yii::app()->request->getPost('csvcharset');
             if (!array_key_exists($uploadcharset, $aEncodings)) {
                 $uploadcharset = 'auto';
             }
             $filterduplicatetoken = Yii::app()->request->getPost('filterduplicatetoken') && Yii::app()->request->getPost('filterduplicatetoken') == 'on';
             $filterblankemail = Yii::app()->request->getPost('filterblankemail') && Yii::app()->request->getPost('filterblankemail') == 'on';
         }
         $attrfieldnames = getAttributeFieldNames($iSurveyId);
         $duplicatelist = array();
         $invalidemaillist = array();
         $invalidformatlist = array();
         $firstline = array();
         $sPath = Yii::app()->getConfig('tempdir');
         $sFileName = $_FILES['the_file']['name'];
         $sFileTmpName = $_FILES['the_file']['tmp_name'];
         $sFilePath = $sPath . '/' . $sFileName;
         if (!@move_uploaded_file($sFileTmpName, $sFilePath)) {
             $aData['sError'] = $clang->gT("Upload file not found. Check your permissions and path ({$sFilePath}) for the upload directory");
             $aData['aEncodings'] = $aEncodings;
             $aData['iSurveyId'] = $aData['surveyid'] = $iSurveyId;
             $aData['thissurvey'] = getSurveyInfo($iSurveyId);
             $this->_renderWrappedTemplate('token', array('tokenbar', 'csvupload'), $aData);
         } else {
             $xz = 0;
             $recordcount = 0;
             $xv = 0;
             // This allows to read file with MAC line endings too
             @ini_set('auto_detect_line_endings', true);
             // open it and trim the ednings
             $tokenlistarray = file($sFilePath);
             $sBaseLanguage = Survey::model()->findByPk($iSurveyId)->language;
             if (!Yii::app()->request->getPost('filterduplicatefields') || Yii::app()->request->getPost('filterduplicatefields') && count(Yii::app()->request->getPost('filterduplicatefields')) == 0) {
                 $filterduplicatefields = array('firstname', 'lastname', 'email');
             } else {
                 $filterduplicatefields = Yii::app()->request->getPost('filterduplicatefields');
             }
             $separator = returnGlobal('separator');
             foreach ($tokenlistarray as $buffer) {
                 $buffer = @mb_convert_encoding($buffer, "UTF-8", $uploadcharset);
                 $firstname = "";
                 $lastname = "";
                 $email = "";
                 $emailstatus = "OK";
                 $token = "";
                 $language = "";
                 $attribute1 = "";
                 $attribute2 = "";
                 //Clear out values from the last path, in case the next line is missing a value
                 if ($recordcount == 0) {
                     // Pick apart the first line
                     $buffer = removeBOM($buffer);
                     $allowedfieldnames = array('firstname', 'lastname', 'email', 'emailstatus', 'token', 'language', 'validfrom', 'validuntil', 'usesleft');
                     $allowedfieldnames = array_merge($attrfieldnames, $allowedfieldnames);
                     switch ($separator) {
                         case 'comma':
                             $separator = ',';
                             break;
                         case 'semicolon':
                             $separator = ';';
                             break;
                         default:
                             $comma = substr_count($buffer, ',');
                             $semicolon = substr_count($buffer, ';');
                             if ($semicolon > $comma) {
                                 $separator = ';';
                             } else {
                                 $separator = ',';
                             }
                     }
                     $firstline = convertCSVRowToArray($buffer, $separator, '"');
                     $firstline = array_map('trim', $firstline);
                     $ignoredcolumns = array();
                     //now check the first line for invalid fields
                     foreach ($firstline as $index => $fieldname) {
                         $firstline[$index] = preg_replace("/(.*) <[^,]*>\$/", "\$1", $fieldname);
                         $fieldname = $firstline[$index];
                         if (!in_array($fieldname, $allowedfieldnames)) {
                             $ignoredcolumns[] = $fieldname;
                         }
                     }
                     if (!in_array('firstname', $firstline) || !in_array('lastname', $firstline) || !in_array('email', $firstline)) {
                         $recordcount = count($tokenlistarray);
                         break;
                     }
                 } else {
                     $line = convertCSVRowToArray($buffer, $separator, '"');
                     if (count($firstline) != count($line)) {
                         $invalidformatlist[] = $recordcount;
                         $recordcount++;
                         continue;
                     }
                     $writearray = array_combine($firstline, $line);
                     //kick out ignored columns
                     foreach ($ignoredcolumns as $column) {
                         unset($writearray[$column]);
                     }
                     $dupfound = false;
                     $invalidemail = false;
                     if ($filterduplicatetoken != false) {
                         $dupquery = "SELECT count(tid) from {{tokens_" . intval($iSurveyId) . "}} where 1=1";
                         foreach ($filterduplicatefields as $field) {
                             if (isset($writearray[$field])) {
                                 $dupquery .= " and " . Yii::app()->db->quoteColumnName($field) . " = " . Yii::app()->db->quoteValue($writearray[$field]);
                             }
                         }
                         $dupresult = Yii::app()->db->createCommand($dupquery)->queryScalar();
                         if ($dupresult > 0) {
                             $dupfound = true;
                             $duplicatelist[] = Yii::app()->db->quoteValue($writearray['firstname']) . " " . Yii::app()->db->quoteValue($writearray['lastname']) . " (" . Yii::app()->db->quoteValue($writearray['email']) . ")";
                         }
                     }
                     $writearray['email'] = trim($writearray['email']);
                     //treat blank emails
                     if ($filterblankemail && $writearray['email'] == '') {
                         $invalidemail = true;
                         $invalidemaillist[] = $line[0] . " " . $line[1] . " ( )";
                     }
                     if ($writearray['email'] != '') {
                         $aEmailAddresses = explode(';', $writearray['email']);
                         foreach ($aEmailAddresses as $sEmailaddress) {
                             if (!validateEmailAddress($sEmailaddress)) {
                                 $invalidemail = true;
                                 $invalidemaillist[] = $line[0] . " " . $line[1] . " (" . $line[2] . ")";
                             }
                         }
                     }
                     if (!isset($writearray['token'])) {
                         $writearray['token'] = '';
                     } else {
                         $writearray['token'] = sanitize_token($writearray['token']);
                     }
                     if (!$dupfound && !$invalidemail) {
                         if (!isset($writearray['emailstatus']) || $writearray['emailstatus'] == '') {
                             $writearray['emailstatus'] = "OK";
                         }
                         if (!isset($writearray['usesleft']) || $writearray['usesleft'] == '') {
                             $writearray['usesleft'] = 1;
                         }
                         if (!isset($writearray['language']) || $writearray['language'] == "") {
                             $writearray['language'] = $sBaseLanguage;
                         }
                         if (isset($writearray['validfrom']) && trim($writearray['validfrom'] == '')) {
                             unset($writearray['validfrom']);
                         }
                         if (isset($writearray['validuntil']) && trim($writearray['validuntil'] == '')) {
                             unset($writearray['validuntil']);
                         }
                         // sanitize it before writing into table
                         foreach ($writearray as $key => $value) {
                             if (substr($value, 0, 1) == '"' && substr($value, -1) == '"') {
                                 $value = substr($value, 1, -1);
                             }
                             $sanitizedArray[Yii::app()->db->quoteColumnName($key)] = Yii::app()->db->quoteValue($value);
                         }
                         $iq = "INSERT INTO {{tokens_{$iSurveyId}}} \n" . "(" . implode(',', array_keys($writearray)) . ") \n" . "VALUES (" . implode(",", $sanitizedArray) . ")";
                         $ir = Yii::app()->db->createCommand($iq)->execute();
                         if (!$ir) {
                             $duplicatelist[] = $writearray['firstname'] . " " . $writearray['lastname'] . " (" . $writearray['email'] . ")";
                         } else {
                             $xz++;
                         }
                     }
                     $xv++;
                 }
                 $recordcount++;
             }
             $recordcount = $recordcount - 1;
             unlink($sFilePath);
             $aData['tokenlistarray'] = $tokenlistarray;
             $aData['xz'] = $xz;
             $aData['xv'] = $xv;
             $aData['recordcount'] = $recordcount;
             $aData['firstline'] = $firstline;
             $aData['duplicatelist'] = $duplicatelist;
             $aData['invalidformatlist'] = $invalidformatlist;
             $aData['invalidemaillist'] = $invalidemaillist;
             $aData['thissurvey'] = getSurveyInfo($iSurveyId);
             $aData['iSurveyId'] = $aData['surveyid'] = $iSurveyId;
             $this->_renderWrappedTemplate('token', array('tokenbar', 'csvpost'), $aData);
         }
     } else {
         $aData['aEncodings'] = $aEncodings;
         $aData['iSurveyId'] = $iSurveyId;
         $aData['thissurvey'] = getSurveyInfo($iSurveyId);
         $aData['surveyid'] = $iSurveyId;
         $this->_renderWrappedTemplate('token', array('tokenbar', 'csvupload'), $aData);
     }
 }
示例#11
0
/**
* This function imports an old-school question file (*.csv,*.sql)
*
* @param mixed $sFullFilepath Full file patch to the import file
* @param mixed $newsid  Survey ID to which the question is attached
* @param mixed $newgid  Group ID top which the question is attached
*/
function CSVImportQuestion($sFullFilepath, $newsid, $newgid)
{
    global $dbprefix, $connect, $clang;
    $aLIDReplacements = array();
    $aQIDReplacements = array();
    // this array will have the "new qid" for the questions, the key will be the "old qid"
    $aSQIDReplacements = array();
    $results['labelsets'] = 0;
    $results['labels'] = 0;
    $handle = fopen($sFullFilepath, "r");
    while (!feof($handle)) {
        $buffer = fgets($handle);
        //To allow for very long survey welcomes (up to 10k)
        $bigarray[] = $buffer;
    }
    fclose($handle);
    $importversion = 0;
    // Now we try to determine the dataformat of the survey file.
    if (substr($bigarray[1], 0, 24) == "# SURVEYOR QUESTION DUMP") {
        $importversion = 100;
        // version 1.0 or 0.99 file
    } elseif (substr($bigarray[0], 0, 26) == "# LimeSurvey Question Dump" || substr($bigarray[0], 0, 27) == "# PHPSurveyor Question Dump") {
        // This is a >1.0 version file - these files carry the version information to read in line two
        $importversion = (int) substr($bigarray[1], 12, 3);
    } else {
        $results['fatalerror'] = $clang->gT("This file is not a LimeSurvey question file. Import failed.");
        return $results;
    }
    if ((int) $importversion < 112) {
        $results['fatalerror'] = $clang->gT("This file is too old. Only files from LimeSurvey version 1.50 (DBVersion 112) and newer are supported.");
        return $results;
    }
    for ($i = 0; $i < 9; $i++) {
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //QUESTIONS
    if (array_search("# ANSWERS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# ANSWERS TABLE\n", $bigarray);
    } elseif (array_search("# ANSWERS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# ANSWERS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $questionarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //ANSWERS
    if (array_search("# LABELSETS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# LABELSETS TABLE\n", $bigarray);
    } elseif (array_search("# LABELSETS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# LABELSETS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $answerarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //LABELSETS
    if (array_search("# LABELS TABLE\n", $bigarray)) {
        $stoppoint = array_search("# LABELS TABLE\n", $bigarray);
    } elseif (array_search("# LABELS TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $labelsetsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //LABELS
    if (array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray)) {
        $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray);
    } elseif (array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray)) {
        $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray);
    } else {
        $stoppoint = count($bigarray) - 1;
    }
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 2) {
            $labelsarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    //Question_attributes
    $stoppoint = count($bigarray);
    for ($i = 0; $i <= $stoppoint + 1; $i++) {
        if ($i < $stoppoint - 1) {
            $question_attributesarray[] = $bigarray[$i];
        }
        unset($bigarray[$i]);
    }
    $bigarray = array_values($bigarray);
    if (isset($questionarray)) {
        $questionfieldnames = convertCSVRowToArray($questionarray[0], ',', '"');
        unset($questionarray[0]);
        $countquestions = count($questionarray) - 1;
    } else {
        $countquestions = 0;
    }
    if (isset($answerarray)) {
        $answerfieldnames = convertCSVRowToArray($answerarray[0], ',', '"');
        unset($answerarray[0]);
        $countanswers = count($answerarray);
    } else {
        $countanswers = 0;
    }
    if (isset($labelsetsarray)) {
        $countlabelsets = count($labelsetsarray) - 1;
    } else {
        $countlabelsets = 0;
    }
    if (isset($labelsarray)) {
        $countlabels = count($labelsarray) - 1;
    } else {
        $countlabels = 0;
    }
    if (isset($question_attributesarray)) {
        $countquestion_attributes = count($question_attributesarray) - 1;
    } else {
        $countquestion_attributes = 0;
    }
    $aLanguagesSupported = array();
    // this array will keep all the languages supported for the survey
    $sBaseLanguage = GetBaseLanguageFromSurveyID($newsid);
    $aLanguagesSupported[] = $sBaseLanguage;
    // adds the base language to the list of supported languages
    $aLanguagesSupported = array_merge($aLanguagesSupported, GetAdditionalLanguagesFromSurveyID($newsid));
    // Let's check that imported objects support at least the survey's baselang
    if (isset($questionarray)) {
        $langfieldnum = array_search("language", $questionfieldnames);
        $qidfieldnum = array_search("qid", $questionfieldnames);
        $questionssupportbaselang = bDoesImportarraySupportsLanguage($questionarray, array($qidfieldnum), $langfieldnum, $sBaseLanguage, true);
        if (!$questionssupportbaselang) {
            $results['fatalerror'] = $clang->gT("You can't import a question which doesn't support at least the survey base language.");
            return $results;
        }
    }
    if ($countanswers > 0) {
        $langfieldnum = array_search("language", $answerfieldnames);
        $answercodefilednum1 = array_search("qid", $answerfieldnames);
        $answercodefilednum2 = array_search("code", $answerfieldnames);
        $answercodekeysarr = array($answercodefilednum1, $answercodefilednum2);
        $answerssupportbaselang = bDoesImportarraySupportsLanguage($answerarray, $answercodekeysarr, $langfieldnum, $sBaseLanguage);
        if (!$answerssupportbaselang) {
            $results['fatalerror'] = $clang->gT("You can't import answers which doesn't support at least the survey base language.");
            return $results;
        }
    }
    if ($countlabelsets > 0) {
        $labelsetfieldname = convertCSVRowToArray($labelsetsarray[0], ',', '"');
        $langfieldnum = array_search("languages", $labelsetfieldname);
        $lidfilednum = array_search("lid", $labelsetfieldname);
        $labelsetssupportbaselang = bDoesImportarraySupportsLanguage($labelsetsarray, array($lidfilednum), $langfieldnum, $sBaseLanguage, true);
        if (!$labelsetssupportbaselang) {
            $results['fatalerror'] = $clang->gT("You can't import label sets which don't support the current survey's base language");
            return $results;
        }
    }
    // I assume that if a labelset supports the survey's baselang,
    // then it's labels do support it as well
    //DO ANY LABELSETS FIRST, SO WE CAN KNOW WHAT THEIR NEW LID IS FOR THE QUESTIONS
    if (isset($labelsetsarray) && $labelsetsarray) {
        $csarray = buildLabelSetCheckSumArray();
        // build checksums over all existing labelsets
        $count = 0;
        foreach ($labelsetsarray as $lsa) {
            $fieldorders = convertCSVRowToArray($labelsetsarray[0], ',', '"');
            $fieldcontents = convertCSVRowToArray($lsa, ',', '"');
            if ($count == 0) {
                $count++;
                continue;
            }
            $results['labelsets']++;
            $labelsetrowdata = array_combine($fieldorders, $fieldcontents);
            // Save old labelid
            $oldlid = $labelsetrowdata['lid'];
            // set the new language
            unset($labelsetrowdata['lid']);
            $newvalues = array_values($labelsetrowdata);
            $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
            // quote everything accordingly
            $lsainsert = "INSERT INTO {$dbprefix}labelsets (" . implode(',', array_keys($labelsetrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
            //handle db prefix
            $lsiresult = $connect->Execute($lsainsert);
            // Get the new insert id for the labels inside this labelset
            $newlid = $connect->Insert_ID("{$dbprefix}labelsets", 'lid');
            if ($labelsarray) {
                $count = 0;
                foreach ($labelsarray as $la) {
                    $lfieldorders = convertCSVRowToArray($labelsarray[0], ',', '"');
                    $lfieldcontents = convertCSVRowToArray($la, ',', '"');
                    if ($count == 0) {
                        $count++;
                        continue;
                    }
                    // Combine into one array with keys and values since its easier to handle
                    $labelrowdata = array_combine($lfieldorders, $lfieldcontents);
                    $labellid = $labelrowdata['lid'];
                    if ($importversion <= 132) {
                        $labelrowdata["assessment_value"] = (int) $labelrowdata["code"];
                    }
                    if ($labellid == $oldlid) {
                        $labelrowdata['lid'] = $newlid;
                        // translate internal links
                        $labelrowdata['title'] = translink('label', $oldlid, $newlid, $labelrowdata['title']);
                        $newvalues = array_values($labelrowdata);
                        $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
                        // quote everything accordingly
                        $lainsert = "INSERT INTO {$dbprefix}labels (" . implode(',', array_keys($labelrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
                        //handle db prefix
                        $liresult = $connect->Execute($lainsert);
                        $results['labels']++;
                    }
                }
            }
            //CHECK FOR DUPLICATE LABELSETS
            $thisset = "";
            $query2 = "SELECT code, title, sortorder, language, assessment_value\n                       FROM {$dbprefix}labels\n                       WHERE lid=" . $newlid . "\n                       ORDER BY language, sortorder, code";
            $result2 = db_execute_num($query2) or safe_die("Died querying labelset {$lid}<br />{$query2}<br />" . $connect->ErrorMsg());
            while ($row2 = $result2->FetchRow()) {
                $thisset .= implode('.', $row2);
            }
            // while
            $newcs = dechex(crc32($thisset) * 1);
            unset($lsmatch);
            if (isset($csarray)) {
                foreach ($csarray as $key => $val) {
                    if ($val == $newcs) {
                        $lsmatch = $key;
                    }
                }
            }
            if (isset($lsmatch)) {
                //There is a matching labelset. So, we will delete this one and refer
                //to the matched one.
                $query = "DELETE FROM {$dbprefix}labels WHERE lid={$newlid}";
                $result = $connect->Execute($query) or safe_die("Couldn't delete labels<br />{$query}<br />" . $connect->ErrorMsg());
                $query = "DELETE FROM {$dbprefix}labelsets WHERE lid={$newlid}";
                $result = $connect->Execute($query) or safe_die("Couldn't delete labelset<br />{$query}<br />" . $connect->ErrorMsg());
                $newlid = $lsmatch;
            } else {
                //There isn't a matching labelset, add this checksum to the $csarray array
                $csarray[$newlid] = $newcs;
            }
            //END CHECK FOR DUPLICATES
            $aLIDReplacements[$oldlid] = $newlid;
        }
    }
    // Import questions
    if (isset($questionarray) && $questionarray) {
        //Assuming we will only import one question at a time we will now find out the maximum question order in this group
        //and save it for later
        $newquestionorder = $connect->GetOne("SELECT MAX(question_order) AS maxqo FROM " . db_table_name('questions') . " WHERE sid={$newsid} AND gid={$newgid}");
        if (is_null($newquestionorder)) {
            $newquestionorder = 0;
        } else {
            $newquestionorder++;
        }
        foreach ($questionarray as $qa) {
            $qacfieldcontents = convertCSVRowToArray($qa, ',', '"');
            $questionrowdata = array_combine($questionfieldnames, $qacfieldcontents);
            // Skip not supported languages
            if (!in_array($questionrowdata['language'], $aLanguagesSupported)) {
                continue;
            }
            // replace the sid
            $oldqid = $questionrowdata['qid'];
            $oldsid = $questionrowdata['sid'];
            $oldgid = $questionrowdata['gid'];
            // Remove qid field if there is no newqid; and set it to newqid if it's set
            if (!isset($newqid)) {
                unset($questionrowdata['qid']);
            } else {
                db_switchIDInsert('questions', true);
                $questionrowdata['qid'] = $newqid;
            }
            $questionrowdata["sid"] = $newsid;
            $questionrowdata["gid"] = $newgid;
            $questionrowdata["question_order"] = $newquestionorder;
            // Save the following values - will need them for proper conversion later                if ((int)$questionrowdata['lid']>0)
            if ((int) $questionrowdata['lid'] > 0) {
                $oldquestion['lid1'] = (int) $questionrowdata['lid'];
            }
            if ((int) $questionrowdata['lid1'] > 0) {
                $oldquestion['lid2'] = (int) $questionrowdata['lid1'];
            }
            $oldquestion['oldtype'] = $questionrowdata['type'];
            // Unset label set IDs and convert question types
            unset($questionrowdata['lid']);
            unset($questionrowdata['lid1']);
            if ($questionrowdata['type'] == 'W') {
                $questionrowdata['type'] = '!';
            } elseif ($questionrowdata['type'] == 'Z') {
                $questionrowdata['type'] = 'L';
            }
            $oldquestion['newtype'] = $questionrowdata['type'];
            $questionrowdata = array_map('convertCsvreturn2return', $questionrowdata);
            // translate internal links
            $questionrowdata['title'] = translink('survey', $oldsid, $newsid, $questionrowdata['title']);
            $questionrowdata['question'] = translink('survey', $oldsid, $newsid, $questionrowdata['question']);
            $questionrowdata['help'] = translink('survey', $oldsid, $newsid, $questionrowdata['help']);
            $newvalues = array_values($questionrowdata);
            $newvalues = array_map(array(&$connect, "qstr"), $newvalues);
            // quote everything accordingly
            $qinsert = "INSERT INTO {$dbprefix}questions (" . implode(',', array_keys($questionrowdata)) . ") VALUES (" . implode(',', $newvalues) . ")";
            $qres = $connect->Execute($qinsert) or safe_die("Error: Failed to insert question<br />\n{$qinsert}<br />\n" . $connect->ErrorMsg());
            // set the newqid only if is not set
            if (!isset($newqid)) {
                $newqid = $connect->Insert_ID("{$dbprefix}questions", "qid");
            } else {
                db_switchIDInsert('questions', false);
            }
        }
        $qtypes = getqtypelist("", "array");
        $results['answers'] = 0;
        $results['subquestions'] = 0;
        // Now we will fix up old label sets where they are used as answers
        if ((isset($oldquestion['lid1']) || isset($oldquestion['lid2'])) && ($qtypes[$oldquestion['newtype']]['answerscales'] > 0 || $qtypes[$oldquestion['newtype']]['subquestions'] > 1)) {
            $query = "select * from " . db_table_name('labels') . " where lid={$aLIDReplacements[$oldquestion['lid1']]} ";
            $oldlabelsresult = db_execute_assoc($query);
            while ($labelrow = $oldlabelsresult->FetchRow()) {
                if (in_array($labelrow['language'], $aLanguagesSupported)) {
                    if ($qtypes[$oldquestion['newtype']]['subquestions'] < 2) {
                        $qinsert = "insert INTO " . db_table_name('answers') . " (qid,code,answer,sortorder,language,assessment_value,scale_id)\n                                    VALUES ({$newqid}," . db_quoteall($labelrow['code']) . "," . db_quoteall($labelrow['title']) . "," . db_quoteall($labelrow['sortorder']) . "," . db_quoteall($labelrow['language']) . "," . db_quoteall($labelrow['assessment_value']) . ",0)";
                        $qres = $connect->Execute($qinsert) or safe_die("Error: Failed to insert answer <br />\n{$qinsert}<br />\n" . $connect->ErrorMsg());
                        $results['answers']++;
                    } else {
                        if (isset($aSQIDReplacements[$labelrow['code']])) {
                            $fieldname = 'qid,';
                            $data = $aSQIDReplacements[$labelrow['code']] . ',';
                            db_switchIDInsert('questions', true);
                        } else {
                            $fieldname = '';
                            $data = '';
                        }
                        $qinsert = "insert INTO " . db_table_name('questions') . " ({$fieldname} sid,gid,parent_qid,title,question,question_order,language,scale_id,type)\n                                    VALUES ({$data} {$newsid},{$newgid},{$newqid}," . db_quoteall($labelrow['code']) . "," . db_quoteall($labelrow['title']) . "," . db_quoteall($labelrow['sortorder']) . "," . db_quoteall($labelrow['language']) . ",1," . db_quoteall($oldquestion['newtype']) . ")";
                        $qres = $connect->Execute($qinsert) or safe_die("Error: Failed to insert subquestion <br />\n{$qinsert}<br />\n" . $connect->ErrorMsg());
                        if ($fieldname == '') {
                            $aSQIDReplacements[$labelrow['code']] = $connect->Insert_ID("{$dbprefix}questions", "qid");
                        } else {
                            db_switchIDInsert('questions', false);
                        }
                    }
                }
            }
            if (isset($oldquestion['lid2']) && $qtypes[$oldquestion['newtype']]['answerscales'] > 1) {
                $query = "select * from " . db_table_name('labels') . " where lid={$aLIDReplacements[$oldquestion['lid2']]}";
                $oldlabelsresult = db_execute_assoc($query);
                while ($labelrow = $oldlabelsresult->FetchRow()) {
                    if (in_array($labelrow['language'], $aLanguagesSupported)) {
                        $qinsert = "insert INTO " . db_table_name('answers') . " (qid,code,answer,sortorder,language,assessment_value,scale_id)\n                                    VALUES ({$newqid}," . db_quoteall($labelrow['code']) . "," . db_quoteall($labelrow['title']) . "," . db_quoteall($labelrow['sortorder']) . "," . db_quoteall($labelrow['language']) . "," . db_quoteall($labelrow['assessment_value']) . ",1)";
                        $qres = $connect->Execute($qinsert) or safe_die($clang->gT("Error") . ": Failed to insert answer <br />\n{$qinsert}<br />\n" . $connect->ErrorMsg());
                    }
                }
            }
        }
        //Do answers
        if (isset($answerarray) && $answerarray) {
            foreach ($answerarray as $aa) {
                $answerfieldcontents = convertCSVRowToArray($aa, ',', '"');
                $answerrowdata = array_combine($answerfieldnames, $answerfieldcontents);
                if ($answerrowdata === false) {
                    $importquestion .= '<br />' . $clang->gT("Faulty line in import - fields and data don't match") . ":" . implode(',', $answerfieldcontents);
                }
                // Skip not supported languages
                if (!in_array($answerrowdata['language'], $aLanguagesSupported)) {
                    continue;
                }
                $code = $answerrowdata["code"];
                $thisqid = $answerrowdata["qid"];
                $answerrowdata["qid"] = $newqid;
                if ($importversion <= 132) {
                    $answerrowdata["assessment_value"] = (int) $answerrowdata["code"];
                }
                // Convert default values for single select questions
                if ($answerrowdata['default_value'] == 'Y' && ($oldquestion['newtype'] == 'L' || $oldquestion['newtype'] == 'O' || $oldquestion['newtype'] == '!')) {
                    $insertdata = array();
                    $insertdata['qid'] = $newqid;
                    $insertdata['language'] = $answerrowdata['language'];
                    $insertdata['defaultvalue'] = $answerrowdata['answer'];
                    $query = $connect->GetInsertSQL($dbprefix . 'defaultvalues', $insertdata);
                    $qres = $connect->Execute($query) or safe_die("Error: Failed to insert defaultvalue <br />{$query}<br />\n" . $connect->ErrorMsg());
                }
                // translate internal links
                $answerrowdata['answer'] = translink('survey', $oldsid, $newsid, $answerrowdata['answer']);
                // Everything set - now insert it
                $answerrowdata = array_map('convertCsvreturn2return', $answerrowdata);
                if ($qtypes[$oldquestion['newtype']]['subquestions'] > 0) {
                    $questionrowdata = array();
                    if (isset($aSQIDReplacements[$answerrowdata['code'] . $answerrowdata['qid']])) {
                        $questionrowdata['qid'] = $aSQIDReplacements[$answerrowdata['code'] . $answerrowdata['qid']];
                        db_switchIDInsert('questions', true);
                    }
                    $questionrowdata['parent_qid'] = $answerrowdata['qid'];
                    $questionrowdata['sid'] = $newsid;
                    $questionrowdata['gid'] = $newgid;
                    $questionrowdata['title'] = $answerrowdata['code'];
                    $questionrowdata['question'] = $answerrowdata['answer'];
                    $questionrowdata['question_order'] = $answerrowdata['sortorder'];
                    $questionrowdata['language'] = $answerrowdata['language'];
                    $questionrowdata['type'] = $oldquestion['newtype'];
                    $tablename = $dbprefix . 'questions';
                    $query = $connect->GetInsertSQL($tablename, $questionrowdata);
                    $qres = $connect->Execute($query) or safe_die("Error: Failed to insert question <br />{$query}<br />\n" . $connect->ErrorMsg());
                    if (!isset($questionrowdata['qid'])) {
                        $aSQIDReplacements[$answerrowdata['code'] . $answerrowdata['qid']] = $connect->Insert_ID("{$dbprefix}questions", "qid");
                    } else {
                        db_switchIDInsert('questions', false);
                    }
                    $results['subquestions']++;
                    // also convert default values subquestions for multiple choice
                    if ($answerrowdata['default_value'] == 'Y' && ($oldquestion['newtype'] == 'M' || $oldquestion['newtype'] == 'P')) {
                        $insertdata = array();
                        $insertdata['qid'] = $newqid;
                        $insertdata['sqid'] = $aSQIDReplacements[$answerrowdata['code']];
                        $insertdata['language'] = $answerrowdata['language'];
                        $insertdata['defaultvalue'] = 'Y';
                        $tablename = $dbprefix . 'defaultvalues';
                        $query = $connect->GetInsertSQL($tablename, $insertdata);
                        $qres = $connect->Execute($query) or safe_die("Error: Failed to insert defaultvalue <br />{$query}<br />\n" . $connect->ErrorMsg());
                    }
                } else {
                    unset($answerrowdata['default_value']);
                    $tablename = $dbprefix . 'answers';
                    $query = $connect->GetInsertSQL($tablename, $answerrowdata);
                    $ares = $connect->Execute($query) or safe_die("Error: Failed to insert answer<br />{$query}<br />\n" . $connect->ErrorMsg());
                    $results['answers']++;
                }
            }
        }
        $results['question_attributes'] = 0;
        // Finally the question attributes - it is called just once and only if there was a question
        if (isset($question_attributesarray) && $question_attributesarray) {
            //ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUES
            $fieldorders = convertCSVRowToArray($question_attributesarray[0], ',', '"');
            unset($question_attributesarray[0]);
            foreach ($question_attributesarray as $qar) {
                $fieldcontents = convertCSVRowToArray($qar, ',', '"');
                $qarowdata = array_combine($fieldorders, $fieldcontents);
                $qarowdata["qid"] = $newqid;
                unset($qarowdata["qaid"]);
                $tablename = "{$dbprefix}question_attributes";
                $qainsert = $connect->GetInsertSQL($tablename, $qarowdata);
                $result = $connect->Execute($qainsert) or safe_die("Couldn't insert question_attribute<br />{$qainsert}<br />" . $connect->ErrorMsg());
                $results['question_attributes']++;
            }
        }
    }
    LimeExpressionManager::SetDirtyFlag();
    // so refreshes syntax highlighting
    $results['newqid'] = $newqid;
    $results['questions'] = 1;
    $results['newqid'] = $newqid;
    return $results;
}
示例#12
0
     $ignoredcolumns = array();
     //now check the first line for invalid fields
     foreach ($firstline as $index => $fieldname) {
         $firstline[$index] = preg_replace("/(.*) <[^,]*>\$/", "\$1", $fieldname);
         $fieldname = $firstline[$index];
         if (!in_array($fieldname, $allowedfieldnames)) {
             $ignoredcolumns[] = $fieldname;
         }
     }
     if (!in_array('firstname', $firstline) || !in_array('lastname', $firstline) || !in_array('email', $firstline)) {
         $tokenoutput .= "<div class='warningheader'>" . $clang->gT("Error: Your uploaded file is missing one or more of the mandatory columns: 'firstname', 'lastname' or 'email'") . "</div><br />";
         $recordcount = count($tokenlistarray);
         break;
     }
 } else {
     $line = convertCSVRowToArray($buffer, ',', '"');
     if (count($firstline) != count($line)) {
         $invalidformatlist[] = $recordcount;
         $recordcount++;
         continue;
     }
     $writearray = array_combine($firstline, $line);
     //kick out ignored columns
     foreach ($ignoredcolumns as $column) {
         unset($writearray[$column]);
     }
     $dupfound = false;
     $invalidemail = false;
     if ($filterduplicatetoken != false) {
         if (!isset($_POST['filterduplicatefields']) || isset($_POST['filterduplicatefields']) && count($_POST['filterduplicatefields']) == 0) {
             $filterduplicatefields = array('firstname', 'lastname', 'email');