To save the entity_id in my custom table on csv import.
Vendor\CatalogImportExport\Model\Import\Product.php
class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
{
const SKU = 'sku';
const COL_ENTITY_ID = 'entity_id';
const TABLE_Entity = 'temp_tgs';
/**
* Validation failure message template definitions
*
* @var array
*/
protected $_messageTemplates = [
ValidatorInterface::ERROR_PRODUCTID_IS_EMPTY => 'TITLE is empty',
];
protected $_permanentAttributes = [self::SKU];
/**
* If we should check column names
*
* @var bool
*/
protected $needColumnCheck = true;
protected $groupFactory;
/**
* Valid column names
*
* @array
*/
protected $validColumnNames = [
// self::COL_ENTITY_ID,
self::SKU,
//self::NAME,
];
/**
* Need to log in import history
*
* @var bool
*/
protected $logInHistory = true;
protected $_validators = [];
/**
* @var \Magento\Framework\Stdlib\DateTime\DateTime
*/
protected $_connection;
protected $_resource;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
public function __construct(
\Magento\Framework\Json\Helper\Data $jsonHelper,
\Magento\ImportExport\Helper\Data $importExportData,
\Magento\ImportExport\Model\ResourceModel\Import\Data $importData,
\Magento\Framework\App\ResourceConnection $resource,
\Magento\ImportExport\Model\ResourceModel\Helper $resourceHelper,
\Magento\Framework\Stdlib\StringUtils $string,
ProcessingErrorAggregatorInterface $errorAggregator,
\Magento\Customer\Model\GroupFactory $groupFactory
) {
$this->jsonHelper = $jsonHelper;
$this->_importExportData = $importExportData;
$this->_resourceHelper = $resourceHelper;
$this->_dataSourceModel = $importData;
$this->_resource = $resource;
$this->_connection = $resource->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);
$this->errorAggregator = $errorAggregator;
$this->groupFactory = $groupFactory;
}
public function getValidColumnNames()
{
return $this->validColumnNames;
}
/**
* Entity type code getter.
*
* @return string
*/
public function getEntityTypeCode()
{
return 'my_import';
}
/**
* Row validation.
*
* @param array $rowData
* @param int $rowNum
* @return bool
*/
public function validateRow(array $rowData, $rowNum)
{
$title = false;
if (isset($this->_validatedRows[$rowNum])) {
return !$this->getErrorAggregator()->isRowInvalid($rowNum);
}
$this->_validatedRows[$rowNum] = true;
// BEHAVIOR_DELETE use specific validation logic
// if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) {
if (!isset($rowData[self::SKU]) || empty($rowData[self::SKU]) ) {
$this->addRowError(ValidatorInterface::ERROR_PRODUCTID_IS_EMPTY, $rowNum);
return false;
}
return !$this->getErrorAggregator()->isRowInvalid($rowNum);
}
/**
* Create Advanced price data from raw data.
*
* @throws \Exception
* @return bool Result of operation.
*/
protected function _importData()
{
if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) {
$this->deleteEntity();
} elseif (\Magento\ImportExport\Model\Import::BEHAVIOR_REPLACE == $this->getBehavior()) {
$this->replaceEntity();
} elseif (\Magento\ImportExport\Model\Import::BEHAVIOR_APPEND == $this->getBehavior()) {
$this->saveEntity();
}
return true;
}
/**
* Save newsletter subscriber
*
* @return $this
*/
public function saveEntity()
{
$this->saveAndReplaceEntity();
return $this;
}
/**
* Replace newsletter subscriber
*
* @return $this
*/
public function replaceEntity()
{
$this->saveAndReplaceEntity();
return $this;
}
protected function saveAndReplaceEntity()
{
$behavior = $this->getBehavior();
$listTitle = [];
while ($bunch = $this->_dataSourceModel->getNextBunch()) {
$entityList = [];
foreach ($bunch as $rowNum => $rowData) {
if (!$this->validateRow($rowData, $rowNum)) {
$this->addRowError(ValidatorInterface::ERROR_PRODUCTID_IS_EMPTY, $rowNum);
continue;
}
if ($this->getErrorAggregator()->hasToBeTerminated()) {
$this->getErrorAggregator()->addRowToSkip($rowNum);
continue;
}
$rowTtile= $rowData[self::SKU];
$listTitle[] = $rowTtile;
$entityList[$rowTtile][] = [
self::SKU => $rowData[self::SKU],
//self::COL_ENTITY_ID => $rowData[self::COL_ENTITY_ID],
];
}
if (\Magento\ImportExport\Model\Import::BEHAVIOR_REPLACE == $behavior) {
if ($listTitle) {
if ($this->deleteEntityFinish(array_unique($listTitle), self::TABLE_Entity)) {
$this->saveEntityFinish($entityList, self::TABLE_Entity);
}
}
} elseif (\Magento\ImportExport\Model\Import::BEHAVIOR_APPEND == $behavior) {
$this->saveEntityFinish($entityList, self::TABLE_Entity);
}
}
return $this;
}
protected function saveEntityFinish(array $entityData, $table)
{
if ($entityData) {
$tableName = $this->_connection->getTableName($table);
$entityIn = [];
foreach ($entityData as $id => $entityRows) {
foreach ($entityRows as $row) {
$entityIn[] = $row;
}
}
if ($entityIn) {
$this->_connection->insertOnDuplicate($tableName, $entityIn,[
self::SKU,
self::COL_ENTITY_ID, //here i need my imported productids to be saved to temp_tgs table
]);
}
}
return $this;
}
My table structure:
Im importing csv with columns only SKU as of now.(Following Magentos default import file, which has no product ids)
Problem is my sku is saving but i need the product ids of the imported products to be saved.
Im getting :
Additional data: Notice: Undefined index: entity_id in Vendor\CatalogImportExport\Model\Import\Product.php on line 216
ie here: (if i uncomment the line) self::COL_ENTITY_ID => $rowData[self::COL_ENTITY_ID],
-
hi !! can you reply your answer ?supriya mishra– supriya mishra2016年11月11日 06:45:21 +00:00Commented Nov 11, 2016 at 6:45
-
import custom product attribute from csv to custom table- magento 2.1 if yyou have answer reply to my question Plzsupriya mishra– supriya mishra2016年11月11日 06:46:24 +00:00Commented Nov 11, 2016 at 6:46
-
@Sushivam, I followed (blogtreat.com/…) it's creating new filed, and while upload the CSV it's validated, after that if I hit the "import" button nothing is happening simply loading... in console, there is no request for the import buttonsenthil– senthil2018年10月17日 11:01:21 +00:00Commented Oct 17, 2018 at 11:01
1 Answer 1
app/code/VendoreName/CustomDataImport/etc
db_schema.xml
<?xml version="1.0"?>
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
<table name="custom_import">
<column xsi:type="int" name="entity_id" padding="10" unsigned="true" nullable="false" comment="Entity Id" identity="true" />
<column xsi:type="varchar" name="name" nullable="false" length="255" comment="Product Name"/>
<column xsi:type="int" name="duration" padding="10" unsigned="true" nullable="false" comment="Duration"/>
<constraint xsi:type="primary" referenceId="CUSTOM_IMPORT_ID_PRIMARY">
<column name="entity_id"/>
</constraint>
</table>
</schema>
app/code/VendoreName/CustomDataImport/etc
import.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_ImportExport:etc/import.xsd">
<entity name="custom_import" label="Custom Import" model="VendoreName\CustomDataImport\Model\Import\CustomImport" behaviorModel="Magento\ImportExport\Model\Source\Import\Behavior\Basic" />
</config>
app/code/VendoreName/CustomDataImport/Files/Sample
custom_import.csv
entity_id,name,duration
,"Name 1",90
2,"Name 3",120
app/code/VendoreName/CustomDataImport/etc
di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\ImportExport\Model\Import\SampleFileProvider">
<arguments>
<argument name="samples" xsi:type="array">
<item name="custom_import" xsi:type="string">VendoreName_CustomDataImport</item>
</argument>
</arguments>
</type>
</config>
app/code/VendoreName/CustomDataImport/Model/Import
CustomImport.php
<?php
namespace VendoreName\CustomDataImport\Model\Import;
use Exception;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\DB\Adapter\AdapterInterface;
use Magento\Framework\Json\Helper\Data as JsonHelper;
use Magento\ImportExport\Helper\Data as ImportHelper;
use Magento\ImportExport\Model\Import;
use Magento\ImportExport\Model\Import\Entity\AbstractEntity;
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface;
use Magento\ImportExport\Model\ResourceModel\Helper;
use Magento\ImportExport\Model\ResourceModel\Import\Data;
/**
* Class Courses
*/
class CustomImport extends AbstractEntity
{
const ENTITY_CODE = 'custom_import';
const TABLE = 'custom_import';
const ENTITY_ID_COLUMN = 'entity_id';
/**
* If we should check column names
*/
protected $needColumnCheck = true;
/**
* Need to log in import history
*/
protected $logInHistory = true;
/**
* Permanent entity columns.
*/
protected $_permanentAttributes = [
'entity_id',
];
/**
* Valid column names
*/
protected $validColumnNames = [
'entity_id',
'name',
'duration',
];
/**
* @var AdapterInterface
*/
protected $connection;
/**
* @var ResourceConnection
*/
private $resource;
/**
* Courses constructor.
*
* @param JsonHelper $jsonHelper
* @param ImportHelper $importExportData
* @param Data $importData
* @param ResourceConnection $resource
* @param Helper $resourceHelper
* @param ProcessingErrorAggregatorInterface $errorAggregator
*/
public function __construct(
JsonHelper $jsonHelper,
ImportHelper $importExportData,
Data $importData,
ResourceConnection $resource,
Helper $resourceHelper,
ProcessingErrorAggregatorInterface $errorAggregator
) {
$this->jsonHelper = $jsonHelper;
$this->_importExportData = $importExportData;
$this->_resourceHelper = $resourceHelper;
$this->_dataSourceModel = $importData;
$this->resource = $resource;
$this->connection = $resource->getConnection(ResourceConnection::DEFAULT_CONNECTION);
$this->errorAggregator = $errorAggregator;
$this->initMessageTemplates();
}
/**
* Entity type code getter.
*
* @return string
*/
public function getEntityTypeCode()
{
return static::ENTITY_CODE;
}
/**
* Get available columns
*
* @return array
*/
public function getValidColumnNames(): array
{
return $this->validColumnNames;
}
/**
* Row validation
*
* @param array $rowData
* @param int $rowNum
*
* @return bool
*/
public function validateRow(array $rowData, $rowNum): bool
{
$name = $rowData['name'] ?? '';
$duration = (int) $rowData['duration'] ?? 0;
if (!$name) {
$this->addRowError('NameIsRequired', $rowNum);
}
if (!$duration) {
$this->addRowError('DurationIsRequired', $rowNum);
}
if (isset($this->_validatedRows[$rowNum])) {
return !$this->getErrorAggregator()->isRowInvalid($rowNum);
}
$this->_validatedRows[$rowNum] = true;
return !$this->getErrorAggregator()->isRowInvalid($rowNum);
}
/**
* Init Error Messages
*/
private function initMessageTemplates()
{
$this->addMessageTemplate(
'NameIsRequired',
__('The name cannot be empty.')
);
$this->addMessageTemplate(
'DurationIsRequired',
__('Duration should be greater than 0.')
);
}
/**
* Import data
*
* @return bool
*
* @throws Exception
*/
protected function _importData(): bool
{
switch ($this->getBehavior()) {
case Import::BEHAVIOR_DELETE:
$this->deleteEntity();
break;
case Import::BEHAVIOR_REPLACE:
$this->saveAndReplaceEntity();
break;
case Import::BEHAVIOR_APPEND:
$this->saveAndReplaceEntity();
break;
}
return true;
}
/**
* Delete entities
*
* @return bool
*/
private function deleteEntity(): bool
{
$rows = [];
while ($bunch = $this->_dataSourceModel->getNextBunch()) {
foreach ($bunch as $rowNum => $rowData) {
$this->validateRow($rowData, $rowNum);
if (!$this->getErrorAggregator()->isRowInvalid($rowNum)) {
$rowId = $rowData[static::ENTITY_ID_COLUMN];
$rows[] = $rowId;
}
if ($this->getErrorAggregator()->hasToBeTerminated()) {
$this->getErrorAggregator()->addRowToSkip($rowNum);
}
}
}
if ($rows) {
return $this->deleteEntityFinish(array_unique($rows));
}
return false;
}
/**
* Save and replace entities
*
* @return void
*/
private function saveAndReplaceEntity()
{
$behavior = $this->getBehavior();
$rows = [];
while ($bunch = $this->_dataSourceModel->getNextBunch()) {
$entityList = [];
foreach ($bunch as $rowNum => $row) {
if (!$this->validateRow($row, $rowNum)) {
continue;
}
if ($this->getErrorAggregator()->hasToBeTerminated()) {
$this->getErrorAggregator()->addRowToSkip($rowNum);
continue;
}
$rowId = $row[static::ENTITY_ID_COLUMN];
$rows[] = $rowId;
$columnValues = [];
foreach ($this->getAvailableColumns() as $columnKey) {
$columnValues[$columnKey] = $row[$columnKey];
}
$entityList[$rowId][] = $columnValues;
$this->countItemsCreated += (int) !isset($row[static::ENTITY_ID_COLUMN]);
$this->countItemsUpdated += (int) isset($row[static::ENTITY_ID_COLUMN]);
}
if (Import::BEHAVIOR_REPLACE === $behavior) {
if ($rows && $this->deleteEntityFinish(array_unique($rows))) {
$this->saveEntityFinish($entityList);
}
} elseif (Import::BEHAVIOR_APPEND === $behavior) {
$this->saveEntityFinish($entityList);
}
}
}
/**
* Save entities
*
* @param array $entityData
*
* @return bool
*/
private function saveEntityFinish(array $entityData): bool
{
if ($entityData) {
$tableName = $this->connection->getTableName(static::TABLE);
$rows = [];
foreach ($entityData as $entityRows) {
foreach ($entityRows as $row) {
$rows[] = $row;
}
}
if ($rows) {
$this->connection->insertOnDuplicate($tableName, $rows, $this->getAvailableColumns());
return true;
}
return false;
}
}
/**
* Delete entities
*
* @param array $entityIds
*
* @return bool
*/
private function deleteEntityFinish(array $entityIds): bool
{
if ($entityIds) {
try {
$this->countItemsDeleted += $this->connection->delete(
$this->connection->getTableName(static::TABLE),
$this->connection->quoteInto(static::ENTITY_ID_COLUMN . ' IN (?)', $entityIds)
);
return true;
} catch (Exception $e) {
return false;
}
}
return false;
}
/**
* Get available columns
*
* @return array
*/
private function getAvailableColumns(): array
{
return $this->validColumnNames;
}
}