Magento 2: ٻاهرين ذريعن مان پراڊڪٽس درآمد ڪرڻ

Magento هڪ اي ڪامرس حل آهي، يعني. وڌيڪ مقصد آهي پراڊڪٽس وڪڻڻ جي ڀيٽ ۾ گودام، رسد يا مالياتي اڪائونٽنگ سان گڏ سيلز. ٻيون ايپليڪيشنون (مثال طور، ERP سسٽم) گڏوگڏ ايپليڪيشنن لاءِ بهتر آهن. تنهن ڪري، اڪثر ڪري Magento استعمال ڪرڻ جي مشق ۾ انهن ٻين سسٽم سان گڏ اسٽور کي ضم ڪرڻ جو ڪم (مثال طور، 1C) پيدا ٿئي ٿو.

وڏي ۽ وڏي، انضمام کي گھٽائي سگھجي ٿو ڊيٽا جي نقل ۾:

  • catalog (پراڊڪٽس، زمرا)؛
  • انوینٽري ڊيٽا (گودامن ۽ قيمتن ۾ پيداوار جي بيلنس)؛
  • گراهڪ؛
  • حڪم؛

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.

درآمد جي رفتار کي وڌائڻ لاءِ بنيادي حل ڊيٽابيس ۾ سڌي طرح داخل ٿي سگھي ٿو، پر ھن صورت ۾ Magento جي توسيع جي حوالي سان سڀ ”سامان“ گم ٿي ويا آھن - توھان کي سڀ ڪجھ ڪرڻو پوندو پاڻ کي ”ترقي“. بهرحال، اهو ان جي قابل آهي. جيڪڏهن اهو ڪم ڪري ٿو، آئون ايندڙ مضمون ۾ ڊيٽابيس ڏانهن سڌو لکڻ جي طريقي سان غور ڪندس.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو