Magento 2: toodete import välistest allikatest

Magento on e-kaubanduse lahendus, st. on rohkem suunatud toodete müümisele kui müügiga kaasnevale ladustamisele, logistikale või finantsarvestusele. Muud rakendused (näiteks ERP-süsteemid) sobivad paremini kaasnevate rakendustega. Seetõttu tekib Magento kasutamise praktikas üsna sageli ülesanne integreerida pood nende teiste süsteemidega (näiteks 1C).

Üldiselt saab integratsiooni taandada andmete replikatsiooniks järgmiselt.

  • kataloog (tooted, kategooriad);
  • laoandmed (toodete jäägid ladudes ja hinnad);
  • kliendid;
  • tellimused;

Magento pakub andmebaasis andmetega manipuleerimiseks eraldi objektide klassi - hoidlad. Magento eripära tõttu on andmete lisamine andmebaasi hoidlate kaudu lihtne kodeerida, kuid see on, ütleme, aeglane. Selles väljaandes käsitlen toote Magento 2-le programmilise lisamise peamisi etappe klassikalisel viisil - repoklasside abil.

Kliente ja tellimusi kopeeritakse tavaliselt teises suunas – Magentost väliste ERP-süsteemideni. Seetõttu on nendega lihtsam, Magento poolel peate lihtsalt valima sobivad andmed ja seejärel "meie poolelt lendasid välja kuulid"

Andmete andmebaasi salvestamise põhimõtted

Hetkel käib Magentos programmiliselt andmebaasi salvestatud objektide loomine läbi tehas:

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

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

ja andmebaasi kirjutamine toimub läbi Hoidla:

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

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

"Tehase" ja "Hoidla" lähenemisviisi saab kasutada kõigi Magento 2 domeeni suuremate mudelite jaoks.

Toote põhiteave

Vaatan andmestruktuuri, mis vastab Magento 2.3 versioonile. Kõige elementaarsem teave toote kohta on tabelis catalog_product_entity (tooteregister):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Olen piiratud ühe tootetüübiga (type_id='simple'), vaikeatribuutide komplekt (attribute_set_id=4) ja ignoreerida atribuute has_options и required_options. Alates atribuutidest entity_id, created_at и updated_at genereeritakse automaatselt, siis tegelikult peame uue toote lisamiseks lihtsalt seadistama sku. Ma teen seda:

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

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

Lisan päringule toote nime ja saan teate, et atribuut puudub Price. Peale hinna lisamist lisatakse toode 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 selgesõnaliselt märkida, et kasutame andmete importimiseks administratiivset poefassaadi:

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

Täiendavad atribuudid

Täiendavate tooteatribuutide töötlemine Magento abil on nauding. Peamiste olemite EAV andmemudel (vt tabelit eav_entity_type) on selle platvormi üks põhifunktsioone. Lisame lihtsalt tootemudelile sobivad atribuudid:

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

ja mudeli salvestamisel repoobjekti kaudu:

$repoProd->save($prod);

täiendavad atribuudid salvestatakse ka vastavatesse andmebaasi tabelitesse.

Varude andmed

Lihtsamalt öeldes - laos oleva toote kogus. Magento 2.3-s on andmebaasi struktuurid, mis kirjeldavad laoandmete salvestamise vormingut oluliselt erinev sellest, mis varem juhtus. Laos oleva toote koguse lisamine tootemudeli kaudu ei ole aga palju keerulisem kui muude 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

Reeglina erineb meedia tugi kliendile poes (e-kaubandus) sama toote meediatoetusest töötajale sisemises raamatupidamissüsteemis (ERP). Esimesel juhul on soovitatav toodet näost näkku näidata, teisel juhul piisab tootest üldise ettekujutuse andmisest. Vähemalt toote esmase kuvandi ülekandmine on aga üsna tavaline. case andmete importimisel.

Pildi lisamisel administraatori paneeli kaudu salvestatakse pilt esmalt ajutisse kataloogi (./pub/media/tmp/catalog/product) ja alles siis, kui toode teisaldatakse meediumikataloogi (./pub/media/catalog/product). Samuti märgitakse pilt administraatoripaneeli kaudu lisamisel 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);

Mingil põhjusel lingitakse andmekandja alles pärast toote esmakordset salvestamist ja selle uuesti hoidlast allalaadimist. Ja peate määrama atribuudi label toote meediagaleriisse kirje lisamisel (muidu saame erandi Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Kategooria

Sageli võib poe ja taustarakenduse kategooria struktuur või toodete paigutus neis oluliselt erineda. Kategooriate ja nendes olevate toodete andmete üleviimise strateegiad sõltuvad paljudest teguritest. Selles näites jään järgmise juurde:

  • tausta- ja poekategooriaid võrreldakse nime järgi;
  • kui imporditakse kategooria, mida poes pole, siis luuakse see juurkategooria alla (Default Category) ja selle edasist positsioneerimist kaupluse kataloogis eeldatakse käsitsi;
  • toode määratakse kategooriasse alles siis, kui see luuakse poes (esmakordne import);

Põhiteave kategooria kohta on tabelis catalog_category_entity (kategooriate kataloog). Kategooria loomine Magentos:

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

Toote sidumine kategooriaga toimub kategooria ID ja toote SKU abil:

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

Kogusummas

Koodi kirjutamine toote programmiliseks Magento 2-le lisamiseks on üsna lihtne. Olen ühendanud kõik ülaltoodu demomooduliks "flancer32/mage2_ext_demo_import". Moodulis on ainult üks konsoolikäsk fl32:import:prod, mis impordib JSON-failis kirjeldatud tooteid "./etc/data/products.json":

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

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

Selle meetodi abil 10 toote importimiseks kulub minu sülearvutis umbes 10 sekundit. Kui seda ideed edasi arendame, on lihtne jõuda järeldusele, et tunnis saab importida umbes 3600 toodet ja 100 30 toote importimiseks võib kuluda umbes XNUMX tundi. Sülearvuti asendamine serveriga võimaldab olukorda mõnevõrra siluda. Võib-olla isegi mitu korda. Aga mitte suurusjärkude kaupa. Võib-olla on see kiirus ja aeglus mingil määral üks projekti tekkimise põhjusi magento/async-import.

Impordikiiruse suurendamiseks võiks radikaalseks lahenduseks olla otsene sisenemine andmebaasi, kuid sel juhul lähevad kõik Magento laiendatavusega seotud "head" kaotsi - peate kõik "edasijõudnud" ise tegema. Siiski on see seda väärt. Kui see õnnestub, kaalun järgmises artiklis lähenemist otse andmebaasi kirjutamisega.

Allikas: www.habr.com

Lisa kommentaar