Nuestro equipo redactor ha estado horas buscando para darle solución a tus búsquedas, te brindamos la soluciones de modo que nuestro deseo es servirte de mucha ayuda.
Solución:
Nota: Obtengo una explicación muy clara de la opción de importación personalizada desde este enlace
Primero descargue el archivo zip completo de este enlace de github y luego cambie el nombre del módulo según sus requisitos. Basta con modificar los dos archivos para importar su CSV personalizado a una tabla personalizada.
paso 1: alterar aplicación / código / proveedor / nombre_módulo / etc / import.xml desde la carpeta de descarga de github.
paso 2: entonces debería necesitar crear una clase de modelo según se menciona en el archivo import.xml anterior
app / code / vendor / module_name / Model / Import / CustomerGroup.php
'TITLE is empty',
];
protected $_permanentAttributes = [self::ID];
/**
* If we should check column names
*
* @var bool
*/
protected $needColumnCheck = true;
protected $groupFactory;
/**
* Valid column names
*
* @array
*/
protected $validColumnNames = [
self::ID,
self::EVENTNAME,
self::IMGURL,
self::BANNERIMGURL,
self::DESC,
self::LDESC,
self::PLACE,
self::DATE,
self::GIFT,
self::TYPE,
];
/**
* Need to log in import history
*
* @var bool
*/
protected $logInHistory = true;
protected $_validators = [];
/**
* @var MagentoFrameworkStdlibDateTimeDateTime
*/
protected $_connection;
protected $_resource;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
public function __construct(
MagentoFrameworkJsonHelperData $jsonHelper,
MagentoImportExportHelperData $importExportData,
MagentoImportExportModelResourceModelImportData $importData,
MagentoFrameworkAppResourceConnection $resource,
MagentoImportExportModelResourceModelHelper $resourceHelper,
MagentoFrameworkStdlibStringUtils $string,
ProcessingErrorAggregatorInterface $errorAggregator,
MagentoCustomerModelGroupFactory $groupFactory
)
$this->jsonHelper = $jsonHelper;
$this->_importExportData = $importExportData;
$this->_resourceHelper = $resourceHelper;
$this->_dataSourceModel = $importData;
$this->_resource = $resource;
$this->_connection = $resource->getConnection(MagentoFrameworkAppResourceConnection::DEFAULT_CONNECTION);
$this->errorAggregator = $errorAggregator;
$this->groupFactory = $groupFactory;
public function getValidColumnNames()
return $this->validColumnNames;
/**
* Entity type code getter.
*
* @return string
*/
public function getEntityTypeCode()
return 'chennai_event';
/**
* 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 (MagentoImportExportModelImport::BEHAVIOR_DELETE == $this->getBehavior()) empty($rowData[self::ID]))
$this->addRowError(ValidatorInterface::ERROR_TITLE_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 (MagentoImportExportModelImport::BEHAVIOR_DELETE == $this->getBehavior())
$this->deleteEntity();
elseif (MagentoImportExportModelImport::BEHAVIOR_REPLACE == $this->getBehavior())
$this->replaceEntity();
elseif (MagentoImportExportModelImport::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;
/**
* Deletes newsletter subscriber data from raw data.
*
* @return $this
*/
public function deleteEntity()
$listTitle = [];
while ($bunch = $this->_dataSourceModel->getNextBunch())
foreach ($bunch as $rowNum => $rowData)
$this->validateRow($rowData, $rowNum);
if (!$this->getErrorAggregator()->isRowInvalid($rowNum))
$rowTtile = $rowData[self::ID];
$listTitle[] = $rowTtile;
if ($this->getErrorAggregator()->hasToBeTerminated())
$this->getErrorAggregator()->addRowToSkip($rowNum);
if ($listTitle)
$this->deleteEntityFinish(array_unique($listTitle),self::TABLE_Entity);
return $this;
/**
* Save and replace newsletter subscriber
*
* @return $this
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
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_TITLE_IS_EMPTY, $rowNum);
continue;
if ($this->getErrorAggregator()->hasToBeTerminated())
$this->getErrorAggregator()->addRowToSkip($rowNum);
continue;
$rowTtile= $rowData[self::ID];
$listTitle[] = $rowTtile;
$entityList[$rowTtile][] = [
self::ID => $rowData[self::ID],
self::EVENTNAME => $rowData[self::EVENTNAME],
self::IMGURL => $rowData[self::IMGURL],
self::BANNERIMGURL => $rowData[self::BANNERIMGURL],
self::DESC => $rowData[self::DESC],
self::LDESC => $rowData[self::LDESC],
self::PLACE => $rowData[self::PLACE],
self::DATE => $rowData[self::DATE],
self::GIFT => $rowData[self::GIFT],
self::TYPE => $rowData[self::TYPE],
];
if (MagentoImportExportModelImport::BEHAVIOR_REPLACE == $behavior)
if ($listTitle)
if ($this->deleteEntityFinish(array_unique( $listTitle), self::TABLE_Entity))
$this->saveEntityFinish($entityList, self::TABLE_Entity);
elseif (MagentoImportExportModelImport::BEHAVIOR_APPEND == $behavior)
$this->saveEntityFinish($entityList, self::TABLE_Entity);
return $this;
/**
* Save product prices.
*
* @param array $priceData
* @param string $table
* @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::ID,
self::EVENTNAME,
self::IMGURL,
self::BANNERIMGURL,
self::DESC,
self::LDESC,
self::PLACE,
self::DATE,
self::GIFT,
self::TYPE
]);
return $this;
protected function deleteEntityFinish(array $listTitle, $table)
if ($table && $listTitle)
try
$this->countItemsDeleted += $this->_connection->delete(
$this->_connection->getTableName($table),
$this->_connection->quoteInto('customer_group_code IN (?)', $listTitle)
);
return true;
catch (Exception $e)
return false;
else
return false;
Mi estructura de mesa
eso es todo, para cualquier claridad relacionada con esta respuesta, mencione en el comentario.
La respuesta de @Atish Goshwami también es correcta, ¿Por qué estoy actualizado? porque a mi manera pude lograr resultados en veinte minutos, es una manera simple de hacerlo.
Sugeriría extender la funcionalidad de importación predeterminada de Magento 2.
Para hacer eso, registre un nuevo módulo (digamos “Importación personalizada” por ahora)
Crear un module.xml
archivar en app/code/Foo/CustomImport/etc/module.xml
Siguiente crear import.xml
archivar en app/code/Foo/CustomImport/etc/import.xml
La entrada import.xml
agregará una nueva opción en el menú desplegable “Tipo de entidad” de la página de importación (Sistema> Transferencia de datos> Importar)
ahora en el import.xml
los atributos xml:
behaviorModel
: Toma el nombre de la clase de modelo responsable de manejar la lógica de la importación.
label
: Nombre de etiqueta de la opción desplegable
name
: nombre del valor de la opción desplegable
A continuación, necesitamos crear el archivo de modelo en app/code/Foo/CustomImport/Model/Import/CustomPricing.php
class CustomImport extends MagentoImportExportModelImportEntityAbstractEntity
Puede tomar la referencia del Magento_AdvancedPricingImportExport
para ver la lógica de importación.
Primero cree un botón de importación en su archivo de componente de interfaz de usuario
[vendor_name] [module_name] view adminhtml ui_component
uiComponenetFileName.xml
-
-
- add
- Add New
- primary
- */*/add
- 10
-
- import
- Import Storelocatore
- secondary
- */dataimport/importdata
- 20
Ahora, este botón Importar Llamar al formulario de datos de importación
[vendor_name] [module_name] Controller Adminhtml Dataimport
Importdata.php
coreRegistry = $coreRegistry;
public function execute()
$rowData = $this->_objectManager->create('[vendor_name] [module_name] ModelLocator');
$this->coreRegistry->register('row_data', $rowData);
$resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE);
$resultPage->getConfig()->getTitle()->prepend(__('Import Locator Data'));
return $resultPage;
// used for acl.xml
protected function _isAllowed()
return $this->_authorization->isAllowed('[vendor_name]_[module_name]::add_datalocation');
crear un archivo de diseño que llame a su archivo de bloque
[vendor_name] [module_name] view adminhtml layout
[controller_name]_dataimport_importdata.xml
crear un archivo de bloque para el formulario de datos de importación
[vendor_name] [module_name] Block Adminhtml Dataimport
Importdata.php
_coreRegistry = $registry;
parent::__construct($context, $data);
protected function _construct()
$this->_objectId = 'row_id';
$this->_blockGroup = '[module_name]_[vendor_name]';
$this->_controller = 'adminhtml_dataimport';
parent::_construct();
$this->buttonList->remove('back');
$this->buttonList->update('save', 'label', __('Import'));
$this->buttonList->remove('reset');
$this->addButton(
'backhome',
[
'label' => __('Back'),
'on_click' => sprintf("location.href = '%s';", $this->getUrl('[route_name] / [controller_name] /index')),
'class' => 'back',
'level' => -2
]
);
public function getHeaderText()
return __('Import Location Data');
protected function _isAllowedAction($resourceId)
return $this->_authorization->isAllowed($resourceId);
public function getFormActionUrl()
if ($this->hasFormActionUrl())
return $this->getData('form_action_url');
return $this->getUrl('[route_name] / dataimport/save');
el formulario de importación de llamada de archivo anterior
[vendor_name] [module_name] Block Adminhtml Dataimport Edit
Form.php
_assetRepo->getUrl("[vendor_name]_[module_name]::img/[vendor_name]_[module_name]_Sample_File.csv");
$model = $this->_coreRegistry->registry('row_data');
$form = $this->_formFactory->create(
['data' => [
'id' => 'edit_form',
'enctype' => 'multipart/form-data',
'action' => $this->getData('action'),
'method' => 'post'
]
]
);
$form->setHtmlIdPrefix('datalocation_');
$fieldset = $form->addFieldset(
'base_fieldset',
['legend' => __('Import Location '), 'class' => 'fieldset-wide']
);
$importdata_script = $fieldset->addField(
'importdata',
'file',
array(
'label' => 'Upload File',
'required' => true,
'name' => 'importdata',
'note' => 'Allow File type: .csv and .xls',
)
);
$importdata_script->setAfterElementHtml("
Download Sample File
"
);
$form->setValues($model->getData());
$form->setUseContainer(true);
$this->setForm($form);
return parent::_prepareForm();
este formulario de importación verifica si el archivo es válido o no, ahora crea un archivo que lea el archivo cargado e inserte en la tabla.
[vendor_name] [module_name] Controller Adminhtml Dataimport *
Save.php
fileSystem = $fileSystem;
$this->request = $request;
$this->scopeConfig = $scopeConfig;
$this->adapterFactory = $adapterFactory;
$this->uploaderFactory = $uploaderFactory;
public function execute()
if ( (isset($_FILES['importdata']['name'])) && ($_FILES['importdata']['name'] != '') )
try
$uploaderFactory = $this->uploaderFactory->create(['fileId' => 'importdata']);
$uploaderFactory->setAllowedExtensions(['csv', 'xls']);
$uploaderFactory->setAllowRenameFiles(true);
$uploaderFactory->setFilesDispersion(true);
$mediaDirectory = $this->fileSystem->getDirectoryRead(DirectoryList::MEDIA);
$destinationPath = $mediaDirectory->getAbsolutePath('[vendor_name]_[module_name]_IMPORTDATA');
$result = $uploaderFactory->save($destinationPath);
if (!$result)
throw new LocalizedException
(
__('File cannot be saved to path: $1', $destinationPath)
);
else
$imagePath = '[vendor_name]_[module_name]_IMPORTDATA'.$result['file'];
$mediaDirectory = $this->fileSystem->getDirectoryRead(DirectoryList::MEDIA);
$destinationfilePath = $mediaDirectory->getAbsolutePath($imagePath);
/* file read operation */
$f_object = fopen($destinationfilePath, "r");
$column = fgetcsv($f_object);
// column name must be same as the Sample file name
if($f_object)
if( ($column[0] == 'Col_name_1') && ($column[1] == 'Col_name_2') && ($column[2] == 'Col_name_3') && ($column[3] == 'Col_name_4') && ($column[4] == 'Col_name_5') )
$count = 0;
while (($columns = fgetcsv($f_object)) !== FALSE)
$rowData = $this->_objectManager->create('DolphinStorelocatorModelStorelocator');
if($columns[0] != 'Col_name_1')// unique Name like Primary key
$count++;
/// here this are all the Getter Setter Method which are call to set value
// the auto increment column name not used to set value
$rowData->setCol_name_1($columns[1]);
$rowData->setCol_name_2($columns[2]);
$rowData->setCol_name_3($columns[3]);
$rowData->setCol_name_4($columns[4]);
$rowData->setCol_name_5($columns[5]);
$rowData->save();
$this->messageManager->addSuccess(__('A total of %1 record(s) have been Added.', $count));
$this->_redirect('[route_name]/[controller_name]/index');
else
$this->messageManager->addError(__("invalid Formated File"));
$this->_redirect('[route_name]/dataimport/importdata');
else
$this->messageManager->addError(__("File hase been empty"));
$this->_redirect('[route_name]/dataimport/importdata');
catch (Exception $e)
$this->messageManager->addError(__($e->getMessage()));
$this->_redirect('[controller_name]/dataimport/importdata');
else
$this->messageManager->addError(__("Please try again."));
$this->_redirect('[controller_name]/dataimport/importdata');
Ahora puede hacer clic en el botón Importar y cargar el archivo .csv e importar datos.
Espero que esto te ayude.
Si te gustó nuestro trabajo, tienes el poder dejar una división acerca de qué le añadirías a este enunciado.