Magento 2: toodete importimine välisest allikast

Magento on e-kaubanduse lahendus, mis tähendab, et see on rohkem suunatud toodete müümisele kui müügiga seotud laovarude, logistika või finantsarvestuse haldamisele. Müügiga seotud ülesannete jaoks sobivad paremini teised rakendused (nt ERP-süsteemid). Seetõttu tekib sageli Magento kasutamisel vajadus poe integreerimiseks nende teiste süsteemidega (nt 1C).

Üldiselt saab integreerimise kokku võtta andmete replitseerimisega järgmistes valdkondades:

  • kataloog (tooted, kategooriad);
  • investeeringuandmed (toodete laoseisud ja hinnad);
  • klientide andmed;
  • tellimused;

Magento pakub andmete haldamiseks andmebaasis eraldi objektiklassi — repositoriis. Magento spetsiifika tõttu on andmete lisamine andmebaasi kaudu reposteerimise kaudu kergesti kodeeritav, kuid see toimub, ütleme, mitte väga kiiresti. Selles artiklis käsitlen peamisi etappe toote "klassikalise" lisamise kohta Magento 2-s, kasutades repoklasse.

Kliendid ja tellimused replitseeruvad tavaliselt teises suunas — Magento-st väliste ERP-süsteemide poole. Seetõttu on nende haldamine lihtsam: Magento-s tuleb lihtsalt valida соответствующие данные, edasi — "meie poolelt tulistamata«.

Andmete salvestamise põhimõtted andmebaasi

Sel hetkel luuakse Magento-s salvestatavad objektid programmeerimise teel Tehase:

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

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

ja andmebaasi salvestamine – läbi Repository:

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

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

Lähtekoht koos "Tehase" ja "Repository" kasutamisega sobib kasutada kõigi põhimudelite jaoks Magento 2 valdkonnas.

Toote põhiteave

Ma vaatan andmestruktuuri vastavalt Magento 2.3 versioonile. Kõige olulisem teave toote kohta asub tabelis catalog_product_entity (toodete register):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Olen piiratud ühe toote tüübiga (type_id='simple'), vaikeatribuutide kogumiga (attribute_set_id=4) ja ignoreerin atribuute has_options ja required_options. Kuna atribuudid entity_id, created_at ja updated_at genereeritakse automaatselt, siis on tegelikult meie jaoks uue toote lisamiseks piisav määrata sku. Teen seda nii:

/** @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 erandi:

Toote "Nimi" atribuut on tühi. Määrake atribuut ja proovige uuesti.

Lisaan päringusse toote nime ja saan teate, et atribuut on puudu Hind. Pärast hinna lisamist toode talletatakse andmebaasi:

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

Toote nimi salvestatakse toote varchar-atribuutide tabelisse (catalog_product_entity_varchar), hind — tabelis catalog_product_entity_decimal. Enne toote lisamist on soovitatav selgelt märkida, et kasutame andmete importimiseks haldusliidese:

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

Lisatribuutid

Lisatribuutide töötlemine Magento vahenditega on tõeline nauding. EAV-andmemudel põhisiseste üksuste jaoks (vt tabelit eav_entity_type) — see on üks platvormi võtmeelemente. Lihtsalt lisame vastavad atribuudid toote mudelile:

$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// või
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);

ja mudeli salvestamisel läbi repo-objekti:

$repoProd->save($prod);

lisatribuutid salvestatakse ka vastavates andmebaasi tabelites.

Laoseisu andmed

Lihtsalt öeldes — toote kogus laos. Magento 2.3 andmebaasis, mis kirjeldab inventeerimisandmete salvestamise formaati, on märgatavalt erinev eelmistest. Siiski, toote koguse lisamine toote mudeli kaudu ei ole palju keerulisem kui teiste atribuutide lisamine:

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

Meedia

Üldiselt erineb toote meedia kaasamine klientidele e-poes toote meedia kaasamisest selle sama toote jaoks ettevõtte sisemises raamatupidamissüsteemis (ERP). Esimeses juhul on soovitatav näidata „kaupu silmitsi“, teises on piisav anda üldine ülevaade tootest. Siiski, vähemalt algse toote pildi üleviimine on piisavalt levinud case andmete importimisel.

Kui pilt lisatakse administraatori kaudu, salvestatakse see esmalt ajutisse katalooge (./pub/media/tmp/catalog/product) ning alles toote salvestamisel viiakse see meediakatalooge (./pub/media/catalog/product). Samuti, kui lisatakse administraatori kaudu, määratakse pildile sildid pilt, 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);

Mediad ei laadita alla, kui pole eelnevalt salvestatud tooteid ja neid uuesti reposiitrist saadud. Samuti tuleb märkida atribuut silt toote meediagaleriisse kirje lisamisel (vastasel juhul saame erandi Määratlemata indeks: label failis .../module-catalog/Model/Product/Gallery/CreateHandler.php, rida 516).

Kategooriad

Kaupluse kategooriate struktuur ja backend- rakenduse struktuur või toodete paigutus nendes võivad sageli erineda. Kategooriad ja nende toodete andmete siirdamise strateegiad sõltuvad paljuski mitmest tegurist. Selles näites järgnen järgmisele:

  • backend’i ja kaupluse kategooriad vastandatakse nime järgi;
  • kui imporditakse kategooria, mida poes pole, siis luuakse see peamise kategooria alla (Vaikimisi kategooria) ja selle edasine positsioneerimine kaupluse kataloogis eeldab käsitsi seadistamist;
  • toote seondamine kategooriaga toimub ainult toote loomise hetkel poes (esimese impordi ajal);

Kategooria põhiteave asub tabelis catalog_category_entity (kategooriate kataloog). Kategooria loomine Magento's:

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

Toote seondamine kategooriaga toimub kategooria ID ja toote SKU järgi:

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

Kokku

Magento 2-sse toote lisamine koodi kaudu on üsna lihtne. Kõik eelnevas esitatu koondasin demomoodulisse „flancer32/mage2_ext_demo_import„. Moodulis on ainult üks käsurea käsk fl32:import:prod, mis impordib tooted, mis on kirjeldatud JSON-failis „./etc/data/products.json«:

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

Imporditavad pildid asuvad kataloogis ./etc/data/img.

Kümne toote impordiks kulub sel moel umbes 10 sekundit minu sülearvutis. Kui seda mõtet edasi arendada, siis on lihtne järeldada, et tunni jooksul võib impordida umbes 3600 toodet ja 100K toote impordiks võib kuluda umbes 30 tundi. Sülearvuti asendamine serveriga võimaldab olukorda mõnevõrra leevendada. Võib-olla isegi mitmekordselt. Kuid mitte kordades. Tõenäoliselt on see aeglane kiirus mingil määral ka üks põhjuseid, miks projekt magento/async-import.

Otsustav lahendus importimise kiirusest parandamiseks võib olla otsene kirjutamine andmebaasi, kuid sel juhul kaovad kõik Magento laiendatavuse eelised — tuleb kõik 'laiendatud' ise teha. Siiski on see seda väärt. Kui see õnnestub, kaalun otsese andmebaasi kirjutamise lähenemist järgmises artiklis.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster