🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 导入导出操作 ### 介绍 **导入导出行为**是一个控制器修改器,提供了用于导入和导出数据的功能。该行为提供了两个页面,分别称为“导入”和“导出”。导入页面允许用户上载CSV文件并将列与数据库匹配。导出页面则相反,它允许用户从数据库下载列作为CSV文件。该行为提供了控制器动作`import()`和`export()`。 行为配置分为两部分,每部分都取决于一个特殊的模型类以及一个列表和表单字段定义文件。要使用导入和导出行为,应将其添加到`$implement`控制器类的属性中。另外,`$importExportConfig`应该定义class属性,并且其值应引用用于配置行为选项的YAML文件。 ~~~ namespace Acme\Shop\Controllers; class Products extends Controller { public $implement = [ 'Backend.Behaviors.ImportExportController', ]; public $importExportConfig = 'config_import_export.yaml'; // [...] } ~~~ ### [](https://octobercms.com/docs/backend/import-export#configuring-import-export)配置行为 `$importExportConfig`属性中引用的配置文件以YAML格式定义。该文件应放置在控制器的[views目录中](https://octobercms.com/docs/backend/controllers-ajax/#introduction)。以下是配置文件的示例: ~~~ # =================================== # Import/Export Behavior Config # =================================== import: title: Import subscribers modelClass: Acme\Campaign\Models\SubscriberImport list: $/acme/campaign/models/subscriber/columns.yaml export: title: Export subscribers modelClass: Acme\Campaign\Models\SubscriberExport list: $/acme/campaign/models/subscriber/columns.yaml ~~~ 下面列出的配置选项是可选的。如果您希望行为支持[Import](https://octobercms.com/docs/backend/import-export#import-page)或[Export](https://octobercms.com/docs/backend/import-export#export-page)或同时支持两者,请定义它们。 | 选项 | 描述 | | --- | --- | | **defaultRedirect** | 未定义特定重定向页面时,用作后备重定向页面。 | | **import** | 导入页面的配置数组或对配置文件的引用。 | | **export** | 导出页面的配置数组或对配置文件的引用。 | | **defaultFormatOptions** | 默认CSV格式选项的配置数组或对配置文件的引用。 | ### [](https://octobercms.com/docs/backend/import-export#import-page)导入页面 要支持“导入”页面,请在YAML文件中添加以下配置: ~~~ import: title: Import subscribers modelClass: Acme\Campaign\Models\SubscriberImport list: $/acme/campaign/models/subscriberimport/columns.yaml redirect: acme/campaign/subscribers ~~~ 导入页面支持以下配置选项: | 选项 | 描述 | | --- | --- | | **title** | 页面标题,可以引用[本地化字符串](https://octobercms.com/docs/plugin/localization)。 | | **list** | 定义可用于导入的列表列。 | | **form** | 提供用作导入选项的其他字段(可选)。 | | **redirect** | 导入完成后的重定向页面,可选 | | **permissions** | 执行操作所需的用户权限,可选 | ### [](https://octobercms.com/docs/backend/import-export#export-page)导出页面 要支持“导出”页面,请在YAML文件中添加以下配置: ~~~ export: title: Export subscribers modelClass: Acme\Campaign\Models\SubscriberExport list: $/acme/campaign/models/subscriberexport/columns.yaml redirect: acme/campaign/subscribers ~~~ 导出页面支持以下配置选项: | 选项 | 描述 | | --- | --- | | **title** | 页面标题,可以引用[本地化字符串](https://octobercms.com/docs/plugin/localization)。 | | **fileName** | 用于导出文件的文件名,默认为**export.csv**。 | | **list** | 定义可用于导出的列表列。 | | **form** | 提供用作导入选项的其他字段(可选)。 | | **redirect** | 导出完成后的重定向页面,可选。 | | **useList** | 设置为true或列表定义的值以启用[与Lists的集成](https://octobercms.com/docs/backend/import-export#list-behavior-integration),默认值:false。 | ### [](https://octobercms.com/docs/backend/import-export#format-options)格式选项 要覆盖默认的CSV格式选项,请在YAML文件中添加以下配置: ~~~ defaultFormatOptions: delimiter: ';' enclosure: '"' escape: '\' encoding: 'utf-8' ~~~ 格式选项支持以下配置选项(所有可选): | 选项 | 描述 | | --- | --- | | **delimiter** | 分隔符。 | | **enclosure** | 外壳字符。 | | **escape** | 转义符。 | | **encoding** | 文件编码(仅用于导入)。 | ### [](https://octobercms.com/docs/backend/import-export#import-export-views)导入和导出视图 对于“[导入](https://octobercms.com/docs/backend/import-export#import-page)和[导出”的](https://octobercms.com/docs/backend/import-export#export-page)每个页面功能,您应该提供一个具有相应名称的[视图文件](https://octobercms.com/docs/backend/controllers-ajax/#introduction)**\-import.htm**和**export.htm**。 导入/导出行为将两个方法添加到控制器类:`importRender`和`exportRender`。这些方法根据上述YAML配置文件呈现导入和导出节。 ### [](https://octobercms.com/docs/backend/import-export#import-view)导入视图 该**import.htm**视图表示导入页面,允许用户导入数据。典型的“导入”页面包含面包屑,“导入”部分本身和提交按钮。该**数据请求**属性应该指的是`onImport`由行为提供AJAX的处理程序。以下是典型的import.htm视图文件的内容。 ~~~ <?= Form::open(['class' => 'layout']) ?> <div class="layout-row"> <?= $this->importRender() ?> </div> <div class="form-buttons"> <button type="submit" data-control="popup" data-handler="onImportLoadForm" data-keyboard="false" class="btn btn-primary"> Import records </button> </div> <?= Form::close() ?> ~~~ ### [](https://octobercms.com/docs/backend/import-export#export-view)汇出检视 该**export.htm**视图表示导出页面,允许用户将文件从数据库导出。典型的“导出”页面包含面包屑,“导出”部分本身和提交按钮。该**数据请求**属性应该指的是`onExport`由行为提供AJAX的处理程序。以下是典型的export.htm表单的内容。 ~~~ <?= Form::open(['class' => 'layout']) ?> <div class="layout-row"> <?= $this->exportRender() ?> </div> <div class="form-buttons"> <button type="submit" data-control="popup" data-handler="onExportLoadForm" data-keyboard="false" class="btn btn-primary"> Export records </button> </div> <?= Form::close() ?> ~~~ ### [](https://octobercms.com/docs/backend/import-export#import-model)定义导入模型 为了导入数据,您应该为此过程创建一个专用模型,以扩展`Backend\Models\ImportModel`该类。这是一个示例类定义: ~~~ class SubscriberImport extends \Backend\Models\ImportModel { /** * @var array The rules to be applied to the data. */ public $rules = []; public function importData($results, $sessionKey = null) { foreach ($results as $row => $data) { try { $subscriber = new Subscriber; $subscriber->fill($data); $subscriber->save(); $this->logCreated(); } catch (\Exception $ex) { $this->logError($row, $ex->getMessage()); } } } } ~~~ 该类必须定义一个称为的`importData`用于处理导入数据的方法。第一个参数`$results`将包含一个数组,其中包含要导入的数据。第二个参数`$sessionKey`将包含用于请求的会话密钥。 | 方法 | 描述 | | --- | --- | | `logUpdated()` | 记录更新时调用。 | | `logCreated()` | 创建记录时调用。 | | `logError(rowIndex, message)` | 导入记录有问题时调用。 | | `logWarning(rowIndex, message)` | 用于提供软警告,例如修改值。 | | `logSkipped(rowIndex, message)` | 未导入(跳过)整行数据时使用。 | ### [](https://octobercms.com/docs/backend/import-export#export-model)定义导出模型 为了导出数据,您应该创建一个扩展`Backend\Models\ExportModel`该类的专用模型。这是一个例子: ~~~ class SubscriberExport extends \Backend\Models\ExportModel { public function exportData($columns, $sessionKey = null) { $subscribers = Subscriber::all(); $subscribers->each(function($subscriber) use ($columns) { $subscriber->addVisible($columns); }); return $subscribers->toArray(); } } ~~~ 该类必须定义一个称为`exportData`用于返回导出数据的方法。第一个参数`$columns`是要导出的列名称的数组。第二个参数`$sessionKey`将包含用于请求的会话密钥。 ### [](https://octobercms.com/docs/backend/import-export#custom-options)自订选项 导入和导出表单均支持可使用表单字段引入的自定义选项,这些选项分别在导入或导出配置中的**表单**选项中定义。然后将这些值传递到导入/导出模型,并在处理期间可用。 ~~~ import: [...] form: $/acme/campaign/models/subscriberimport/fields.yaml export: [...] form: $/acme/campaign/models/subscriberexport/fields.yaml ~~~ 指定的表单字段将出现在导入/导出页面上。这是一个示例`fields.yaml`文件内容: ~~~ # =================================== # Form Field Definitions # =================================== fields: auto_create_lists: label: Automatically create lists type: checkbox default: true ~~~ 可以使用导入模型的方法内部访问上方名为**auto\_create\_lists**的表单字段的值。如果这是导出模型,则该值将在方法内部可用。`$this->auto_create_lists``importData``exportData` ~~~ class SubscriberImport extends \Backend\Models\ImportModel { public function importData($results, $sessionKey = null) { if ($this->auto_create_lists) { // Do something } [...] } } ~~~ ### [](https://octobercms.com/docs/backend/import-export#list-behavior-integration)与列表行为整合 有另一种导出数据的方法,该方法使用[列表行为](https://octobercms.com/docs/backend/lists)提供导出数据。为了使用此功能,您应该对控制器类`Backend.Behaviors.ListController`的`$implement`字段进行定义。您不需要使用导出视图,所有设置将从列表中拉出。这是唯一需要的配置: ~~~ export: useList: true ~~~ 如果使用[多个列表定义](https://octobercms.com/docs/backend/lists#multiple-list-definitions),则可以提供列表定义: ~~~ export: useList: orders fileName: orders.csv ~~~ 该`useList`选项还支持扩展配置选项。 ~~~ export: useList: definition: orders raw: true ~~~ 支持以下配置选项: | 选项 | 描述 | | --- | --- | |**definition** | 用于从中获取记录的列表定义(可选)。 | | **raw** | 从记录中输出原始属性值,默认值:false。 |