elfuvo / yii2-import-wizard
逐步从Excel文件导入,具有模型属性映射
0.3.1
2021-11-26 07:58 UTC
Requires
- php: >=7.1.0
- phpoffice/phpspreadsheet: ~1.2
- yiisoft/yii2: ~2.0.12
- yiisoft/yii2-queue: ~2.3
Requires (Dev)
README
目录
要求
- PHP >=7.1
安装
安装此扩展的首选方式是通过composer。
运行以下命令之一:
php composer.phar require --prefer-dist elfuvo/yii2-import-wizard "~0.2.0"
或者
"elfuvo/yii2-import-wizard": "~0.2.0"
将以下内容添加到您的composer.json
文件的"require"部分。
配置
配置导入服务、导入结果维护器和可用的导入适配器。
// in common app config [ 'container'=>[ 'definitions' => [ \elfuvo\import\services\ImportServiceInterface::class => [ 'class' => \elfuvo\import\services\ImportService::class, 'casters' => [ // there is a custom value casters // \elfuvo\import\services\BracketValueCaster::class, ] ], \elfuvo\import\result\ResultImportInterface::class => \elfuvo\import\result\FileContinuesResultImport::class, \elfuvo\import\adapter\AdapterFabricInterface::class => [ 'class' => \elfuvo\import\adapter\AdapterFabricDefault::class, 'adapters' => [ \elfuvo\import\adapter\AdapterImportExcel::class, \elfuvo\import\adapter\AdapterImportCsv::class, ] ], ], ], ];
I18n
将翻译添加到i18n yii组件
[ 'components' => [ 'i18n' => [ 'class' => \yii\i18n\I18N::class, 'translations' => [ 'import-wizard' => [ 'class' => \yii\i18n\PhpMessageSource::class, 'sourceLanguage' => 'en', 'basePath' => '@vendor/elfuvo/yii2-import/src/messages', ], ], ] ] ];
动作
将导入步骤动作添加到您的控制器
class DefaultController extend \yii\web\Controller{ public function actions() { return [ 'upload-file-import' => [ // action with form for uploading import file 'class' => \elfuvo\import\actions\UploadFileAction::class, ... ], 'setup-import' => [ // action with import configuration form 'class' => \elfuvo\import\actions\SetupAction::class, ... ], 'progress' => [ // action for showing current import progress/statistic and errors after import is done 'class' => \elfuvo\import\actions\ProgressAction::class, ], ]; } }
上传导入文件动作
public function actions() { return [ 'upload-file-import' => [ 'class' => \elfuvo\import\actions\UploadFileAction::class, 'model' => new Review(), // model instance for import 'nextAction' => 'setup-import', // next action name 'progressAction' => 'progress', // name of progress action ], ... ]; }
上传带有预定义属性映射的导入文件动作
如果您使用属性映射,则不需要配置设置动作。文件上传后立即开始导入。
public function actions() { return [ 'upload-file-import-map' => [ 'class' => UploadFileAction::class, // model instance with pre-defined attribute values. It will be cloned in import service. // can be callable function that returns model 'model' => new Review([ 'language' => 'ru', 'hidden' => Review::HIDDEN_NO, ]), 'startRowIndex' => 2, // can be callable function that return array of MapAttribute models // first argument for that function is first row from import file 'attributeMap' => [ new MapAttribute([ 'column' => 'A', 'attribute' => 'b24StationId', 'castTo' => BracketValueCaster::class, ]), new MapAttribute([ 'column' => 'B', 'attribute' => 'title', 'castTo' => MapAttribute::TYPE_STRING, 'identity' => 1, ]), new MapAttribute([ 'column' => 'C', 'attribute' => 'author', 'castTo' => MapAttribute::TYPE_STRING, ]), new MapAttribute([ 'column' => 'D', 'attribute' => 'text', 'castTo' => MapAttribute::TYPE_STRING, ]), new MapAttribute([ 'column' => 'E', 'attribute' => 'rating', 'castTo' => MapAttribute::TYPE_FLOAT, ]), new MapAttribute([ 'column' => 'F', 'attribute' => 'publishAt', 'castTo' => MapAttribute::TYPE_DATETIME, ]), ], 'progressAction' => 'progress', ], ]; }
导入设置动作
public function actions() { return [ ... 'setup-import' => [ 'class' => \elfuvo\import\actions\SetupAction::class, // model instance with pre-defined attribute values. It will be cloned in import service. /*'model' => new Review([ 'hidden' => Review::HIDDEN_NO, 'language' => Yii::$app->language, 'createdBy' => Yii::$app->user->getId(), ])*/ // can be callable function 'model' => function(){ $importModel = new Review([ 'hidden' => Review::HIDDEN_NO, 'language' => Yii::$app->language, 'createdBy' => Yii::$app->user->getId(), ]); // some behaviors do not work in console app (for queued import) // there we can disable them $importModel->detachBehavior('LanguageBehavior'); $importModel->detachBehavior('CreatedByBehavior'); return $importModel; }, 'scenario' => Review::SCENARIO_DEFAULT, // scenario of model validation when saving model from import 'previousAction' => 'upload-file-import', // previous action name 'excludeAttributes' => [ // exclude model attributes for building import map 'id', 'language', 'createdBy', 'createdAt', 'updatedAt' ] ], ]; )
当前进度动作
public function actions() { return [ ... 'progress' => [ 'class' => \elfuvo\import\actions\ProgressAction::class, 'model' => new Review(), ], ]; }
队列作业
如果未为Yii应用程序配置队列组件,则导入将立即开始。否则,ImportJob
将被添加到任务队列。
Yii2 队列。
导入链接按钮
将导入链接按钮添加到您的模块视图
<?= Html::a(Yii::t('import-wizard', 'Import models from Excel file'), ['upload-file-import'], [ 'class' => 'btn btn-primary' ]) ?>
附加说明
模型验证规则用于检测导入值。这对于设置导入动作是实际的。必须仔细考虑模型的验证,因为不良的验证可能会导致数据插入错误(例如:Excel中的日期不能插入到MySql中的日期)以及在数据库中插入数据时的错误。
/** * @inheritdoc */ public function rules() { return [ [['rating'], 'double', 'min' => 1, 'max' => 5], // will add float converter in import wizard [['publishAt'], 'date', 'format' => 'yyyy-MM-dd HH:mm:ss'], // will add date converter in import wizard ]; }
重要!导入文件必须具有具有唯一(标识)值的列,用于更新现有模型。