Saltar al contenido

importar csv personalizado a tabla personalizada – magento 2

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

fácil para su referencia

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

página de importación

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.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *