Magento 2: Kuagiza Bidhaa kutoka Vyanzo vya Nje

Magento ni suluhisho la e-commerce, i.e. inalenga zaidi kuuza bidhaa kuliko kuhifadhi ghala, vifaa au uhasibu wa kifedha unaoambatana na mauzo. Programu zingine (kwa mfano, mifumo ya ERP) zinafaa zaidi kwa programu zinazoambatana. Kwa hiyo, mara nyingi kabisa katika mazoezi ya kutumia Magento kazi ya kuunganisha duka na mifumo hii mingine (kwa mfano, 1C) hutokea.

Kwa ujumla, ujumuishaji unaweza kupunguzwa hadi urudiaji wa data kwa:

  • katalogi (bidhaa, kategoria);
  • data ya hesabu (mizani ya bidhaa katika maghala na bei);
  • wateja;
  • maagizo;

Magento inatoa darasa tofauti la vitu kwa kudanganya data kwenye hifadhidata - hazina. Kwa sababu ya maelezo maalum ya Magento, kuongeza data kwenye hifadhidata kupitia hazina ni rahisi kuweka nambari, lakini ni, wacha tuseme, polepole. Katika chapisho hili, ninazingatia hatua kuu za kuongeza bidhaa kwa utaratibu kwa Magento 2 kwa njia ya "classic" - kwa kutumia madarasa ya repo.

Wateja na maagizo kwa kawaida huigwa kwa upande mwingine - kutoka Magento hadi mifumo ya ERP ya nje. Kwa hivyo, ni rahisi nao, kwa upande wa Magento unahitaji tu kuchagua data inayofaa, na kisha "risasi ziliruka kutoka upande wetu".

Kanuni za kurekodi data kwenye hifadhidata

Kwa sasa, kuunda vitu vilivyohifadhiwa kwenye hifadhidata kwa utaratibu katika Magento hufanywa kupitia Kiwanda:

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

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

na kuandika kwa hifadhidata hufanywa kupitia Repository:

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

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

Mbinu ya "Kiwanda" na "Hazina" inaweza kutumika kwa miundo yote kuu katika kikoa cha Magento 2.

Taarifa ya Msingi ya Bidhaa

Ninaangalia muundo wa data unaolingana na toleo la Magento 2.3. Habari ya msingi zaidi juu ya bidhaa iko kwenye jedwali catalog_product_entity (Usajili wa bidhaa):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Nina kikomo kwa aina moja ya bidhaa (type_id='simple'), seti ya sifa chaguo-msingi (attribute_set_id=4) na kupuuza sifa has_options ΠΈ required_options. Tangu sifa entity_id, created_at ΠΈ updated_at huzalishwa kiatomati, basi, kwa kweli, ili kuongeza bidhaa mpya, tunahitaji tu kuweka sku. Mimi hufanya hivi:

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

na ninapata ubaguzi:

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

Ninaongeza jina la bidhaa kwenye ombi na kupata ujumbe kwamba sifa haipo Price. Baada ya kuongeza bei, bidhaa huongezwa kwenye hifadhidata:

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

Jina la bidhaa limehifadhiwa kwenye jedwali la sifa za varchar (catalog_product_entity_varchar), bei - kwenye meza catalog_product_entity_decimal. Kabla ya kuongeza bidhaa, inashauriwa kuashiria kwa uwazi kwamba tunatumia eneo la mbele la duka la msimamizi kuagiza data:

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

Sifa za Ziada

Kuchakata sifa za ziada za bidhaa kwa kutumia Magento ni raha. Mfano wa data wa EAV kwa vyombo kuu (tazama jedwali eav_entity_type) ni mojawapo ya vipengele muhimu vya jukwaa hili. Tunaongeza tu sifa zinazofaa kwa mfano wa bidhaa:

$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// ΠΈΠ»ΠΈ
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);

na wakati wa kuhifadhi mfano kupitia kitu cha repo:

$repoProd->save($prod);

sifa za ziada pia zitahifadhiwa katika jedwali za hifadhidata zinazolingana.

Data ya hesabu

Kwa maneno rahisi - kiasi cha bidhaa katika hisa. Katika Magento 2.3, miundo katika hifadhidata inayoelezea umbizo la kuhifadhi data ya hesabu ni tofauti kwa kiasi kikubwa kutoka kwa kile kilichotokea hapo awali. Walakini, kuongeza idadi ya bidhaa kwenye hisa kupitia muundo wa bidhaa sio ngumu zaidi kuliko kuongeza sifa zingine:

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

Vyombo vya habari

Kama sheria, usaidizi wa media kwa bidhaa kwa mteja katika duka (e-commerce) hutofautiana na usaidizi wa media kwa bidhaa sawa kwa mfanyakazi katika mfumo wa uhasibu wa ndani (ERP). Katika kesi ya kwanza, inashauriwa kuonyesha bidhaa uso kwa uso; katika pili, inatosha kutoa wazo la jumla la bidhaa. Hata hivyo, kuhamisha angalau picha ya msingi ya bidhaa ni kawaida kabisa. case wakati wa kuingiza data.

Wakati wa kuongeza picha kupitia paneli ya msimamizi, picha huhifadhiwa kwanza kwenye saraka ya muda (./pub/media/tmp/catalog/product) na tu wakati kuhifadhi bidhaa kuhamishwa hadi saraka ya media (./pub/media/catalog/product) Pia, inapoongezwa kupitia paneli ya msimamizi, picha imetambulishwa 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);

Kwa sababu fulani, media imeunganishwa tu baada ya kwanza kuhifadhi bidhaa na kuirudisha kutoka kwa hazina tena. Na unahitaji kutaja sifa label wakati wa kuongeza kiingilio kwenye ghala ya media ya bidhaa (vinginevyo tunapata ubaguzi Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Jamii

Mara nyingi, muundo wa kitengo cha duka na matumizi ya nyuma au uwekaji wa bidhaa ndani yao unaweza kutofautiana sana. Mikakati ya kuhamisha data kuhusu aina na bidhaa ndani yao inategemea mambo mengi. Katika mfano huu ninashikamana na yafuatayo:

  • kategoria za nyuma na duka zinalinganishwa na jina;
  • ikiwa kategoria imeingizwa ambayo haiko kwenye duka, basi imeundwa chini ya kategoria ya mizizi (Default Category) na nafasi yake zaidi katika orodha ya duka inachukuliwa kwa mikono;
  • bidhaa imepewa kikundi tu wakati imeundwa kwenye duka (kuagiza kwanza);

Taarifa ya msingi kuhusu kategoria iko kwenye jedwali catalog_category_entity (orodha ya kategoria). Kuunda kategoria katika Magento:

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

Kuunganisha bidhaa kwa kategoria hufanywa kwa kutumia Kitambulisho cha kategoria na SKU ya bidhaa:

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

Katika jumla ya

Kuandika nambari ya kuongeza bidhaa kiprogramu kwa Magento 2 ni rahisi sana. Nimechanganya kila kitu kilichotajwa hapo juu kuwa moduli ya onyesho "flancer32/mage2_ext_demo_import". Kuna amri moja tu ya koni kwenye moduli fl32:import:prod, ambayo huingiza bidhaa zilizoelezewa katika faili ya JSON "./etc/data/products.json":

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

Picha za kuagiza ziko kwenye orodha ./etc/data/img.

Wakati wa kuagiza bidhaa 10 kwa kutumia njia hii ni kama sekunde 10 kwenye kompyuta yangu ndogo. Tukiendeleza wazo hili zaidi, ni rahisi kufikia hitimisho kwamba takriban bidhaa 3600 zinaweza kuagizwa kutoka nje kwa saa, na inaweza kuchukua kama saa 100 kuagiza bidhaa 30K. Kubadilisha kompyuta ndogo na seva hukuruhusu kurekebisha hali hiyo kwa kiasi fulani. Labda hata mara kadhaa. Lakini si kwa amri za ukubwa. Pengine kasi na ucheleweshaji huu kwa kiasi fulani ni moja ya sababu za kuibuka kwa mradi huo magento/async-kuagiza.

Suluhisho kali la kuongeza kasi ya uagizaji inaweza kuwa kuingia moja kwa moja kwenye hifadhidata, lakini katika kesi hii "vizuri" vyote kuhusu upanuzi wa Magento vimepotea - itabidi ufanye kila kitu "kimaendeleo" mwenyewe. Hata hivyo, ni thamani yake. Ikiwa itafanikiwa, nitazingatia mbinu hiyo kwa uandishi wa moja kwa moja kwa hifadhidata katika makala inayofuata.

Chanzo: mapenzi.com

Kuongeza maoni