Magento 2: toodete import vÀlistest allikatest

Magento on e-kaubanduse lahendus, mis on rohkem suunatud toodete mĂŒĂŒgile kui sellega seotud laondus-, logistika- vĂ”i rahanduse haldamisele. Nende ĂŒlesannete tegemiseks sobivad paremini teised rakendused (nĂ€iteks ERP-sĂŒsteemid). SeetĂ”ttu tekib Magento kasutamisel ĂŒsna tihti vajadus kaupluse integreerimiseks nende teiste sĂŒsteemidega (nĂ€iteks 1C-ga).

Suuresti saab integreerimise vÀhendada andmete replikatsiooniks jÀrgmistele:

  • kataloogile (tooted, kategooriad);
  • inventariandmetele (toodete jÀÀgid laos ja hinnad);
  • klientidele;
  • tellimustele;

Magento pakub andmete manustamiseks andmebaasis eraldi objektiklassi — hoidlad. Magento spetsiifika tĂ”ttu on andmete lisamine andmebaasi repodega suhteliselt kooditav, kuid toimub, ĂŒtleme nii, mitte vĂ€ga kiiresti. Selles publikatsioonis kĂ€sitlen Magento 2-s toote „klassikalise” lisamise pĂ”hietappe — kasutades repo klasse.

Kliente ja tellimusi replitakse tavaliselt teise suunda — Magento’st vĂ€liste ERP-sĂŒsteemide juurde. SeetĂ”ttu on nendega lihtsam, Magento poolel tuleb lihtsalt valida vastavad andmed ja edasi — “meie poolt tulid kuulid vĂ€lja«.

Andmete salvestamise pÔhimÔtted

Praegu tehakse salvestatavate objektide loomine programmilisel viisil Magento-s lÀbi Factory:

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

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

ja andmebaasi kirjutamine toimub lÀbi Repository:

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

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

„Factory” ja „Repository” lĂ€henemist saab rakendada kĂ”igi peamiste mudelite puhul Magento 2 teema valdkonnas.

Toote pÔhiteave

KÀsitlen andmestruktuuri, mis vastab versioonile Magento 2.3. KÔige pÔhjalikum 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

Piirdun ĂŒhe tootetĂŒĂŒbiga (type_id='simple'), vaikimisi atribuutide kogumiga (attribute_set_id=4) ja jĂ€tn silma alt attribuudid has_options ja required_options. Kuna atribuudid entity_id, created_at ja updated_at genereeritakse automaatselt, piisab, et uue toote lisamiseks tuleb lihtsalt mÀÀrata sku. Teen 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 tÔrke:

Atribuudi "Toote nimi" vÀÀrtus on tĂŒhi. MÀÀrake atribuut ja proovige uuesti.

Lisab tootele nime ja saan teate, et atribuut on puudu Hind. PĂ€rast 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 varchar-attribuutide tabelisse (catalog_product_entity_varchar), hind — tabelisse catalog_product_entity_decimal. Enne toote lisamist on soovitatav selgelt nĂ€idata, et kasutame andmete toimetamiseks haldusteenust:

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

TĂ€iendavad atribuudid

TĂ€iendavate tooteatribuutide töötlemine Magento abil on tĂ”eline nauding. EAV-andmemudel peamiste ĂŒksuste jaoks (vt tabelit eav_entity_type) — on ĂŒks selle platvormi vĂ”tmeomadusi. Lihtsalt lisame vastavad atribuudid toote mudelisse:

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

ja mudeli salvestamisel kaudu repo-objekti:

$repoProd->save($prod);

tÀiendavad atribuudid salvestatakse ka vastavatesse andmebaasi tabelitesse.

Inventariandmed

Lihtsalt öeldes — toote kogus laos. Magento 2.3-s kirjeldavad andmebaasi struktuurid, mis kĂ€sitlevad inventariandmete salvestamise formaati, on mĂ€rkimisvÀÀrselt erinevad selle eelkĂ€ijast. Siiski, laos oleva toote arvu 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 toetamine kliendi jaoks poes (e-kaubandus) sama toote meedia toetamisest töötaja jaoks sise-ERP sĂŒsteemis. Esimeses juhul on soovitatav nĂ€idata "kaupa nĂ€oga", teises — piisab, kui anda toote kohta ĂŒldine ĂŒlevaade. Siiski, vĂ€hemalt algse toote pildi edastamine on ĂŒsna levinud case andmete importimisel.

Pildi lisamisel administraatoris salvestatakse pilt esmalt ajutisse katalooge (./pub/media/tmp/catalog/product) ja alles toote salvestamisel liigub see meedia katalooge (./pub/media/catalog/product). Samuti, pildi lisamisel administreerimise kaudu mÀÀratakse pildile sildid 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);

Miks on meedia seotav alles toote eelneva salvestamise ja selle uuesti repo-st saamise jÀrel? Ja atribuut tuleb mÀÀrata label toote meediagalerii kirje lisamisel (vastasel juhul saame erandi MÀÀramata indeks: label faili .../module-catalog/Model/Product/Gallery/CreateHandler.php real 516).

Kategooriad

Sageli vÔib poe kategooriate struktuur ja taustarakenduse vahel erineda mÀrkimisvÀÀrselt. Kategooriate ja neis olevate toodete andmete edastamise strateegiad sÔltuvad paljusid teguritest. KÀesolevas nÀites jÀrgnen jÀrgmisele:

  • taustarakenduse ja poe kategooriad vastavad nime jĂ€rgi;
  • kui imporditakse kategooria, mida poes ei ole, siis luuakse see juurkategooria alla (Default Category) ja selle edasine positsioneerimine poe kataloogis on ette nĂ€htud kĂ€sitsi;
  • toote sidumine kategooriaga toimub ainult toote loomisel poes (esimese impordi korral);

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 sidumine kategooriaga toimub kategooria ID ja toote SKU pÔhjal:

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

KokkuvÔttes

Koodi kirjutamine toote lisamiseks Magento 2-s programmiliselt ei ole keeruline. KĂ”ik eelnevalt vĂ€ljendatu olen kokku vĂ”tnud demomodulis «flancer32/mage2_ext_demo_import«. Moodulis on ainult ĂŒks konsooli kĂ€sk fl32:import:prod, mis impordib tooteid, 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 importimise aeg antud viisil on umbes 10 sekundit minu sĂŒlearvutil. Kui seda mĂ”tet edasi arendada, siis on lihtne jĂ€reldada, et tunnis vĂ”ib importida umbes 3600 toodet ja 100K toote importimiseks vĂ”ib kuluda umbes 30 tundi. SĂŒlearvuti asendamine serveriga vĂ”ib olukorda oluliselt parandada. VĂ”ib-olla isegi mitu korda. Kuid mitte jĂ€rjest. Ehkki see kiirus vĂ”ib mingil mÀÀral olla ĂŒks pĂ”hjusi projekti tekkimiseks magento/async-import.

Otsene kirjutamine andmebaasi vĂ”ib olla radikaalne lahendus importimise kiirusel, kuid sel juhul kaotatakse kĂ”ik Magento laiendatavuse eelised — tuleb kĂ”ik „laiendatud“ ise teha. Sellegipoolest vÀÀrt seda. Kui vĂ”imalik, siis kaalun jĂ€rgmises artiklis lĂ€henemist, kus andmebaasi kirjutatakse otse.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster