میګینټو 2: د بهرنیو سرچینو څخه د محصولاتو واردول

میګینټو د ای کامرس حل دی ، i.e. د پلور سره د ګودامونو، لوژستیک یا مالي حساب ورکولو په پرتله د محصولاتو پلورلو ډیر هدف دی. نور غوښتنلیکونه (د مثال په توګه، د ERP سیسټمونه) د غوښتنلیکونو سره یوځای کولو لپاره غوره دي. له همدې امله ، ډیری وختونه د میګینټو کارولو په تمرین کې د دې نورو سیسټمونو سره د پلورنځي مدغم کولو دنده رامینځته کیږي (د مثال په توګه ، 1C).

په لویه کچه، ادغام د معلوماتو نقل کولو ته کم کیدی شي:

  • کتلاګ (محصولات، کټګورۍ)؛
  • د موجوداتو معلومات (په ګودامونو او نرخونو کې د محصول بیلانس)؛
  • مشتریان
  • امرونه

میګینټو په ډیټابیس کې د معلوماتو مینځلو لپاره د شیانو جلا ټولګي وړاندیز کوي - ذخیره. د میګینټو ځانګړتیاو له امله ، د ذخیره کولو له لارې ډیټابیس ته د معلوماتو اضافه کول کوډ کول اسانه دي ، مګر دا دی ، راځئ چې ووایو ، ورو. پدې خپرونه کې ، زه په برنامه توګه د میګینټو 2 کې د محصول اضافه کولو اصلي مرحلې په پام کې نیسم په "کلاسیک" طریقه - د ریپو ټولګیو په کارولو سره.

پیرودونکي او امرونه معمولا په بل لوري کې نقل شوي - له میګینټو څخه بهرني ERP سیسټمونو ته. له همدې امله ، دا د دوی سره ساده دی ، د میګینټو اړخ کې تاسو اړتیا لرئ مناسب معلومات غوره کړئ ، او بیا "ګولۍ زموږ له خوا څخه راوتلې".

په ډیټابیس کې د معلوماتو ثبتولو اصول

په اوس وخت کې، په ډیټابیس کې خوندي شوي توکي په میګینټو کې د پروګرام له لارې ترسره کیږي د فابریکې:

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);

د میګینټو 2 ډومین کې د ټولو لوی ماډلونو لپاره د "فابریکې" او "ذخیرې" طریقه کارول کیدی شي.

د محصول بنسټیز معلومات

زه د ډیټا جوړښت ته ګورم چې د میګینټو 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);

د محصول نوم د محصول varchar خاصیت جدول کې زیرمه شوی (catalog_product_entity_varchar)، قیمت - په جدول کې catalog_product_entity_decimal. د محصول اضافه کولو دمخه ، دا مشوره ورکول کیږي چې په واضح ډول وښیې چې موږ د معلوماتو واردولو لپاره اداري پلورنځي کاروو:

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

اضافي صفات

د میګینټو په کارولو سره د اضافي محصول ځانګړتیاو پروسس کول د خوښۍ خبره ده. د اصلي ادارو لپاره د EAV ډیټا ماډل (جدول وګورئ eav_entity_type) د دې پلیټ فارم یو له مهمو ځانګړتیاو څخه دی. موږ په ساده ډول د محصول ماډل ته مناسب ځانګړتیاوې اضافه کوو:

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

او کله چې موډل د ریپو اعتراض له لارې خوندي کړئ:

$repoProd->save($prod);

اضافي صفات به هم په اړوند ډیټابیس جدولونو کې زیرمه شي.

د انوینٹری ډاټا

په ساده شرایطو کې - په سټاک کې د محصول مقدار. په میګینټو 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 (د کټګوریو کتلاګ). په میګینټو کې د کټګورۍ رامینځته کول:

/** @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);

ټول

میګینټو 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

Add a comment