".$clang->gT("Import Label Set")."\n"; $sFullFilepath = $tempdir . DIRECTORY_SEPARATOR . $_FILES['the_file']['name']; $aPathInfo = pathinfo($sFullFilepath); $sExtension = $aPathInfo['extension']; if (!@move_uploaded_file($_FILES['the_file']['tmp_name'], $sFullFilepath)) { $importlabeloutput .= "".$clang->gT("Error")."
\n"; $importlabeloutput .= sprintf ($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$tempdir)."

\n"; $importlabeloutput .= "

\n"; return; } $importlabeloutput .= "
".$clang->gT("Success")."

\n"; $importlabeloutput .= $clang->gT("File upload succeeded.")."

\n"; $importlabeloutput .= $clang->gT("Reading file..")."

\n"; $options['checkforduplicates']='off'; if (isset($_POST['checkforduplicates'])) { $options['checkforduplicates']=$_POST['checkforduplicates']; } if (strtolower($sExtension)=='csv') { $aImportResults=CSVImportLabelset($sFullFilepath, $options); } elseif (strtolower($sExtension)=='lsl') { $aImportResults=XMLImportLabelsets($sFullFilepath, $options); } else { $importlabeloutput .= "
\n
".$clang->gT("Error")."

\n"; $importlabeloutput .= "".$clang->gT("Label set import summary")."
\n"; $importlabeloutput .= $clang->gT("Uploaded label set file needs to have an .lsl extension.")."

\n"; $importlabeloutput .= "\n"; $importlabeloutput .= "

\n"; } unlink($sFullFilepath); if (isset($aImportResults)) { if (isset($aImportResults['fatalerror'])) { $importlabeloutput .= "
\n
".$clang->gT("Error")."

{$aImportResults['fatalerror']}
"; } else { if (count($aImportResults['warnings'])>0) { $importlabeloutput .= "
\n

".$clang->gT("Warnings")."
\n"; } $importlabeloutput .= "
\n
".$clang->gT("Success")."

\n"; $importlabeloutput .= "".$clang->gT("Label set import summary")."
\n"; $importlabeloutput .= "\n"; $importlabeloutput .= "

".$clang->gT("Import of label set(s) is completed.")."

\n"; } $importlabeloutput .= "\n"; $importlabeloutput .= "


\n"; } // IF WE GOT THIS FAR, THEN THE FILE HAS BEEN UPLOADED SUCCESFULLY 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++) //skipping the first lines that are not needed { 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 FROM ".db_table_name('labels')." WHERE lid=".$newlid." ORDER BY language, sortorder, code"; $result2 = db_execute_num($query2) or safe_die("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) && $options['checkforduplicates']=='on') { foreach($csarray as $key=>$val) { // echo $val."-".$newcs."
"; 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
$query
".$connect->ErrorMsg()); $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; $result=$connect->Execute($query) or safe_die("Couldn't delete labelset
$query
".$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 XMLImportLabelsets($sFullFilepath, $options) { global $connect, $dbprefix, $clang; $xml = simplexml_load_file($sFullFilepath); if ($xml->LimeSurveyDocType!='Label set') safe_die('This is not a valid LimeSurvey label set structure XML file.'); $dbversion = (float) $xml->DBVersion; $csarray=buildLabelSetCheckSumArray(); $aLSIDReplacements=array(); $results['labelsets']=0; $results['labels']=0; $results['warnings']=array(); // Import labels table =================================================================================== $tablename=$dbprefix.'labelsets'; foreach ($xml->labelsets->rows->row as $row) { $insertdata=array(); foreach ($row as $key=>$value) { $insertdata[(string)$key]=(string)$value; } $oldlsid=$insertdata['lid']; unset($insertdata['lid']); // save the old qid // Insert the new question $query=$connect->GetInsertSQL($tablename,$insertdata); $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
{$query}
\n".$connect->ErrorMsg()); $results['labelsets']++; $newlsid=$connect->Insert_ID($tablename,"lid"); // save this for later $aLSIDReplacements[$oldlsid]=$newlsid; // add old and new lsid to the mapping array } // Import labels table =================================================================================== $tablename=$dbprefix.'labels'; if (isset($xml->labels->rows->row)) foreach ($xml->labels->rows->row as $row) { $insertdata=array(); foreach ($row as $key=>$value) { $insertdata[(string)$key]=(string)$value; } $insertdata['lid']=$aLSIDReplacements[$insertdata['lid']]; $query=$connect->GetInsertSQL($tablename,$insertdata); $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
{$query}
\n".$connect->ErrorMsg()); $results['labels']++; } //CHECK FOR DUPLICATE LABELSETS if (isset($_POST['checkforduplicates'])) { foreach (array_values($aLSIDReplacements) as $newlid) { $thisset=""; $query2 = "SELECT code, title, sortorder, language, assessment_value FROM ".db_table_name('labels')." WHERE lid=".$newlid." ORDER BY language, sortorder, code"; $result2 = db_execute_num($query2) or safe_die("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) && $options['checkforduplicates']=='on') { 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
$query
".$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
$query
".$connect->ErrorMsg()); $results['labelsets']--; $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; } // Closing PHP tag intentionall left out