Magento 2: Воридоти маҳсулот аз манбаъҳои беруна

Magento як ҳалли тиҷорати электронӣ аст, яъне. назар ба анбор, логистика ё баҳисобгирии молиявии ҳамроҳи фурӯш бештар ба фурӯши маҳсулот нигаронида шудааст. Барномаҳои дигар (масалан, системаҳои ERP) барои замимаҳои ҳамроҳ мувофиқтаранд. Аз ин рӯ, аксар вақт дар таҷрибаи истифодаи Magento вазифаи ҳамгироии мағоза бо ин системаҳои дигар (масалан, 1C) ба миён меояд.

Умуман, ҳамгироиро метавон ба нусхабардории маълумот тавассути:

  • каталог (маҳсулот, категорияҳо);
  • маълумот дар бораи инвентаризатсия (бақияи маҳсулот дар анборҳо ва нархҳо);
  • мизоҷон;
  • фармоишҳо;

Magento як синфи алоҳидаи объектҳоро барои коркарди маълумот дар пойгоҳи додаҳо пешниҳод мекунад - анборҳо. Бо назардошти хусусиятҳои 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);

Номи маҳсулот дар ҷадвали атрибутҳои varchar маҳсулот нигоҳ дошта мешавад (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 махсулот овардан мумкин аст ва барои воридоти 100 хазор махсулот кариб 30 соат вакт лозим аст. Иваз кардани ноутбук бо сервер ба шумо имкон медиҳад, ки вазъиятро то андозае ҳал кунед. Шояд ҳатто якчанд маротиба. Аммо на бо фармоиши бузург. Шояд хамин суръату сустй то андозае яке аз сабабхои ба вучуд омадани лоиха бошад magento/assync-импорт.

Ҳалли радикалӣ барои баланд бардоштани суръати воридот метавонад воридшавии мустақим ба пойгоҳи додаҳо бошад, аммо дар ин ҳолат ҳама "хубҳо" дар бораи васеъшавии Magento гум мешаванд - шумо бояд ҳама "пешрафтро" худатон иҷро кунед. Бо вуҷуди ин, он меарзад. Агар ин кор кунад, ман равишро бо навиштани мустақим ба пойгоҳи додаҳо дар мақолаи навбатӣ баррасӣ хоҳам кард.

Манбаъ: will.com

Илова Эзоҳ