0

What are the steps included in adding a custom field "Csv upload" in custom module into magento admin & then on upload process some data in controller ?

Any thoughts ?

asked Mar 24, 2021 at 5:09
1
  • any thoughts ??? Commented Mar 24, 2021 at 6:52

1 Answer 1

1

First create a Import Button in your Ui-component File vendor_name\module_name\view\adminhtml\ui_component uiComponenetFileName.xml

<?xml version="1.0" encoding="UTF-8"?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Ui/etc/ui_configuration.xsd">
 <!-- main part of the grid -->
 <argument name="data" xsi:type="array">
 <!-- define date source -->
 <item name="js_config" xsi:type="array">
 <item name="provider" xsi:type="string">locator_record_locator_list.locator_record_locator_list_data_source</item>
 <item name="deps" xsi:type="string">locator_record_locator_list.locator_record_locator_list_data_source</item>
 </item>
 <!-- for columns -->
 <item name="spinner" xsi:type="string">locator_records_columns</item>
 <!-- for Add new record button -->
 <item name="buttons" xsi:type="array">
 <item name="add" xsi:type="array">
 <item name="name" xsi:type="string">add</item>
 <item name="label" xsi:type="string" translate="true">Add New Location</item>
 <item name="class" xsi:type="string">primary</item>
 <item name="url" xsi:type="string">*/*/addlocation</item>
 <item name="sortOrder" xsi:type="number">10</item>
 </item>
 <item name="import" xsi:type="array">
 <item name="name" xsi:type="string">import</item>
 <item name="label" xsi:type="string" translate="true">Import Locatore</item>
 <item name="class" xsi:type="string">secondary</item>
 <item name="url" xsi:type="string">*/dataimport/importdata</item>
 <item name="sortOrder" xsi:type="number">20</item>
 </item>
 <item name="export" xsi:type="array">
 <item name="name" xsi:type="string">export</item>
 <item name="label" xsi:type="string" translate="true">Export locatore</item>
 <item name="class" xsi:type="string">secondary</item>
 <item name="url" xsi:type="string">*/*/exportdata</item>
 <item name="sortOrder" xsi:type="number">30</item>
 </item>
 </item>
 </argument>

Now this Import Button Call Import Data Form vendor_name\module_name\Controller\Adminhtml\Dataimport Importdata.php

<?php
namespace [vendor_name]\ [module_name] \Controller\Adminhtml\Dataimport;
use Magento\Framework\Controller\ResultFactory;
class Importdata extends \Magento\Backend\App\Action
{
 private $coreRegistry;
 public function __construct(
 \Magento\Backend\App\Action\Context $context,
 \Magento\Framework\Registry $coreRegistry
 ) { 
 parent::__construct($context);
 $this->coreRegistry = $coreRegistry;
 }
 public function execute()
 {
 $rowData = $this->_objectManager->create('[vendor_name] \ [module_name] \Model\Locator');
 $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');
 }
}

create a Layout File which Call your Block File [vendor_name] \ [module_name] \view\adminhtml\layout [controller_name]_dataimport_importdata.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
 <body>
 <referenceContainer name="content">
 <block class="[vendor_name] \ [module_name] \Block\Adminhtml\Dataimport\Importdata" name="importdata_locator" />
 </referenceContainer>
 </body>
</page>

create a block File for Import Data Form [vendor_name] \ [module_name] \Block\Adminhtml\Dataimport Importdata.php

<?php 
namespace [vendor_name] \ [module_name] \Block\Adminhtml\Dataimport;
class Importdata extends \Magento\Backend\Block\Widget\Form\Container
{
 protected $_coreRegistry = null;
 public function __construct(
 \Magento\Backend\Block\Widget\Context $context,
 \Magento\Framework\Registry $registry,
 array $data = []
 ) {
 $this->_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');
 }
}

the above file call import form [vendor_name] \ [module_name] \Block\Adminhtml\Dataimport\Edit Form.php

<?php
namespace [vendor_name] \ [module_name] \Block\Adminhtml\Dataimport\Edit;
use Magento\Framework\View\Asset\Repository; 
class Form extends \Magento\Backend\Block\Widget\Form\Generic
{
 protected $_assetRepo;
 public function __construct(
 \Magento\Backend\Block\Template\Context $context,
 \Magento\Framework\Registry $registry,
 \Magento\Framework\Data\FormFactory $formFactory,
 \Magento\Framework\View\Asset\Repository $assetRepo,
 array $data = []
 ) { 
 parent::__construct($context, $registry, $formFactory, $data);
 }
 protected function _prepareForm()
 { 
 $path = $this->_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(" 
 <span id='sample-file-span' ><a id='sample-file-link' href='".$path."' >Download Sample File</a></span>
 <script type=\"text/javascript\">
 document.getElementById('[route_name]_importdata').onchange = function () { 
 var fileInput = document.getElementById('[route_name]_importdata');
 var filePath = fileInput.value;
 var allowedExtensions = /(\.csv|\.xls)$/i; 
 if(!allowedExtensions.exec(filePath))
 {
 alert('Please upload file having extensions .csv or .xls only.');
 fileInput.value = '';
 }
 };
 </script>"
 );
 $form->setValues($model->getData());
 $form->setUseContainer(true);
 $this->setForm($form);
 return parent::_prepareForm();
 }
}

[vendor_name] \ [module_name] \Controller\Adminhtml\Dataimport* Save.php

<?php
namespace [vendor_name]\[module_name]\Controller\Adminhtml\Dataimport;
use Magento\Backend\App\Action;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Filesystem;
use Magento\MediaStorage\Model\File\UploaderFactory;
use Magento\Framework\Image\AdapterFactory;
use Magento\Store\Model\ScopeInterface; 
class Save extends \Magento\Backend\App\Action
{
 protected $fileSystem;
 protected $uploaderFactory;
 protected $request;
 protected $adapterFactory;
 public function __construct(
 \Magento\Backend\App\Action\Context $context,
 \Magento\Framework\Filesystem $fileSystem,
 \Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory,
 \Magento\Framework\App\RequestInterface $request,
 \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
 AdapterFactory $adapterFactory
 ) {
 parent::__construct($context);
 $this->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('Dolphin\Storelocator\Model\Storelocator');
 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');
 }
 }
}
answered Mar 24, 2021 at 7:06
2

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.