Импорт и экспорт
# Введение
Поведение Импорт-Экспорт - модификатор контроллера, который позволяет настроить импорт и экспорт данных при помощи двух страниц: "Импорт" и "Экспорт". Страница "Импорт" позволяет пользователю загрузить CSV файл и внести новые значения в таблицу в базе данных. Страница "Экспорт" позволяет скачать данные из таблицы в CSV файл. При этом используются два действия контроллера - import()
и export()
соответственно.
Чтобы использовать импорт и экспорт, Вам необходимо добавить свойства $implement
и $importExportConfig
в контроллер:
namespace Acme\Shop\Controllers;
class Products extends Controller
{
public $implement = [
'Backend.Behaviors.ImportExportController',
];
public $importExportConfig = 'config_import_export.yaml';
// [...]
}
# Настройка поведения
Файл config_import_export.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
Параметр | Описание |
---|---|
defaultRedirect | страница, на которую будет перенаправлен пользователь по умолчанию. |
import | массив с настройками или ссылка на файл с настройками страницы Импорта. |
export | массив с настройками или ссылка на файл с настройками страницы Экспорта. |
# Страница Импорта
Добавьте следующие настройки в YAML файл для создания страницы Импорта:
import:
title: Import subscribers
modelClass: Acme\Campaign\Models\SubscriberImport
list: $/acme/campaign/models/subscriberimport/columns.yaml
redirect: acme/campaign/subscribers
Параметры конфигурации:
Параметры | Описание |
---|---|
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
Параметры конфигурации:
Параметры | Описание |
---|---|
title | название страницы, можно использовать локализацию. |
fileName | название файла, по умолчанию export.csv. |
list | определяет столбцы списка доступных для экспорта. |
form | дополнительные поля, опционально. |
redirect | страница, на которую будет перенаправлен пользователь после окончания экспорта, опционально. |
useList | интеграция со списком, true или false, по умолчанию false, опционально. |
# Представления
Для каждой страницы Импорта и Экспорта должен существовать свой файл представления import.htm и export.htm соответственно.
Поведение предоставляет доступ к двум методам в классе контроллера: importRender()
и exportRender()
, которые нужны для отображения элементов формы импорта и экспорта.
# Импорт
Представление import.htm отображает форму для импорта данных. Обычно страница содержит хлебные крошки, элемент формы импорта и кнопку. Атрибут data-request должен указывать на AJAX обработчик onImport
. Ниже представлен пример содержимого файла 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 должен указывать на AJAX обработчик onExport
. Ниже представлен пример содержимого файла 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
содержит ключ сессии, который используется для запроса.
Метод | Описание |
---|---|
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
в свойство $implement
класса контроллера. Пример:
export:
useList: true
Если вы используете несколько списков:
export:
useList: orders
fileName: orders.csv