Magento 2: بیرونی ذرائع سے مصنوعات درآمد کرنا

Magento ایک ای کامرس حل ہے، یعنی گودام، لاجسٹکس یا مالیاتی اکاؤنٹنگ کے ساتھ فروخت کے مقابلے میں مصنوعات کی فروخت کا مقصد زیادہ ہے۔ دیگر ایپلیکیشنز (مثال کے طور پر، ERP سسٹمز) ساتھ والی ایپلی کیشنز کے لیے زیادہ موزوں ہیں۔ لہذا، اکثر Magento کو استعمال کرنے کی مشق میں ان دوسرے سسٹمز (مثال کے طور پر، 1C) کے ساتھ اسٹور کو مربوط کرنے کا کام پیدا ہوتا ہے۔

بڑے پیمانے پر، انضمام کو ڈیٹا کی نقل میں کم کیا جا سکتا ہے:

  • کیٹلاگ (مصنوعات، زمرہ جات)؛
  • انوینٹری ڈیٹا (گوداموں اور قیمتوں میں پروڈکٹ بیلنس)؛
  • گاہکوں؛
  • احکامات؛

Magento ڈیٹا بیس میں ڈیٹا کو ہیرا پھیری کرنے کے لیے اشیاء کی ایک الگ کلاس پیش کرتا ہے۔ ذخیرے. میگینٹو کی خصوصیات کی وجہ سے، ریپوزٹریز کے ذریعے ڈیٹا بیس میں ڈیٹا شامل کرنا کوڈ کرنا آسان ہے، لیکن آئیے کہتے ہیں کہ یہ سست ہے۔ اس اشاعت میں، میں ریپو کلاسز کا استعمال کرتے ہوئے - "کلاسک" طریقے سے Magento 2 میں پروڈکٹ کو پروگرام کے مطابق شامل کرنے کے اہم مراحل پر غور کرتا ہوں۔

صارفین اور آرڈرز کو عام طور پر دوسری سمت میں نقل کیا جاتا ہے - Magento سے بیرونی ERP سسٹمز تک۔ لہذا، یہ ان کے ساتھ آسان ہے، Magento کی طرف آپ کو صرف مناسب ڈیٹا کو منتخب کرنے کی ضرورت ہے، اور پھر "گولیاں ہماری طرف سے اڑ گئیں۔".

ڈیٹا بیس میں ڈیٹا ریکارڈ کرنے کے اصول

اس وقت، Magento میں پروگرام کے مطابق ڈیٹا بیس میں محفوظ کردہ اشیاء کی تخلیق اس کے ذریعے کی جاتی ہے۔ فیکٹری:

function __construct (MagentoCmsModelBlockFactory $blockFactory) {
    $this->blockFactory = $blockFactory;
}

/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();

اور ڈیٹا بیس پر لکھنا اس کے ذریعے کیا جاتا ہے۔ ذخیرہ:

function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
    $this->blockRepo = $blockRepo;
}

$this->blockRepo->save($block);

Magento 2 ڈومین کے تمام بڑے ماڈلز کے لیے "فیکٹری" اور "ریپوزٹری" کا طریقہ استعمال کیا جا سکتا ہے۔

مصنوعات کی بنیادی معلومات

میں ایک ڈیٹا ڈھانچہ دیکھ رہا ہوں جو Magento 2.3 ورژن سے میل کھاتا ہے۔ مصنوعات کے بارے میں سب سے بنیادی معلومات ٹیبل میں ہے۔ catalog_product_entity (مصنوعات کی رجسٹری):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

میں ایک قسم کی مصنوعات تک محدود ہوں (type_id='simple') پہلے سے طے شدہ صفات کا ایک مجموعہ (attribute_set_id=4) اور صفات کو نظر انداز کریں۔ has_options и required_options. صفات کے بعد سے entity_id, created_at и updated_at خود کار طریقے سے پیدا ہوتے ہیں، پھر، حقیقت میں، ایک نئی مصنوعات کو شامل کرنے کے لئے، ہمیں صرف سیٹ کرنے کی ضرورت ہے sku. میں یہ کرتا ہوں:

/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);

اور مجھے ایک استثنا ملتا ہے:

The "Product Name" attribute value is empty. Set the attribute and try again.

میں درخواست میں پروڈکٹ کا نام شامل کرتا ہوں اور ایک پیغام ملتا ہوں کہ انتساب غائب ہے۔ Price. قیمت شامل کرنے کے بعد، مصنوعات کو ڈیٹا بیس میں شامل کیا جاتا ہے:

$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);

پروڈکٹ کا نام پروڈکٹ ورچر انتساب جدول میں محفوظ ہے (catalog_product_entity_varchar)، قیمت - میز میں catalog_product_entity_decimal. کسی پروڈکٹ کو شامل کرنے سے پہلے، یہ واضح طور پر بتانا مناسب ہے کہ ہم ڈیٹا درآمد کرنے کے لیے انتظامی اسٹور فرنٹ استعمال کر رہے ہیں:

/** @var MagentoStoreModelStoreManagerInterface $manStore */
$manStore->setCurrentStore(0);

اضافی صفات

Magento کا استعمال کرتے ہوئے اضافی مصنوعات کی خصوصیات پر کارروائی کرنا خوشی کی بات ہے۔ اہم اداروں کے لیے EAV ڈیٹا ماڈل (ٹیبل دیکھیں eav_entity_type) اس پلیٹ فارم کی اہم خصوصیات میں سے ایک ہے۔ ہم صرف پروڈکٹ ماڈل میں مناسب صفات شامل کرتے ہیں:

$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// или
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);

اور ریپو آبجیکٹ کے ذریعے ماڈل کو محفوظ کرتے وقت:

$repoProd->save($prod);

اضافی اوصاف بھی متعلقہ ڈیٹا بیس ٹیبلز میں محفوظ کیے جائیں گے۔

انوینٹری ڈیٹا

سادہ الفاظ میں - اسٹاک میں مصنوعات کی مقدار. Magento 2.3 میں، ڈیٹا بیس میں ڈھانچے جو انوینٹری ڈیٹا کو ذخیرہ کرنے کے فارمیٹ کی وضاحت کرتے ہیں نمایاں طور پر مختلف اس سے پہلے کیا ہوا. تاہم، پروڈکٹ ماڈل کے ذریعے اسٹاک میں پروڈکٹ کی مقدار کو شامل کرنا دیگر صفات کو شامل کرنے سے زیادہ مشکل نہیں ہے:

/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
    'is_in_stock' => true,
    'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);

میڈیا

ایک اصول کے طور پر، اسٹور (ای کامرس) میں کسی کلائنٹ کے لیے پروڈکٹ کے لیے میڈیا سپورٹ اندرونی اکاؤنٹنگ سسٹم (ERP) میں ملازم کے لیے اسی پروڈکٹ کے لیے میڈیا سپورٹ سے مختلف ہے۔ پہلی صورت میں، پروڈکٹ کو آمنے سامنے دکھانے کا مشورہ دیا جاتا ہے؛ دوسری صورت میں، پروڈکٹ کا عمومی خیال دینا کافی ہے۔ تاہم، کم از کم کسی پروڈکٹ کی بنیادی تصویر کو منتقل کرنا کافی عام ہے۔ case ڈیٹا درآمد کرتے وقت۔

ایڈمن پینل کے ذریعے تصویر شامل کرتے وقت، تصویر کو پہلے ایک عارضی ڈائریکٹری میں محفوظ کیا جاتا ہے (./pub/media/tmp/catalog/product) اور صرف اس صورت میں جب پروڈکٹ کو محفوظ کرنا میڈیا ڈائرکٹری میں منتقل کیا جاتا ہے (./pub/media/catalog/product)۔ اس کے علاوہ، جب ایڈمن پینل کے ذریعے شامل کیا جاتا ہے، تو تصویر کو ٹیگ کیا جاتا ہے۔ image, small_image, thumbnail, swatch_image.

/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogModelProductGalleryCreateHandler $hndlGalleryCreate */
/* $imagePath = '/path/to/file.png';  $imagePathRelative = '/f/i/file.png' */
$imagePathRelative = $this->imagePlaceToTmpMedia($imagePath);
/* reload product with gallery data */
$product = $repoProd->get($sku);
/* add image to product's gallery */
$gallery['images'][] = [
    'file' => $imagePathRelative,
    'media_type' => 'image'
    'label' => ''
];
$product->setData('media_gallery', $gallery);
/* set usage areas */
$product->setData('image', $imagePathRelative);
$product->setData('small_image', $imagePathRelative);
$product->setData('thumbnail', $imagePathRelative);
$product->setData('swatch_image', $imagePathRelative);
/* create product's gallery */
$hndlGalleryCreate->execute($product);

کسی وجہ سے، میڈیا پہلے پروڈکٹ کو محفوظ کرنے اور اسے دوبارہ ذخیرہ سے بازیافت کرنے کے بعد ہی منسلک ہوتا ہے۔ اور آپ کو خصوصیت کی وضاحت کرنے کی ضرورت ہے۔ label پروڈکٹ میڈیا گیلری میں اندراج شامل کرتے وقت (بصورت دیگر ہمیں ایک استثنا ملتا ہے۔ Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

زمرہ جات

اکثر، اسٹور کی قسم کی ساخت اور بیک اینڈ ایپلی کیشن یا ان میں مصنوعات کی جگہ کا تعین نمایاں طور پر مختلف ہوسکتا ہے۔ ان کے اندر موجود زمرہ جات اور مصنوعات کے بارے میں ڈیٹا کو منتقل کرنے کی حکمت عملی بہت سے عوامل پر منحصر ہے۔ اس مثال میں میں مندرجہ ذیل پر قائم ہوں:

  • پسدید اور اسٹور کیٹیگریز کا موازنہ نام سے کیا جاتا ہے۔
  • اگر کوئی زمرہ درآمد کیا جاتا ہے جو اسٹور میں نہیں ہے، تو اسے جڑ کے زمرے کے تحت بنایا جاتا ہے (Default Category) اور اسٹور کیٹلاگ میں اس کی مزید پوزیشننگ کو دستی طور پر فرض کیا جاتا ہے۔
  • کسی پروڈکٹ کو کسی زمرے میں صرف اس وقت تفویض کیا جاتا ہے جب اسے اسٹور میں بنایا جاتا ہے (پہلی درآمد)؛

زمرہ کے بارے میں بنیادی معلومات ٹیبل میں موجود ہیں۔ catalog_category_entity (زمرے کا کیٹلاگ)۔ Magento میں ایک زمرہ بنانا:

/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);

کسی پروڈکٹ کو زمرہ سے جوڑنا زمرہ ID اور پروڈکٹ SKU کا استعمال کرتے ہوئے کیا جاتا ہے:

/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);

مجموعی طور پر

Magento 2 میں پروگرام کے مطابق پروڈکٹ شامل کرنے کے لیے کوڈ لکھنا کافی آسان ہے۔ میں نے اوپر بیان کردہ ہر چیز کو ڈیمو ماڈیول میں جوڑ دیا ہے۔flancer32/mage2_ext_demo_import" ماڈیول میں صرف ایک کنسول کمانڈ ہے۔ fl32:import:prod، جو JSON فائل میں بیان کردہ مصنوعات کو درآمد کرتا ہے "./etc/data/products.json":

[
  {
    "sku": "...",
    "name": "...",
    "desc": "...",
    "desc_short": "...",
    "price": ...,
    "qty": ...,
    "categories": ["..."],
    "image_path": "..."
  }
]

درآمد کے لیے تصاویر کیٹلاگ میں ہیں۔ ./etc/data/img.

اس طریقہ کو استعمال کرتے ہوئے 10 مصنوعات درآمد کرنے کا وقت میرے لیپ ٹاپ پر تقریباً 10 سیکنڈ ہے۔ اگر ہم اس خیال کو مزید ترقی دیتے ہیں، تو اس نتیجے پر پہنچنا آسان ہے کہ فی گھنٹہ تقریباً 3600 مصنوعات درآمد کی جا سکتی ہیں، اور 100K مصنوعات درآمد کرنے میں تقریباً 30 گھنٹے لگ سکتے ہیں۔ لیپ ٹاپ کو سرور سے تبدیل کرنا آپ کو کسی حد تک صورتحال کو ہموار کرنے کی اجازت دیتا ہے۔ شاید کئی بار بھی۔ لیکن شدت کے حکم سے نہیں۔ شاید یہ رفتار اور سست روی کسی حد تک اس منصوبے کے ابھرنے کی ایک وجہ ہو magento/async-import.

درآمد کی رفتار کو بڑھانے کا ایک بنیادی حل ڈیٹا بیس میں براہ راست داخلہ ہوسکتا ہے، لیکن اس معاملے میں میگینٹو کی توسیع پذیری سے متعلق تمام "سامان" ضائع ہو گئے ہیں - آپ کو سب کچھ "اعلی درجے" خود کرنا پڑے گا۔ تاہم، یہ اس کے قابل ہے. اگر یہ کام کرتا ہے تو، میں اگلے مضمون میں ڈیٹا بیس پر براہ راست تحریر کے ساتھ نقطہ نظر پر غور کروں گا۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں