进出口

Introduction

导入导出行为 是控制器behavior 提供导入和导出数据的功能。该行为提供了两个页面,分别称为导入和导出。导入页面允许用户上传 CSV 文件并将列与数据库匹配。导出页面则相反,它允许用户将列从数据库下载为 CSV 文件。行为提供控制器动作import()export().

行为配置分为两部分定义,每部分都依赖于一个特殊的模型类以及一个列表和表单字段定义文件。为了使用 Import Export 行为,您应该添加\Backend\Behaviors\ImportExportController::class 的定义$implement 控制器类的属性。

class Products extends Controller
{
    /**
     * @var array List of behaviors implemented by this controller
     */
    public $implement = [
        \Backend\Behaviors\ImportExportController::class,
    ];
}

配置行为

Import Export 行为将从一个 YAML 格式加载其配置config_import_export.yaml 文件位于控制器的查看目录 (plugins/myauthor/myplugin/controllers/mycontroller/config_import_export.yaml) 默认情况下。

这可以通过覆盖$importExportConfig 控制器上的属性以引用不同的文件名或完整的配置数组:

public $importExportConfig = 'my_custom_import_export_config.yaml';

下面是一个典型的导入导出行为配置文件的示例:

# ===================================
#  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 或者Export, 或两者。

Option Description
defaultRedirect 当没有定义特定的重定向页面时用作后备重定向页面。
import 配置数组或对导入页面配置文件的引用。
export 配置数组或对导出页面配置文件的引用。
defaultFormatOptions 配置数组或对默认 CSV 格式选项的配置文件的引用。

导入页面

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

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

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

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

导出页面

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

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

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

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

格式选项

要覆盖默认的 CSV 格式选项,请将以下配置添加到 YAML 文件中:

defaultFormatOptions:
    delimiter: ';'
    enclosure: '"'
    escape: '\'
    encoding: 'utf-8'

格式选项支持以下配置选项(全部可选):

Option Description
delimiter 分隔符。
enclosure 外壳字符。
escape 转义字符。
encoding 文件编码(仅用于导入)。

导入和导出视图

对于每个页面功能ImportExport 你应该提供一个查看文件 具有相应的名称 -import.htmexport.htm.

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

导入视图

import.htm 视图表示允许用户导入数据的导入页面。典型的导入页面包含面包屑、导入部分本身和提交按钮。这data-request 属性应该是指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() ?>

导出视图

export.htm 视图表示允许用户从数据库导出文件的导出页面。典型的导出页面包含面包屑、导出部分本身和提交按钮。这data-request属性应该是指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() ?>

定义导入模型

对于导入数据,您应该为此过程创建一个专用模型,以扩展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 将包含用于请求的会话密钥。

Method Description
logUpdated() 更新记录时调用。
logCreated() 创建记录时调用。
logError(rowIndex, message) 导入记录出现问题时调用。
logWarning(rowIndex, message) 用于提供软警告,如修改值。
logSkipped(rowIndex, message) 在未导入(跳过)整行数据时使用。

定义导出模型

为了导出数据,您应该创建一个专用模型来扩展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 将包含用于请求的会话密钥。

自定义选项

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

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
        }

        [...]
    }
}

与列表行为集成

有另一种导出数据的方法,它使用列表行为 提供出口数据。为了使用这个特性,你应该有\Backend\Behaviors\ListController::class 的定义$implement 控制器类的字段。您不需要使用导出视图,所有设置都将从列表中提取。这是唯一需要的配置:

export:
    useList: true

如果您正在使用多个列表定义,然后您可以提供列表定义:

export:
    useList: orders
    fileName: orders.csv

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

export:
    useList:
        definition: orders
        raw: true

支持以下配置选项:

Option Description
definition 源记录的列表定义,可选。
raw 从记录中输出原始属性值,默认:false.
豫ICP备18041297号-2