diff --git a/classes/event/ModelHandler.php b/classes/event/ModelHandler.php index 5c38c2cf..93dea41f 100644 --- a/classes/event/ModelHandler.php +++ b/classes/event/ModelHandler.php @@ -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)); } /** diff --git a/classes/helper/AbstractExportModelInCSV.php b/classes/helper/AbstractExportModelInCSV.php new file mode 100644 index 00000000..4a3dafef --- /dev/null +++ b/classes/helper/AbstractExportModelInCSV.php @@ -0,0 +1,216 @@ +, 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; + } +} diff --git a/lang/en/lang.php b/lang/en/lang.php index 54739ec7..3c4c0257 100644 --- a/lang/en/lang.php +++ b/lang/en/lang.php @@ -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', @@ -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' => [ diff --git a/lang/ru/lang.php b/lang/ru/lang.php index 8ddddaf4..2d0aecb0 100644 --- a/lang/ru/lang.php +++ b/lang/ru/lang.php @@ -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' => [