Magento 2: tuotteiden tuonti ulkopuolisista lähteistä

Magento on verkkokaupparatkaisu, ts. on enemmän suunnattu tuotteiden myyntiin kuin varastointiin, logistiikkaan tai myyntiin liittyvään talouslaskentaan. Muut sovellukset (esim. ERP-järjestelmät) sopivat paremmin oheissovelluksiin. Siksi Magentoa käytettäessä melko usein syntyy tehtävä integroida myymälä näihin muihin järjestelmiin (esimerkiksi 1C).

Yleisesti ottaen integrointi voidaan vähentää tietojen replikointiin seuraavilla tavoilla:

  • luettelo (tuotteet, luokat);
  • varastotiedot (tuotesaldot varastoissa ja hinnat);
  • asiakkaat;
  • tilaukset;

Magento tarjoaa erillisen objektiluokan tietokannan tietojen käsittelyyn - arkistot. Magenton erityispiirteistä johtuen tietojen lisääminen tietokantaan arkiston kautta on helppo koodata, mutta se on sanotaanko hidasta. Tässä julkaisussa käsittelen tuotteen ohjelmallisen lisäämisen Magento 2:een "klassisella" tavalla - repo-luokkien avulla.

Asiakkaat ja tilaukset kopioidaan yleensä toiseen suuntaan - Magentosta ulkoisiin ERP-järjestelmiin. Siksi heidän kanssaan on yksinkertaisempaa, Magento-puolella sinun tarvitsee vain valita sopivat tiedot ja sitten "luodit lensivät meidän puoleltamme".

Tietojen tallentamisen periaatteet tietokantaan

Tällä hetkellä tietokantaan tallennettujen objektien luominen ohjelmallisesti Magentoon on tehty läpi Tehdas:

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

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

ja tietokantaan kirjoittaminen tapahtuu säilytyspaikka:

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

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

"Tehdas"- ja "Arkisto"-lähestymistapoja voidaan käyttää kaikissa Magento 2 -alueen tärkeimmissä malleissa.

Tuotteen perustiedot

Tarkastelen tietorakennetta, joka vastaa Magento 2.3 -versiota. Perustiedot tuotteesta ovat taulukossa catalog_product_entity (tuoterekisteri):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Olen rajoitettu yhden tyyppiseen tuotteeseen (type_id='simple'), joukko oletusmääritteitä (attribute_set_id=4) ja ohita määritteet has_options и required_options. Attribuuteista lähtien entity_id, created_at и updated_at luodaan automaattisesti, niin itse asiassa, jos haluat lisätä uuden tuotteen, meidän on vain asetettava sku. Teen näin:

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

ja saan poikkeuksen:

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

Lisään tuotteen nimen pyyntöön ja saan viestin, että määrite puuttuu Price. Hinnan lisäämisen jälkeen tuote lisätään tietokantaan:

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

Tuotteen nimi tallennetaan tuotteen varchar-määritetaulukkoon (catalog_product_entity_varchar), hinta - taulukossa catalog_product_entity_decimal. Ennen tuotteen lisäämistä on suositeltavaa ilmoittaa selvästi, että käytämme tietojen tuontiin hallinnollista julkisivua:

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

Lisäattribuutit

Muiden tuotemääritteiden käsittely Magenton avulla on ilo. EAV-tietomalli pääyksiköille (katso taulukko eav_entity_type) on yksi tämän alustan tärkeimmistä ominaisuuksista. Lisäämme vain sopivat attribuutit tuotemalliin:

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

ja tallennettaessa mallia repo-objektin kautta:

$repoProd->save($prod);

lisäattribuutteja tallennetaan myös vastaaviin tietokantataulukoihin.

Varastotiedot

Yksinkertaisesti sanottuna - tuotteen määrä varastossa. Magento 2.3:ssa varastotietojen tallennusmuotoa kuvaavat tietokannan rakenteet ovat merkittävästi erilainen siitä, mitä aiemmin tapahtui. Varastossa olevan tuotteen määrän lisääminen tuotemallin kautta ei kuitenkaan ole paljon vaikeampaa kuin muiden ominaisuuksien lisääminen:

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

Tiedotusvälineet

Pääsääntöisesti mediatuki tuotteelle kaupassa olevalle asiakkaalle (verkkokauppa) eroaa mediatuesta samalle tuotteelle työntekijälle sisäisessä kirjanpitojärjestelmässä (ERP). Ensimmäisessä tapauksessa on suositeltavaa näyttää tuote kasvotusten, toisessa riittää antamaan yleinen käsitys tuotteesta. Ainakin tuotteen ensisijaisen kuvan siirtäminen on kuitenkin melko yleistä. case tietoja tuodessaan.

Kun lisäät kuvan hallintapaneelin kautta, kuva tallennetaan ensin väliaikaiseen hakemistoon (./pub/media/tmp/catalog/product) ja vain tallennettaessa tuote siirretään mediahakemistoon (./pub/media/catalog/product). Lisäksi, kun kuva lisätään hallintapaneelin kautta, se merkitään 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);

Jostain syystä media linkitetään vasta, kun tuote on ensin tallennettu ja haettu uudelleen arkistosta. Ja sinun on määritettävä attribuutti label kun lisäät merkintää tuotteen mediagalleriaan (muuten saamme poikkeuksen Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Категории

Usein kaupan ja taustasovelluksen kategoriarakenne tai tuotteiden sijoittelu niissä voi vaihdella merkittävästi. Strategiat luokkien ja niiden sisältämien tuotteiden tietojen siirtämiseksi riippuvat monista tekijöistä. Tässä esimerkissä pidän kiinni seuraavista:

  • tausta- ja kauppaluokkia verrataan nimellä;
  • jos tuodaan luokka, joka ei ole kaupassa, se luodaan juurikategorian alle (Default Category) ja sen lisäsijainti myymäläluetteloon oletetaan manuaalisesti;
  • tuote liitetään luokkaan vain, kun se on luotu myymälässä (ensimmäinen tuonti);

Luokan perustiedot ovat taulukossa catalog_category_entity (luokkien luettelo). Luokan luominen Magentoon:

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

Tuotteen linkittäminen kategoriaan tapahtuu luokkatunnuksella ja tuotteen SKU:lla:

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

Yhteensä

Koodin kirjoittaminen tuotteen lisäämiseksi ohjelmallisesti Magento 2:een on melko helppoa. Olen yhdistänyt kaiken edellä mainitun demomoduuliksi "flancer32/mage2_ext_demo_import". Moduulissa on vain yksi konsolikomento fl32:import:prod, joka tuo JSON-tiedostossa kuvatut tuotteet "./etc/data/products.json":

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

Tuontikuvat ovat luettelossa ./etc/data/img.

Aika tuoda 10 tuotetta tällä menetelmällä on noin 10 sekuntia kannettavassani. Jos tätä ideaa kehitetään edelleen, on helppo päätyä siihen, että tunnissa voidaan tuoda noin 3600 tuotetta ja 100 30 tuotteen tuonti voi kestää noin XNUMX tuntia. Kannettavan tietokoneen korvaaminen palvelimella auttaa tasoittamaan tilannetta jonkin verran. Ehkä jopa useita kertoja. Mutta ei suuruusluokkaa. Ehkä tämä nopeus ja hitaus on jossain määrin yksi syy hankkeen syntymiseen magento/async-import.

Radikaalinen ratkaisu tuonnin nopeuden lisäämiseen voisi olla suora pääsy tietokantaan, mutta tässä tapauksessa kaikki Magenton laajennettavuuden "hyvuudet" menetetään - sinun on tehtävä kaikki "edistynyt" itse. Se on kuitenkin sen arvoista. Jos se onnistuu, harkitsen seuraavassa artikkelissa lähestymistapaa kirjoittamalla suoraan tietokantaan.

Lähde: will.com

Lisää kommentti