Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

241 #comment Add export models #97

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions classes/event/ModelHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -209,11 +209,11 @@ protected function checkFieldChangesTwoParam($sField, $sAdditionalField, $obList

$obListStore->clear($this->obElement->$sField);
$obListStore->clear($this->obElement->$sField, $this->obElement->$sAdditionalField);
$obListStore->clear($this->obElement->$sField, $this->obElement->getOriginal($sField));
$obListStore->clear($this->obElement->$sField, $this->obElement->getOriginal($sAdditionalField));

$obListStore->clear($this->obElement->getOriginal($sField));
$obListStore->clear($this->obElement->getOriginal($sField), $this->obElement->$sAdditionalField);
$obListStore->clear($this->obElement->getOriginal($sField), $this->obElement->getOriginal($sField));
$obListStore->clear($this->obElement->getOriginal($sField), $this->obElement->getOriginal($sAdditionalField));
}

/**
Expand Down
216 changes: 216 additions & 0 deletions classes/helper/AbstractExportModelInCSV.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
<?php namespace Lovata\Toolbox\Classes\Helper;

use Event;
use Backend\Models\ExportModel;

/**
* Class AbstractExportModelInCSV
* @package Lovata\Toolbox\Classes\Helper
* @author Sergey Zakharevich, <[email protected]>, LOVATA Group
*/
abstract class AbstractExportModelInCSV extends ExportModel
{
const EVENT_BEFORE_EXPORT = 'model.beforeExport';

const RELATION_LIST = [];

const EVENT_EXTEND_GET_PROPERTY_LIST = 'model.getPropertyList';

/** @var array */
protected $arDefaultColumnList = [];
/** @var array */
protected $arColumnList = [];
/** @var array */
protected $arRelationColumnList = [];
/** @var array */
protected $arPropertyColumnList = [];

/**
* Export data.
* @param array|null $arColumns
* @param string|null $sSessionKey
* @return array
*/
public function exportData($arColumns, $sSessionKey = null) : array
{
$arList = [];
if (empty($arColumns)) {
return $arList;
}

$this->init($arColumns);

$obItemList = $this->getItemList();

if (!$obItemList instanceof \Illuminate\Database\Eloquent\Collection || $obItemList->isEmpty()) {
return $arList;
}

foreach ($obItemList as $obItem) {
$arRow = $this->prepareRow($obItem);
if (empty($arRow)) {
continue;
}
$arList[] = $arRow;
}

return $arList;
}

/**
* Init.
* @param array|null $arColumns
* @return void
*/
protected function init($arColumns)
{
if (empty($arColumns) || !is_array($arColumns)) {
return;
}

$this->arDefaultColumnList = $arColumns;
$arPropertyList = $this->getPropertyList();

foreach ($arColumns as $sColumn) {
if (in_array($sColumn, static::RELATION_LIST)) {
$this->arRelationColumnList[] = $sColumn;
} elseif (in_array($sColumn, $arPropertyList)) {
$this->arPropertyColumnList[] = $sColumn;
} else {
$this->arColumnList[] = $sColumn;
}
}

$this->initPropertyColumnList();
}

/**
* Get property list.
* @return array
*/
protected function getPropertyList() : array
{
$arEventData = Event::fire(self::EVENT_EXTEND_GET_PROPERTY_LIST, [static::class]);
$arPropertyList = [];

if (empty($arEventData) || !is_array($arEventData)) {
return $arPropertyList;
}

foreach ($arEventData as $arAdditionData) {
if (empty($arAdditionData) || !is_array($arAdditionData)) {
continue;
}

$arPropertyList = array_merge($arPropertyList, $arAdditionData);
}

return $arPropertyList;
}

/**
* Init property column list.
*/
protected function initPropertyColumnList()
{
if (empty($this->arPropertyColumnList)) {
return;
}

$arPropertyColumnListTemp = [];

foreach ($this->arPropertyColumnList as $sPropertyColumn) {
$arPropertyColumn = explode('.', $sPropertyColumn);
$iPropertyColumnKey = array_pop($arPropertyColumn);

$arPropertyColumnListTemp[$sPropertyColumn] = $iPropertyColumnKey;
}

$this->arPropertyColumnList = $arPropertyColumnListTemp;
}

/**
* Get item list.
* @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
*/
abstract protected function getItemList();

/**
* Prepare row.
* @param \Model $obModel
* @return array
*/
protected function prepareRow($obModel) : array
{
$arModelData = $this->prepareModelData($obModel);
$arModelRelationsData = $this->prepareModelRelationsData($obModel);
$arModelPropertiesData = $this->prepareModelPropertiesData($obModel);

$arData = array_merge($arModelData, $arModelRelationsData, $arModelPropertiesData);

$arEventData = [static::class, $obModel, $arData, $this->arDefaultColumnList];
$arEventData = Event::fire(self::EVENT_BEFORE_EXPORT, $arEventData);

foreach ($arEventData as $arModelData) {
if (empty($arModelData)) {
continue;
}

foreach ($arModelData as $sKey => $sValue) {
$arData[$sKey] = $sValue;
}
}

return $arData;
}

/**
* Prepare model data.
* @param \Model $obModel
* @return array
*/
protected function prepareModelData($obModel) : array
{
$arResult = [];

if (empty($this->arColumnList)) {
return $arResult;
}

foreach ($this->arColumnList as $sField) {
$arResult[$sField] = (string) $obModel->$sField;
}

return $arResult;
}

/**
* Prepare model relations data.
* @param \Model $obModel
* @return array
*/
protected function prepareModelRelationsData($obModel) : array
{
return [];
}

/**
* Prepare model properties data.
* @param \Model $obModel
* @return array
*/
protected function prepareModelPropertiesData($obModel) : array
{
$arResult = [];

if (empty($this->arPropertyColumnList) || !isset($obModel->property) || empty($obModel->property)) {
return $arResult;
}

foreach ($this->arPropertyColumnList as $sKey => $sField) {
$arResult[$sKey] = array_get($obModel->property, $sField);
}

return $arResult;
}
}
3 changes: 3 additions & 0 deletions lang/en/lang.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
'preview_image' => 'Preview image',
'image' => 'Image',
'images' => 'Images (gallery)',
'icon' => 'Icon',
'description' => 'Description',
'category' => 'Category',
'category_parent_id' => 'Parent category ID',
Expand Down Expand Up @@ -196,10 +197,12 @@
'slug_is_translatable' => 'URL is translatable',
],
'button' => [
'import_export' => 'Import / Export',
'add_property_value' => 'Add property value',
'import_from_csv' => 'Import from CSV',
'export_in_csv' => 'Export in CSV',
'import_button' => 'Import records',
'export_button' => 'Export records',
'import_from_xml' => 'Import from XML',
],
'type' => [
Expand Down
2 changes: 2 additions & 0 deletions lang/ru/lang.php
Original file line number Diff line number Diff line change
Expand Up @@ -183,10 +183,12 @@
'slug_is_translatable' => 'URL поддерживает мультиязычность',
],
'button' => [
'import_export' => 'Импорт / Экспорт',
'add_property_value' => 'Добавить значение свойства',
'import_from_csv' => 'Импорт из CSV',
'export_in_csv' => 'Экспорт в CSV',
'import_button' => 'Импортировать записи',
'export_button' => 'Экспортировать записи',
'import_from_xml' => 'Импорт из XML',
],
'type' => [
Expand Down