public function actionExport($importModel) { /** @var ImportModel $model */ $model = new ImportModel(); $model->unserialize($importModel); if ($model->validate()) { /** @var Export $exportStatus */ $exportStatus = Export::find()->where(['user_id' => $model->getUser(), 'object_id' => $model->object])->one(); $exportStatus->status = Export::STATUS_PROCESS; $exportStatus->save(); try { $object = Object::findById($model->object); if ($object === null) { throw new Exception('Object not found'); } $filename = $model->getFilename('Export'); $import = \app\modules\data\components\Import::createInstance(['object' => $object, 'filename' => $filename, 'type' => $model->type]); $import->processExport($model->fields, $model->conditions); $exportStatus->filename = $filename; $exportStatus->status = Export::STATUS_COMPLETE; $exportStatus->save(); } catch (\Exception $e) { $exportStatus->status = Export::STATUS_FAILED; $exportStatus->save(); echo $e->getMessage(); throw $e; } } else { echo 'Model is not valid'; throw new Exception('Model is not valid'); } }
/** * Unified action for import and export * @param $id * @param $importMode * @return string|\yii\web\Response * @throws ErrorException */ private function unifiedAction($id, $importMode) { $object = Object::findById($id); /* @var $className \app\modules\data\models\Import */ $className = $importMode ? 'app\\modules\\data\\models\\Import' : 'app\\modules\\data\\models\\Export'; if ($object !== null) { $model = new ImportModel(['object' => $id]); $fields = \app\modules\data\components\Import::getFields($model->object); if (\Yii::$app->request->isPost) { if ($model->load(\Yii::$app->request->post()) && $model->validate()) { $import = $className::find()->where(['user_id' => Yii::$app->user->id, 'object_id' => $id])->one(); if ($import === null) { $import = new $className(['user_id' => Yii::$app->user->id, 'object_id' => $id]); } $import->filename = null; if ($importMode === true) { $file = UploadedFile::getInstance($model, 'file'); $model->type = $file->extension; $filename = $model->getFilename('Import'); $import->filename = $filename; $fullFilename = Yii::$app->getModule('data')->importDir . '/' . $filename; if ($file->saveAs($fullFilename) === false) { throw new ErrorException("Unable to save file"); } } $import->status = $className::STATUS_PROCESS; $task_options = Yii::$app->request->post('Task', []); if ($import->save()) { BackgroundTasks::addTask(['name' => $importMode ? 'import' : 'export', 'description' => ($importMode ? 'import' : 'export') . " {$model->object}", 'action' => 'data/file/' . ($importMode ? 'import' : 'export'), 'params' => $model->serialize(), 'init_event' => $importMode ? 'import' : 'export'], ['create_notification' => isset($task_options['create_notification']) && 1 == $task_options['create_notification'] ? true : false]); \Yii::$app->session->setFlash('info', \Yii::t('app', 'Task is queued. Come back later.')); } else { \Yii::$app->session->setFlash('error', \Yii::t('app', 'Import Error')); } return $this->redirect(['/data/file']); } } $availablePropertyGroups = []; /** @var \app\modules\shop\models\Product $exampleModel - product for example */ $exampleModel = new $object->object_class(); if ($exampleModel->hasMethod('getPropertyGroups')) { $availablePropertyGroups = $exampleModel->getPropertyGroups(false, true); } \Yii::$app->session->setFlash('info', \Yii::t('app', 'Specify fields to import and select the file')); $fields['additionalFields'] = []; if ($exampleModel instanceof ExportableInterface) { $fields['additionalFields'] = $exampleModel::exportableAdditionalFields(); } if ($model->type === null) { $model->type = Yii::$app->modules['data']->defaultType; } return $this->render('import-export', ['model' => $model, 'object' => $object, 'fields' => $fields, 'availablePropertyGroups' => $availablePropertyGroups, 'importMode' => $importMode]); } else { \Yii::$app->session->setFlash('error', \Yii::t('app', 'Object not found')); return $this->redirect(['/data/file']); } }