コード例 #1
0
ファイル: dataentry.php プロジェクト: CrandellWS/LimeSurvey
 /**
  * dataentry::import()
  * Function responsible to import responses from old survey table(s).
  * @param int $iSurveyId
  * @return void
  */
 public function import($surveyid)
 {
     $iSurveyId = sanitize_int($surveyid);
     if (Permission::model()->hasSurveyPermission($iSurveyId, 'responses', 'create')) {
         if (!App()->getRequest()->isPostRequest || App()->getRequest()->getPost('table') == 'none') {
             // Schema that serves as the base for compatibility checks.
             $baseSchema = SurveyDynamic::model($iSurveyId)->getTableSchema();
             $tables = App()->getApi()->getOldResponseTables($iSurveyId);
             $compatible = array();
             $coercible = array();
             foreach ($tables as $table) {
                 $schema = PluginDynamic::model($table)->getTableSchema();
                 if (PluginDynamic::model($table)->count() > 0) {
                     if ($this->isCompatible($baseSchema, $schema)) {
                         $compatible[] = $table;
                     } elseif ($this->isCompatible($baseSchema, $schema, false)) {
                         $coercible[] = $table;
                     }
                 }
             }
             $aData = array();
             $aData['surveyid'] = $iSurveyId;
             $aData['settings']['table'] = array('label' => gT('Source table'), 'type' => 'select', 'options' => array(gT('Compatible') => $this->tableList($compatible), gT('Compatible with type coercion') => $this->tableList($coercible)));
             $aData['settings']['timings'] = array('type' => 'checkbox', 'label' => gT('Import timings (if exist)'));
             //Get the menubar
             $aData['display']['menu_bars']['browse'] = gT("Quick statistics");
             $surveyinfo = Survey::model()->findByPk($iSurveyId)->surveyinfo;
             $aData["surveyinfo"] = $surveyinfo;
             $aData['title_bar']['title'] = gT('Browse responses') . ': ' . $surveyinfo['surveyls_title'];
             $aData['sidemenu']['state'] = false;
             $aData['menu']['edition'] = true;
             $aData['menu']['import'] = true;
             $aData['menu']['close'] = true;
             $this->_renderWrappedTemplate('dataentry', 'import', $aData);
         } else {
             $aSRIDConversions = array();
             $targetSchema = SurveyDynamic::model($iSurveyId)->getTableSchema();
             $sourceTable = PluginDynamic::model($_POST['table']);
             $sourceSchema = $sourceTable->getTableSchema();
             $fieldMap = array();
             $pattern = '/([\\d]+)X([\\d]+)X([\\d]+.*)/';
             foreach ($sourceSchema->getColumnNames() as $name) {
                 // Skip id field.
                 if ($name == 'id') {
                     continue;
                 }
                 $sourceColumn = $sourceSchema->getColumn($name);
                 $matches = array();
                 // Exact match.
                 if ($targetSchema->getColumn($name)) {
                     $fieldMap[$name] = $name;
                 } elseif (preg_match($pattern, $name, $matches)) {
                     $qid = $matches[3];
                     $targetColumn = $this->getQidColumn($targetSchema, $qid);
                     if (isset($targetColumn)) {
                         $fieldMap[$name] = $targetColumn->name;
                     }
                 }
             }
             $imported = 0;
             $sourceResponses = new CDataProviderIterator(new CActiveDataProvider($sourceTable), 500);
             foreach ($sourceResponses as $sourceResponse) {
                 $iOldID = $sourceResponse->id;
                 // Using plugindynamic model because I dont trust surveydynamic.
                 $targetResponse = new PluginDynamic("{{survey_{$iSurveyId}}}");
                 foreach ($fieldMap as $sourceField => $targetField) {
                     $targetResponse[$targetField] = $sourceResponse[$sourceField];
                 }
                 $imported++;
                 $targetResponse->save();
                 $aSRIDConversions[$iOldID] = $targetResponse->id;
                 unset($targetResponse);
             }
             Yii::app()->session['flashmessage'] = sprintf(gT("%s old response(s) were successfully imported."), $imported);
             $sOldTimingsTable = substr(substr($sourceTable->tableName(), 0, strrpos($sourceTable->tableName(), '_')) . '_timings' . substr($sourceTable->tableName(), strrpos($sourceTable->tableName(), '_')), strlen(Yii::app()->db->tablePrefix));
             $sNewTimingsTable = "survey_{$surveyid}_timings";
             if (isset($_POST['timings']) && $_POST['timings'] == 1 && tableExists($sOldTimingsTable) && tableExists($sNewTimingsTable)) {
                 // Import timings
                 $arDestination = SurveyTimingDynamic::model($surveyid);
                 $aFieldsOldTimingTable = array_values(Yii::app()->db->schema->getTable('{{' . $sOldTimingsTable . '}}')->columnNames);
                 $aFieldsNewTimingTable = array_values(Yii::app()->db->schema->getTable('{{' . $sNewTimingsTable . '}}')->columnNames);
                 $aValidTimingFields = array_intersect($aFieldsOldTimingTable, $aFieldsNewTimingTable);
                 $sQueryOldValues = "SELECT " . implode(", ", $aValidTimingFields) . " FROM {{{$sOldTimingsTable}}} ";
                 $aQueryOldValues = Yii::app()->db->createCommand($sQueryOldValues)->query()->readAll();
                 //Checked
                 $iRecordCountT = 0;
                 foreach ($aQueryOldValues as $sRecord) {
                     if (isset($aSRIDConversions[$sRecord['id']])) {
                         $sRecord['id'] = $aSRIDConversions[$sRecord['id']];
                     } else {
                         continue;
                     }
                     Yii::app()->db->createCommand()->insert("{{{$sNewTimingsTable}}}", $sRecord);
                     $iRecordCountT++;
                 }
                 Yii::app()->session['flashmessage'] = sprintf(gT("%s old response(s) and according timings were successfully imported."), $imported, $iRecordCountT);
             }
             $this->getController()->redirect(array("/admin/responses/sa/index/", 'surveyid' => $surveyid));
         }
     }
 }
コード例 #2
0
ファイル: dataentry.php プロジェクト: rouben/LimeSurvey
 /**
  * dataentry::import()
  * Function responsible to import responses from old survey table(s).
  * @param int $iSurveyId
  * @return void
  */
 public function import($surveyid)
 {
     $iSurveyId = sanitize_int($surveyid);
     if (Permission::model()->hasSurveyPermission($iSurveyId, 'responses', 'create')) {
         if (!App()->getRequest()->isPostRequest || App()->getRequest()->getPost('table') == 'none') {
             // Schema that serves as the base for compatibility checks.
             $baseSchema = SurveyDynamic::model($iSurveyId)->getTableSchema();
             $tables = App()->getApi()->getOldResponseTables($iSurveyId);
             $compatible = array();
             $coercible = array();
             foreach ($tables as $table) {
                 $schema = PluginDynamic::model($table)->getTableSchema();
                 if (PluginDynamic::model($table)->count() > 0) {
                     if ($this->isCompatible($baseSchema, $schema)) {
                         $compatible[] = $table;
                     } elseif ($this->isCompatible($baseSchema, $schema, false)) {
                         $coercible[] = $table;
                     }
                 }
             }
             $aData = array();
             $aData['surveyid'] = $iSurveyId;
             $aData['settings']['table'] = array('label' => gT('Source table'), 'type' => 'select', 'options' => array(gT('Compatible') => $this->tableList($compatible), gT('Compatible with type coercion') => $this->tableList($coercible)));
             $aData['settings']['timings'] = array('type' => 'checkbox', 'label' => gT('Import timings (if exist)'));
             //Get the menubar
             $aData['display']['menu_bars']['browse'] = gT("Quick statistics");
             $this->_renderWrappedTemplate('dataentry', 'import', $aData);
         } else {
             $targetSchema = SurveyDynamic::model($iSurveyId)->getTableSchema();
             $sourceTable = PluginDynamic::model($_POST['table']);
             $sourceSchema = $sourceTable->getTableSchema();
             $fieldMap = array();
             $pattern = '/([\\d]+)X([\\d]+)X([\\d]+.*)/';
             foreach ($sourceSchema->getColumnNames() as $name) {
                 // Skip id field.
                 if ($name == 'id') {
                     continue;
                 }
                 $sourceColumn = $sourceSchema->getColumn($name);
                 $matches = array();
                 // Exact match.
                 if ($targetSchema->getColumn($name)) {
                     $fieldMap[$name] = $name;
                 } elseif (preg_match($pattern, $name, $matches)) {
                     $qid = $matches[3];
                     $targetColumn = $this->getQidColumn($targetSchema, $qid);
                     if (isset($targetColumn)) {
                         $fieldMap[$name] = $targetColumn->name;
                     }
                 }
             }
             $imported = 0;
             $sourceResponses = new CDataProviderIterator(new CActiveDataProvider($sourceTable), 500);
             foreach ($sourceResponses as $sourceResponse) {
                 // Using plugindynamic model because I dont trust surveydynamic.
                 $targetResponse = new PluginDynamic("{{survey_{$iSurveyId}}}");
                 foreach ($fieldMap as $sourceField => $targetField) {
                     $targetResponse[$targetField] = $sourceResponse[$sourceField];
                 }
                 $imported++;
                 $targetResponse->save();
                 unset($targetResponse);
             }
             Yii::app()->session['flashmessage'] = sprintf(gT("%s old response(s) were successfully imported."), $imported);
             $sOldTimingsTable = substr($sourceTable->tableName(), 0, strrpos($sourceTable->tableName(), '_')) . '_timings' . substr($sourceTable->tableName(), strrpos($sourceTable->tableName(), '_'));
             $sNewTimingsTable = "survey_{$surveyid}_timings";
             if (isset($_POST['timings']) && $_POST['timings'] == 1 && tableExists($sOldTimingsTable) && tableExists($sNewTimingsTable)) {
                 // Import timings
                 $aFieldsOldTimingTable = array_values($schema->getTable($sOldTimingsTable)->columnNames);
                 $aFieldsNewTimingTable = array_values($schema->getTable($sNewTimingsTable)->columnNames);
                 $aValidTimingFields = array_intersect($aFieldsOldTimingTable, $aFieldsNewTimingTable);
                 $queryOldValues = "SELECT " . implode(", ", $aValidTimingFields) . " FROM {$sOldTimingsTable} ";
                 $resultOldValues = dbExecuteAssoc($queryOldValues) or show_error("Error:<br />{$queryOldValues}<br />");
                 $iRecordCountT = 0;
                 $aSRIDConversions = array();
                 foreach ($resultOldValues->readAll() as $sTable) {
                     if (isset($aSRIDConversions[$sTable['id']])) {
                         $sTable['id'] = $aSRIDConversions[$sTable['id']];
                     } else {
                         continue;
                     }
                     //$sInsertSQL=Yii::app()->db->GetInsertSQL($sNewTimingsTable,$row);
                     $sInsertSQL = "INSERT into {$sNewTimingsTable} (" . implode(",", array_map("dbQuoteID", array_keys($sTable))) . ") VALUES (" . implode(",", array_map("dbQuoteAll", array_values($sTable))) . ")";
                     $aTables = dbExecuteAssoc($sInsertSQL) or show_error("Error:<br />{$sInsertSQL}<br />");
                     $iRecordCountT++;
                 }
                 Yii::app()->session['flashmessage'] = sprintf(gT("%s old response(s) and according timings were successfully imported."), $imported, $iRecordCountT);
             }
             $this->getController()->redirect(array("/admin/responses/sa/index/", 'surveyid' => $surveyid));
         }
     }
 }