后台导入和导出

介绍

导入导出行为 是一个控制器修饰符,提供导入和导出数据的功能。 该行为提供了两个名为Import和Export的页面。 “导入”页面允许用户上传CSV文件并将列与数据库匹配。 “导出”页面相反,允许用户将数据库中的列作为CSV文件下载。 该行为提供了控制器动作import()export()

行为配置分为两部分,每部分依赖于特殊的模型类以及列表和表单字段定义文件。 要使用导入和导出行为,应将其添加到控制器类的$implement属性中。 此外,应定义$importExportConfig类属性,其值应引用用于配置行为选项的YAML文件。

  1. namespace Acme\Shop\Controllers;
  2. class Products extends Controller
  3. {
  4. public $implement = [
  5. 'Backend.Behaviors.ImportExportController',
  6. ];
  7. public $importExportConfig = 'config_import_export.yaml';
  8. // [...]
  9. }

配置行为

$importExportConfig属性中引用的配置文件以YAML格式定义。 该文件应放入控制器的views目录。 以下是配置文件的示例:

  1. # ===================================
  2. # Import/Export Behavior Config
  3. # ===================================
  4. import:
  5. title: Import subscribers
  6. modelClass: Acme\Campaign\Models\SubscriberImport
  7. list: $/acme/campaign/models/subscriber/columns.yaml
  8. export:
  9. title: Export subscribers
  10. modelClass: Acme\Campaign\Models\SubscriberExport
  11. list: $/acme/campaign/models/subscriber/columns.yaml

下面列出的配置选项是可选的。 如果您希望行为支持 ImportExport或两者,请定义它们。

选项 描述
defaultRedirect 在未定义特定重定向页面时用作回退重定向页面。
import 配置数组或对“导入”页面的配置文件的引用。
export 配置数组或对“导出”页面的配置文件的引用。

导入页面

要支持“导入”页面,请将以下配置添加到YAML文件中:

  1. import:
  2. title: Import subscribers
  3. modelClass: Acme\Campaign\Models\SubscriberImport
  4. list: $/acme/campaign/models/subscriberimport/columns.yaml
  5. redirect: acme/campaign/subscribers

“导入”页面支持以下配置选项:

选项 描述
title 页面标题,可以参考本地化字符串
list 定义可用于导入的列表列。
form 提供用作导入选项的其他字段,可选。
redirect 导入完成时的重定向页面,可选
permissions 执行操作所需的用户权限,可选

导出页面

要支持“导出”页面,请将以下配置添加到YAML文件中:

  1. export:
  2. title: Export subscribers
  3. modelClass: Acme\Campaign\Models\SubscriberExport
  4. list: $/acme/campaign/models/subscriberexport/columns.yaml
  5. redirect: acme/campaign/subscribers

“导出”页面支持以下配置选项:

选项 描述
title 页面标题,可以参考本地化字符串
fileName 用于导出文件的文件名,默认为 export.csv
list 定义可用于导出的列表列。
form 提供用作导入选项的其他字段,可选。
redirect 导出完成时的重定向页面,可选。
useList 设置为true或列表定义的值以启用与列表集成,默认值:false。

导入和导出视图

对于每个页面功能导入导出,您应该提供一个视图文件和相应的名称 - import.htmexport.htm

导入/导出行为向控制器类添加了两个方法:importRenderexportRender。 这些方法根据上述YAML配置文件呈现导入和导出部分。

导入视图

import.htm视图表示允许用户导入数据的导入页面。 典型的导入页面包含面包屑,导入部分本身和提交按钮。 data-request属性应该引用行为提供的onImport AJAX处理程序。 以下是典型的import.htm视图文件的内容。

  1. <?= Form::open(['class' => 'layout']) ?>
  2. <div class="layout-row">
  3. <?= $this->importRender() ?>
  4. </div>
  5. <div class="form-buttons">
  6. <button
  7. type="submit"
  8. data-control="popup"
  9. data-handler="onImportLoadForm"
  10. data-keyboard="false"
  11. class="btn btn-primary">
  12. Import records
  13. </button>
  14. </div>
  15. <?= Form::close() ?>

导出视图

export.htm视图表示允许用户从数据库导出文件的“导出”页面。 典型的“导出”页面包含面包屑,导出部分本身和提交按钮。 data-request属性应该引用行为提供的onExport AJAX处理程序。 以下是典型的export.htm表单的内容。

  1. <?= Form::open(['class' => 'layout']) ?>
  2. <div class="layout-row">
  3. <?= $this->exportRender() ?>
  4. </div>
  5. <div class="form-buttons">
  6. <button
  7. type="submit"
  8. data-control="popup"
  9. data-handler="onExportLoadForm"
  10. data-keyboard="false"
  11. class="btn btn-primary">
  12. Export records
  13. </button>
  14. </div>
  15. <?= Form::close() ?>

定义导入模型

对于导入数据,您应该为此过程创建一个专用模型,该模型扩展了Backend\Models\ImportModel类。 这是一个示例类定义:

  1. class SubscriberImport extends \Backend\Models\ImportModel
  2. {
  3. /**
  4. * @var array 要应用于数据的规则。
  5. */
  6. public $rules = [];
  7. public function importData($results, $sessionKey = null)
  8. {
  9. foreach ($results as $row => $data) {
  10. try {
  11. $subscriber = new Subscriber;
  12. $subscriber->fill($data);
  13. $subscriber->save();
  14. $this->logCreated();
  15. }
  16. catch (\Exception $ex) {
  17. $this->logError($row, $ex->getMessage());
  18. }
  19. }
  20. }
  21. }

该类必须定义一个名为importData的方法,用于处理导入的数据。 第一个参数$results将包含一个包含要导入的数据的数组。 第二个参数$sessionKey将包含用于请求的会话密钥。

方法 描述
logUpdated() 更新记录时调用。(Called when a record is updated.)
logCreated() 当创建记录时调用。(Called when a record is created.)
logError(rowIndex, message) 导入记录时出现问题。
logWarning(rowIndex, message) 用于提供软警告,例如修改值。
logSkipped(rowIndex, message) 在未导入(跳过)整行数据时使用。

定义导出模型

要导出数据,您应该创建一个扩展Backend\Models\ExportModel类的专用模型。 这是一个例子:

  1. class SubscriberExport extends \Backend\Models\ExportModel
  2. {
  3. public function exportData($columns, $sessionKey = null)
  4. {
  5. $subscribers = Subscriber::all();
  6. $subscribers->each(function($subscriber) use ($columns) {
  7. $subscriber->addVisible($columns);
  8. });
  9. return $subscribers->toArray();
  10. }
  11. }

该类必须定义一个名为exportData的方法,用于返回导出数据。 第一个参数$columns是要导出的列名数组。 第二个参数$sessionKey将包含用于请求的会话密钥。

自定义选项

导入和导出表单都支持可以使用表单字段引入的自定义选项,这些表单字段分别在导入或导出配置中的表单选项中定义。 然后将这些值传递给导入/导出模型,并在处理期间可用。

  1. import:
  2. [...]
  3. form: $/acme/campaign/models/subscriberimport/fields.yaml
  4. export:
  5. [...]
  6. form: $/acme/campaign/models/subscriberexport/fields.yaml

指定的表单字段将显示在导入/导出页面上。 这是一个示例fields.yaml文件内容:

  1. # ===================================
  2. # Form Field Definitions
  3. # ===================================
  4. fields:
  5. auto_create_lists:
  6. label: Automatically create lists
  7. type: checkbox
  8. default: true

可以使用导入模型的importData方法中的$this-> auto_create_lists访问上面名为auto_create_lists的表单字段的值。 如果这是导出模型,则该值将在exportData方法中可用。

  1. class SubscriberImport extends \Backend\Models\ImportModel
  2. {
  3. public function importData($results, $sessionKey = null)
  4. {
  5. if ($this->auto_create_lists) {
  6. // Do something
  7. }
  8. [...]
  9. }
  10. }

与列表行为集成

有一种替代方法可以导出使用list行为 来提供导出数据的数据。 要使用此功能,您应该将Backend.Behaviors.ListController定义到控制器类的$implement字段。 您不需要使用导出视图,所有设置都将从列表中提取。 这是唯一需要的配置:

  1. export:
  2. useList: true

如果您使用多个列表定义,那么您可以提供列表定义:

  1. export:
  2. useList: orders
  3. fileName: orders.csv

useList选项还支持扩展配置选项。

  1. export:
  2. useList:
  3. definition: orders
  4. raw: true

支持以下配置选项:

选项 描述
definition 源记录的列表定义,可选。
raw 列表定义来自源记录,optional.output来自记录的原始属性值,默认值:false。