进出口
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 |
文件编码(仅用于导入)。 |
导入和导出视图
对于每个页面功能Import 和Export 你应该提供一个查看文件 具有相应的名称 -import.htm 和export.htm.
导入/导出行为向控制器类添加了两个方法:importRender
和exportRender
.这些方法根据上述 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 . |