Today i am explaining, if you want to created a product in Magento 2 using data patch.
Now, if you want to assign an image to that product, then you can follow the mentioned process:
Firstly you need to manage your image, i.e. you need to move your file from your module folder to media folder.
your image file should be at: /app/code/Webkul/Test/view/base/web/images/test/upload.png
Now add following code in /app/code/Webkul/Test/Setup/Patch/Data/MoveMediaFiles.php
<?php
namespace Webkul\Test\Setup\Patch\Data;
use Magento\Framework\Setup\Patch\DataPatchInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Webkul\Marketplace\Model\ControllersRepository;
use Magento\Framework\App\Filesystem\DirectoryList;
class MoveMediaFiles implements DataPatchInterface
{
/**
* @var ModuleDataSetupInterface $moduleDataSetup
*/
private $moduleDataSetup;
/**
* Construct
*
* @param \Magento\Framework\Filesystem $filesystem
* @param \Magento\Framework\Filesystem\Io\File $file
* @param \Magento\Framework\Module\Dir\Reader $reader
*/
public function __construct(
\Magento\Framework\Filesystem $filesystem,
\Magento\Framework\Filesystem\Io\File $file,
\Magento\Framework\Module\Dir\Reader $reader
) {
$this->filesystem = $filesystem;
$this->file = $file;
$this->reader = $reader;
}
/**
* Do Upgrade
*
* @return void
*/
public function apply()
{
$this->processDefaultImages();
}
/**
* Copy Banner and Icon Images to Media
*/
private function processDefaultImages()
{
$error = false;
try {
$this->createDirectories();
$directory = $this->filesystem->getDirectoryRead(DirectoryList::MEDIA);
$ds = "/";
$baseModulePath = $this->reader->getModuleDir('', 'Webkul_Test');
$mediaDetails = [
"test" => [
"view/base/web/images/test" => [
"upload.png"
]
]
];
foreach ($mediaDetails as $mediaDirectory => $imageDetails) {
foreach ($imageDetails as $modulePath => $images) {
foreach ($images as $image) {
$path = $directory->getAbsolutePath($mediaDirectory);
$mediaFilePath = $path.$ds.$image;
$moduleFilePath = $baseModulePath.$ds.$modulePath.$ds.$image;
if ($this->file->fileExists($mediaFilePath)) {
continue;
}
if (!$this->file->fileExists($moduleFilePath)) {
continue;
}
$this->file->cp($moduleFilePath, $mediaFilePath);
}
}
}
} catch (\Exception $e) {
$error = true;
}
}
/**
* Create default directories
*/
private function createDirectories()
{
$mediaDirectories = ['test'];
foreach ($mediaDirectories as $mediaDirectory) {
$directory = $this->filesystem->getDirectoryRead(DirectoryList::MEDIA);
$path = $directory->getAbsolutePath($mediaDirectory);
if (!$this->file->fileExists($path)) {
$this->file->mkdir($path, 0777, true);
}
}
}
/**
* Get aliases
*/
public function getAliases()
{
return [];
}
/**
* Get dependencies
*/
public static function getDependencies()
{
return [];
}
}
after executing this code your file moved to pub/media/test/upload.png
Now in CreateProduct file, in which you are creating your product, add following code:
<?php
namespace Webkul\Test\Setup\Patch\Data;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\Patch\DataPatchInterface;
use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface;
use Magento\Framework\App\Filesystem\DirectoryList;
class CreateProduct implements DataPatchInterface
{
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $_storeManager;
/**
* @var \Magento\Catalog\Model\ProductFactory
*/
protected $_productFactory;
/**
* @var \Magento\Catalog\Model\Product
*/
protected $_productModel;
/**
* @var Installer
*/
protected $_productType = \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL;
/**
* @var \Magento\Framework\Filesystem
*/
protected $_filesystem;
protected $_objectManager;
/**
* @param ModuleDataSetupInterface $moduleDataSetup
* @param EavSetupFactory $eavSetupFactory
*/
public function __construct(
\Magento\Catalog\Model\Product $productModel,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Catalog\Model\ProductFactory $productFactory,
\Magento\Framework\Filesystem $filesystem,
\Magento\Framework\ObjectManagerInterface $objectManager
) {
$this->productModel = $productModel;
$this->storeManager = $storeManager;
$this->productFactory = $productFactory;
$this->_filesystem = $filesystem;
$this->_objectManager = $objectManager;
}
public function apply()
{
$this->createProduct();
}
public function createProduct(){
$appState = $this->_objectManager->get('Magento\Framework\App\State');
$appState->setAreaCode('adminhtml');
$product = $this->productFactory->create();
$attributeSetId = $this->productModel->getDefaultAttributeSetId();
$product->setStoreId(\Magento\Store\Model\Store::DEFAULT_STORE_ID);
$product->setWebsiteIds([$this->storeManager->getDefaultStoreView()->getWebsiteId()]);
$product->setTypeId('simple');
$product->addData(array(
'name' => 'Sample product',//name of product
'attribute_set_id' => $attributeSetId,
'status' => \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED,
'visibility' => \Magento\Catalog\Model\Product\Visibility::VISIBILITY_NOT_VISIBLE,
'weight' => 1,
'sku' => 'sample_product',//SKU of product
'tax_class_id' => 0,
'description' => 'sample_product',
'short_description' => 'sample_product',
'stock_data' => array( //stock management
'manage_stock' => 1,
'qty' => 999,
'is_in_stock' => 1
)
));
$product->save();
$imagePath = $this->getViewFileUrl().'test/upload.png';
$product->addImageToMediaGallery($imagePath, ['image', 'small_image', 'thumbnail'], false, false);
$product->save();
}
public function getViewFileUrl()
{
return $this->_filesystem
->getDirectoryRead(DirectoryList::MEDIA)
->getAbsolutePath();
}
/**
* Get dependencies
*/
public static function getDependencies()
{
return [];
}
/**
* Get Aliases
*/
public function getAliases()
{
return [];
}
}
After this, your product with an image is created.
I hope this blog will help you with Add Image to a Product Created by Installer in Magento 2. You may also check our wide range of best Magento 2 Extensions.
Please reach out to our team via a support ticket if you have any queries.
Try this and if you have any queries then just comment below 🙂
Be the first to comment.