В данной инструкции вы я внедрю поведение Import и Export в плагин, который мы с вами делали в инструкциях: Создание плагина через Artisan. Инструкция для новичков. Часть 1 и Создание плагина через Artisan. Инструкция для новичков. Часть 2.
Откройте контроллер вашей модели, и в $implement
массив добавьте Backend.Behaviors.ImportExportController
класс.
Пример:
public $implement = [
'Backend.Behaviors.FormController',
'Backend.Behaviors.ListController',
'Backend.Behaviors.ImportExportController',
];
Сразу под
public $listConfig = 'config_list.yaml';
Добавьте
public $importExportConfig = 'config_import_export.yaml';
В папке своего контроллера создайте файлы:
import.htm
export.htm
config_import_export.yaml
В файл import.htm добавьте следующее:
<?= Form::open(['class' => 'layout import-export']) ?>
<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 posts
</button>
</div>
<?= Form::close() ?>
В export.htm:
<?= Form::open(['class' => 'layout import-export']) ?>
<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 places
</button>
</div>
<?= Form::close() ?>
В конфигурационный файл config_import_export.yaml
следующее:
import:
title: Import places
modelClass: OctoClub\Tutorial\Models\ItemImport
list: $/octoclub/tutorial/models/itemimport/columns.yaml
export:
title: Export places
modelClass: OctoClub\Tutorial\Models\ItemExport
list: $/octoclub/tutorial/models/itemexport/columns.yaml
Здесь мы указываем модели, и их столбцы которые будут отвечать за Импорт и Export.
Как вы видите, мы добавили в modelClass модели ItemImport
и ItemExport
. В папке с нашими моделями нужно создать эти два php файла и добавить в каждый шаблонный код:
Для ItemImport
:
<?php namespace OctoClub\Tutorial\Models;
use Backend\Models\ImportModel;
class ItemImport extends ImportModel
{
public $table = 'octoclub_tutorial_items';
/**
* Обязательные поля
*/
protected $rules = [
'name' => 'required',
'slug' => 'required',
];
public function importData($results, $sessionKey = null)
{
$firstRow = reset($results);
foreach ($results as $row => $data) {
try {
// Создаем новую запись
$item = Item::make();
// Исключить из цикла
$except = ['id']; // В этом массиве мы исключаем те переменные, которые не нужно обрабатывать в автоматическом цикле foreach ниже
// Цикл заполнения
foreach (array_except($data, $except) as $attribute => $value) {
$item->{$attribute} = $value ?: null; // Присваивание значения в столбец по атрибуту
}
// Сохранение
$item->forceSave();
$this->logCreated();
}
catch (\Exception $ex) {
// Ошибка
$this->logError($row, $ex);
}
}
}
}
Для ItemExport
:
<?php namespace OctoClub\Tutorial\Models;
use Backend\Models\ExportModel;
class ItemExport extends ExportModel
{
public function exportData($columns, $sessionKey = null)
{
// Берем всю коллекцию
$item = Item::all();
$item->each(function($item) use ($columns) {
// Берем все столбцы которые видны в columns.yaml
$item->addVisible($columns);
});
// Выводим
return $item->toArray();
}
}
Теперь создадим две папки этих моделей в папке Models своего плагина itemimport
и itemexport
.
В них добавим columns.yaml в котором перечислим поля, которые нужно импортировать или экспортировать. Файл может быть одинаковым для Import и Export.
# ===================================
# List Column Definitions
# ===================================
columns:
id: ID
name: Название
slug: Ссылка
content: Контент
После этого, все готово. Вам достаточно вывести кнопки Import и Export на страницу со списком записей в контроллере. Для этого перейдите в папку вашего контроллера и в _list_toolbar.htm
добавьте после кнопки Delete selected.
<?php if ($this->user->isSuperUser()): ?>
<div class="btn-group">
<a
href="<?= Backend::url('octoclub/tutorial/items/import') ?>"
class="btn btn-default oc-icon-upload">
Import
</a>
<a
href="<?= Backend::url('octoclub/tutorial/items/export') ?>"
class="btn btn-default oc-icon-download">
Export
</a>
</div>
<?php endif ?>
Пример всего файла:
<div data-control="toolbar">
<a
href="<?= Backend::url('octoclub/tutorial/items/create') ?>"
class="btn btn-primary oc-icon-plus">
New Item
</a>
<button
class="btn btn-danger oc-icon-trash-o"
disabled="disabled"
onclick="$(this).data('request-data', { checked: $('.control-list').listWidget('getChecked') })"
data-request="onDelete"
data-request-confirm="Are you sure you want to delete the selected Items?"
data-trigger-action="enable"
data-trigger=".control-list input[type=checkbox]"
data-trigger-condition="checked"
data-request-success="$(this).prop('disabled', 'disabled')"
data-stripe-load-indicator>
Delete selected
</button>
<?php if ($this->user->isSuperUser()): ?>
<div class="btn-group">
<a
href="<?= Backend::url('octoclub/tutorial/items/import') ?>"
class="btn btn-default oc-icon-upload">
Import
</a>
<a
href="<?= Backend::url('octoclub/tutorial/items/export') ?>"
class="btn btn-default oc-icon-download">
Export
</a>
</div>
<?php endif ?>
</div>
Все готово, теперь вы можете выполнять Import и Export в вашей модели данных!
Если возникнут вопросы, пишите в этой дискуссии, помогу чем смогу)