Example #1
0
 private function _handleFileUpload($surveyid, $aData)
 {
     $vvoutput = '';
     $donotimport = array();
     $clang = $this->getController()->lang;
     $filePath = $this->_moveUploadedFile($aData);
     $aFileContents = $this->_readFile($filePath);
     unlink($filePath);
     //delete the uploaded file
     unset($aFileContents[0]);
     //delete the first line
     Survey_dynamic::sid($surveyid);
     $survey = new Survey_dynamic();
     list($aFieldnames, $nbOfFields) = $this->_getFieldInfo($aFileContents);
     $aRealFieldNames = Yii::app()->db->getSchema()->getTable($survey->tableName())->getColumnNames();
     if (Yii::app()->request->getPost('noid') == "noid") {
         unset($aRealFieldNames[0]);
     }
     if (Yii::app()->request->getPost('finalized') == "notfinalized") {
         unset($aRealFieldNames[1]);
     }
     unset($aFileContents[1]);
     //delete the second line
     //See if any fields in the import file don't exist in the active survey
     $missing = array_diff($aFieldnames, $aRealFieldNames);
     if (is_array($missing) && count($missing) > 0) {
         foreach ($missing as $key => $val) {
             $donotimport[] = $key;
             unset($aFieldnames[$key]);
         }
     }
     if (Yii::app()->request->getPost('finalized') == "notfinalized") {
         $donotimport[] = 1;
         unset($aFieldnames[1]);
     }
     $importcount = 0;
     $recordcount = 0;
     $aFieldnames = array_map('dbQuoteID', $aFieldnames);
     // Find out which fields are datefields, these have to be null if the imported string is empty
     $fieldmap = createFieldMap($surveyid, 'full', false, false, getBaseLanguageFromSurveyID($surveyid));
     $datefields = array();
     $numericfields = array();
     foreach ($fieldmap as $field) {
         if ($field['type'] == 'D') {
             $datefields[] = $field['fieldname'];
         }
         if ($field['type'] == 'N' || $field['type'] == 'K') {
             $numericfields[] = $field['fieldname'];
         }
     }
     foreach ($aFileContents as $row) {
         if (trim($row) != "") {
             $recordcount++;
             $fieldvalues = $this->_prepFieldValues($aFieldnames, $row, $nbOfFields, $donotimport);
             $fielddata = $aFieldnames === array() && $fieldvalues === array() ? array() : array_combine($aFieldnames, $fieldvalues);
             foreach ($datefields as $datefield) {
                 if (@$fielddata["'" . $datefield . "'"] == '') {
                     unset($fielddata["'" . $datefield . "'"]);
                 }
             }
             foreach ($numericfields as $numericfield) {
                 if ($fielddata["`" . $numericfield . "`"] == '') {
                     unset($fielddata["`" . $numericfield . "`"]);
                 }
             }
             if (isset($fielddata['`submitdate`']) && $fielddata['`submitdate`'] == 'NULL') {
                 unset($fielddata['`submitdate`']);
             }
             if ($fielddata['`lastpage`'] == '') {
                 $fielddata['`lastpage`'] = '0';
             }
             $recordexists = false;
             if (isset($fielddata['`id`'])) {
                 $result = $survey->findAllByAttributes(array('id' => $fielddata['`id`']));
                 $recordexists = $result > 0;
                 // Check if record with same id exists
                 if ($recordexists) {
                     if (Yii::app()->request->getPost('insert') == "ignore") {
                         $aData['msgs'][] .= sprintf($clang->gT("Record ID %s was skipped because of duplicate ID."), $fielddata['`id`']);
                         continue;
                     }
                     if (Yii::app()->request->getPost('insert') == "replace") {
                         $result = $survey->deleteSomeRecords(array('id' => $fielddata['`id`']));
                         $recordexists = false;
                     }
                 }
             }
             if (Yii::app()->request->getPost('insert') == "renumber") {
                 unset($fielddata['`id`']);
             }
             if (isset($fielddata['`id`'])) {
                 switchMSSQLIdentityInsert("survey_{$surveyid}", true);
             }
             $result = $survey->insertRecords($fielddata);
             if (isset($fielddata['id'])) {
                 switchMSSQLIdentityInsert("survey_{$surveyid}", false);
             }
             if (!$result) {
                 $aData['error_msg'] = sprintf($clang->gT("Import failed on record %d"), $recordcount);
                 $this->_renderWrappedTemplate('dataentry', 'warning_header', $aData);
                 die;
             } else {
                 $importcount++;
             }
             $aData['importcount'] = $importcount;
         }
     }
     $aData['noid'] = Yii::app()->request->getPost('noid');
     $aData['insertstyle'] = Yii::app()->request->getPost('insertstyle');
     $this->_renderWrappedTemplate('dataentry', 'vvimport_upload', $aData);
 }