I am new in magento 2
I am trying to import product data programmatically using csv file.
The Error is shown below
My Folder and code structure are following.
This is My registration file.
Vendor/Modulename/regis.xml
use MagentoFrameworkComponentComponentRegistrar;
ComponentRegistrar::register(ComponentRegistrar::MODULE, 'vendorName_moduleName', __DIR__);
This is my module.xml file
Vendor/Modulename/etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="VendoreName_ModuleName" setup_version="1.0.0"></module>
</config>
This is cron script file Crontab.php
Vendor/Modulename/etc/crontab.xml
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
<group id="importproduct">
<job instance="VendorNameModuleNameCronTest" method="execute" name="VendorName_ModuleName_cron">
<schedule>5 0 26 8 4</schedule>
</job>
</group>
</config>
This is cron script file Test.php
Vendor/Modulename/Cron/Test.php
Class Test{
$file = fopen('var/import/new.csv', 'r', '"'); // set path to the CSV file
if ($file !== false) {
require __DIR__ . '/app/bootstrap.php';
$bootstrap = MagentoFrameworkAppBootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get('MagentoFrameworkAppState');
$state->setAreaCode('adminhtml');
// used for updating product stock - and it's important that it's inside the while loop
$stockRegistry = $objectManager->get('MagentoCatalogInventoryApiStockRegistryInterface');
// add logging capability
$header = fgetcsv($file); // get data headers and skip 1st row
// enter the min number of data fields you require that the new product will have (only if you want to standardize the import)
$required_data_fields = 3;
while ( $row = fgetcsv($file, 3000, ",") ) {
$data_count = count($row);
if ($data_count < 1) {
continue;
}
// used for setting the new product data
$product = $objectManager->create('MagentoCatalogModelProduct');
$data = array();
$data = array_combine($header, $row);
$sku = $data['sku'];
if ($data_count < $required_data_fields) {
$logger->info("Skipping product sku " . $sku . ", not all required fields are present to create the product.");
continue;
}
$name = $data['name'];
$description = $data['description'];
$shortDescription = $data['short_description'];
$qty = trim($data['qty']);
$price = trim($data['price']);
try {
$product->setTypeId('simple') // type of product you're importing
->setStatus(1) // 1 = enabled
->setAttributeSetId(4) // In Magento 2.2 attribute set id 4 is the Default attribute set (this may vary in other versions)
->setName($name)
->setSku($sku)
->setPrice($price)
->setTaxClassId(0) // 0 = None
->setCategoryIds(array(2, 3)) // array of category IDs, 2 = Default Category
->setDescription($description)
->setShortDescription($shortDescription)
->setUrlKey($url_key) // you don't need to set it, because Magento does this by default, but you can if you need to
->setWebsiteIds(array(1)) // Default Website ID
->setStoreId(0) // Default store ID
->setVisibility(4) // 4 = Catalog & Search
->save();
} catch (Exception $e) {
$logger->info('Error importing product sku: '.$sku.'. '.$e->getMessage());
continue;
}
try {
$stockItem = $stockRegistry->getStockItemBySku($sku);
if ($stockItem->getQty() != $qty) {
$stockItem->setQty($qty);
if ($qty > 0) {
$stockItem->setIsInStock(1);
}
$stockRegistry->updateStockItemBySku($sku, $stockItem);
}
} catch (Exception $e) {
$logger->info('Error importing stock for product sku: '.$sku.'. '.$e->getMessage());
continue;
}
unset($product);
}
fclose($file);
}
}