Magento 2: mewnforio cynhyrchion o ffynonellau allanol

Mae Magento yn ddatrysiad e-fasnach, h.y. wedi'i anelu'n fwy at werthu cynhyrchion nag at warysau, logisteg neu gyfrifon ariannol sy'n cyd-fynd â gwerthiannau. Mae cymwysiadau eraill (er enghraifft, systemau ERP) yn fwy addas ar gyfer ceisiadau cysylltiedig. Felly, yn aml iawn yn yr arfer o ddefnyddio Magento mae'r dasg o integreiddio storfa gyda'r systemau eraill hyn (er enghraifft, 1C) yn codi.

Ar y cyfan, gellir lleihau integreiddio i atgynhyrchu data trwy:

  • catalog (cynhyrchion, categorïau);
  • data rhestr eiddo (cydbwysedd cynnyrch mewn warysau a phrisiau);
  • cleientiaid;
  • gorchmynion;

Mae Magento yn cynnig dosbarth ar wahân o wrthrychau ar gyfer trin data yn y gronfa ddata - storfeydd. Oherwydd manylion Magento, mae ychwanegu data i'r gronfa ddata trwy gadwrfeydd yn hawdd i'w godio, ond mae'n araf, gadewch i ni ddweud. Yn y cyhoeddiad hwn, rwy'n ystyried y prif gamau o ychwanegu cynnyrch yn rhaglennol at Magento 2 yn y ffordd “glasurol” - gan ddefnyddio dosbarthiadau repo.

Mae cwsmeriaid ac archebion fel arfer yn cael eu hailadrodd i'r cyfeiriad arall - o Magento i systemau ERP allanol. Felly, mae'n symlach gyda nhw, ar ochr Magento does ond angen i chi ddewis y data priodol, ac yna “hedfanodd bwledi allan o'n hochr".

Egwyddorion cofnodi data i gronfa ddata

Ar hyn o bryd, mae creu gwrthrychau sydd wedi'u cadw yn y gronfa ddata yn rhaglennol yn Magento yn cael ei wneud ffatri:

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

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

ac ysgrifennu i'r gronfa ddata yn cael ei wneud drwy Repository:

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

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

Gellir defnyddio'r dull "Factory" a "Repository" ar gyfer pob model mawr ym mharth Magento 2.

Gwybodaeth Cynnyrch Sylfaenol

Rwy'n edrych ar strwythur data sy'n cyd-fynd â fersiwn Magento 2.3. Mae'r wybodaeth fwyaf sylfaenol am y cynnyrch yn y tabl catalog_product_entity (cofrestrfa cynnyrch):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Rwy'n gyfyngedig i un math o gynnyrch (type_id='simple'), set o briodoleddau diofyn (attribute_set_id=4) ac anwybyddu priodoleddau has_options и required_options. Ers y priodoleddau entity_id, created_at и updated_at yn cael eu cynhyrchu'n awtomatig, yna, mewn gwirionedd, i ychwanegu cynnyrch newydd, mae angen i ni osod sku. Rwy'n gwneud hyn:

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

ac rwy'n cael eithriad:

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

Rwy'n ychwanegu enw'r cynnyrch at y cais ac yn cael neges bod y priodoledd ar goll Price. Ar ôl ychwanegu'r pris, caiff y cynnyrch ei ychwanegu at y gronfa ddata:

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

Mae enw'r cynnyrch yn cael ei storio yn y tabl priodoledd varchar cynnyrch (catalog_product_entity_varchar), pris - yn y tabl catalog_product_entity_decimal. Cyn ychwanegu cynnyrch, fe'ch cynghorir i nodi'n benodol ein bod yn defnyddio'r blaen siop weinyddol i fewnforio data:

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

Rhinweddau Ychwanegol

Mae prosesu priodoleddau cynnyrch ychwanegol gan ddefnyddio Magento yn bleser. Model data EAV ar gyfer y prif endidau (gweler y tabl eav_entity_type) yw un o nodweddion allweddol y platfform hwn. Yn syml, rydym yn ychwanegu'r priodoleddau priodol i'r model cynnyrch:

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

ac wrth arbed y model trwy'r gwrthrych repo:

$repoProd->save($prod);

bydd priodoleddau ychwanegol hefyd yn cael eu storio yn y tablau cronfa ddata cyfatebol.

Data rhestr

Yn syml - faint o gynnyrch mewn stoc. Yn Magento 2.3, mae strwythurau yn y gronfa ddata sy'n disgrifio'r fformat ar gyfer storio data rhestr eiddo sylweddol wahanol o'r hyn a ddigwyddodd o'r blaen. Fodd bynnag, nid yw ychwanegu maint cynnyrch mewn stoc trwy'r model cynnyrch yn llawer anoddach nag ychwanegu priodoleddau eraill:

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

Cyfryngau

Fel rheol, mae cefnogaeth y cyfryngau ar gyfer cynnyrch i gleient mewn siop (e-fasnach) yn wahanol i gefnogaeth y cyfryngau ar gyfer yr un cynnyrch i weithiwr mewn system gyfrifo fewnol (ERP). Yn yr achos cyntaf, fe'ch cynghorir i ddangos y cynnyrch wyneb yn wyneb; yn yr ail, mae'n ddigon i roi syniad cyffredinol o'r cynnyrch. Fodd bynnag, mae trosglwyddo delwedd sylfaenol cynnyrch o leiaf yn eithaf cyffredin. case wrth fewnforio data.

Wrth ychwanegu delwedd trwy'r panel gweinyddol, mae'r ddelwedd yn cael ei chadw gyntaf mewn cyfeiriadur dros dro (./pub/media/tmp/catalog/product) a dim ond pan fydd arbed y cynnyrch yn cael ei symud i'r cyfeiriadur cyfryngau (./pub/media/catalog/product). Hefyd, pan gaiff ei ychwanegu trwy'r panel gweinyddol, mae'r ddelwedd yn cael ei thagio 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);

Am ryw reswm, dim ond ar ôl arbed y cynnyrch yn gyntaf a'i adfer o'r ystorfa eto y caiff y cyfryngau eu cysylltu. Ac mae angen i chi nodi'r priodoledd label wrth ychwanegu cofnod i'r oriel cyfryngau cynnyrch (fel arall cawn eithriad Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Категории

Yn aml, gall strwythur categori'r siop a'r cymhwysiad backend neu leoliad cynhyrchion ynddynt amrywio'n sylweddol. Mae strategaethau ar gyfer mudo data am gategorïau a chynhyrchion sydd ynddynt yn dibynnu ar lawer o ffactorau. Yn yr enghraifft hon rwy'n cadw at y canlynol:

  • mae categorïau backend a storfa yn cael eu cymharu yn ôl enw;
  • os mewnforir categori nad yw yn y storfa, yna caiff ei greu o dan y categori gwraidd (Default Category) a thybir ei leoliad pellach yng nghatalog y storfa â llaw;
  • mae cynnyrch yn cael ei neilltuo i gategori dim ond pan gaiff ei greu yn y storfa (mewnforio cyntaf);

Mae gwybodaeth sylfaenol am y categori yn y tabl catalog_category_entity (catalog o gategorïau). Creu categori yn Magento:

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

Mae cysylltu cynnyrch â chategori yn cael ei wneud gan ddefnyddio ID y categori a SKU cynnyrch:

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

Yn gyfan gwbl

Mae ysgrifennu cod i ychwanegu cynnyrch yn rhaglennol at Magento 2 yn eithaf hawdd. Rwyf wedi cyfuno popeth a nodir uchod mewn modiwl demo “fflansiwr32/mage2_ext_demo_import" . Dim ond un gorchymyn consol sydd yn y modiwl fl32:import:prod, sy'n mewnforio'r cynhyrchion a ddisgrifir yn y ffeil JSON "./etc/data/products.json":

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

Mae lluniau i'w mewnforio yn y catalog ./etc/data/img.

Yr amser i fewnforio 10 cynnyrch gan ddefnyddio'r dull hwn yw tua 10 eiliad ar fy ngliniadur. Os byddwn yn datblygu'r syniad hwn ymhellach, mae'n hawdd dod i'r casgliad y gellir mewnforio tua 3600 o gynhyrchion yr awr, a gall gymryd tua 100 awr i fewnforio cynhyrchion 30K. Mae gosod gweinydd yn lle gliniadur yn caniatáu ichi lyfnhau rhywfaint ar y sefyllfa. Efallai hyd yn oed sawl gwaith. Ond nid trwy orchmynion maint. Efallai mai'r cyflymder a'r arafwch hwn i ryw raddau yw un o'r rhesymau dros ymddangosiad y prosiect magento/async-mewnforio.

Gallai datrysiad radical i gynyddu cyflymder mewnforio fod yn fynediad uniongyrchol i'r gronfa ddata, ond yn yr achos hwn mae'r holl “nwyddau” ynghylch estynadwyedd Magento yn cael eu colli - bydd yn rhaid i chi wneud popeth “uwch” eich hun. Fodd bynnag, mae'n werth chweil. Os bydd yn gweithio allan, byddaf yn ystyried y dull gydag ysgrifennu uniongyrchol i'r gronfa ddata yn yr erthygl nesaf.

Ffynhonnell: hab.com

Ychwanegu sylw