Magento 2: Uvoz proizvoda iz vanjskih izvora

Magento je rješenje za e-trgovinu, tj. je više usmjerena na prodaju proizvoda nego na skladištenje, logistiku ili financijsko računovodstvo koje prati prodaju. Druge aplikacije (na primjer, ERP sustavi) bolje su prilagođene pratećim aplikacijama. Stoga se vrlo često u praksi korištenja Magenta pojavljuje zadatak integracije trgovine s tim drugim sustavima (na primjer, 1C).

Općenito, integracija se može svesti na replikaciju podataka pomoću:

  • katalog (proizvodi, kategorije);
  • podaci o zalihama (stanja proizvoda u skladištima i cijene);
  • klijenti;
  • narudžbe;

Magento nudi zasebnu klasu objekata za manipuliranje podacima u bazi podataka - spremišta. Zbog specifičnosti Magenta, dodavanje podataka u bazu putem repozitorija lako je kodirati, ali je, recimo to tako, sporo. U ovoj publikaciji razmatram glavne faze programskog dodavanja proizvoda u Magento 2 na "klasičan" način - korištenjem repo klasa.

Kupci i narudžbe obično se repliciraju u drugom smjeru – od Magenta do vanjskih ERP sustava. Stoga je s njima lakše, na strani Magenta samo trebate odabrati odgovarajuće podatke, a zatim "meci su izletjeli s naše strane”.

Načela upisa podataka u bazu podataka

Trenutno se kreiranje objekata spremljenih u bazi programski u Magentu vrši Tvornica:

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

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

a upisivanje u bazu podataka vrši se putem skladište:

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

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

Pristup "Factory" i "Repository" može se koristiti za sve glavne modele u domeni Magento 2.

Osnovne informacije o proizvodu

Gledam strukturu podataka koja odgovara verziji Magenta 2.3. Najosnovniji podaci o proizvodu nalaze se u tablici catalog_product_entity (registar proizvoda):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Ograničen sam na jednu vrstu proizvoda (type_id='simple'), skup zadanih atributa (attribute_set_id=4) i zanemariti atribute has_options и required_options. Budući da atributi entity_id, created_at и updated_at generiraju se automatski, onda, zapravo, da bismo dodali novi proizvod, samo trebamo postaviti sku. Radim ovo:

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

i dobivam iznimku:

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

Dodam naziv proizvoda u zahtjev i dobijem poruku da atribut nedostaje Price. Nakon dodavanja cijene, proizvod se dodaje u bazu podataka:

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

Naziv proizvoda pohranjuje se u tablici atributa varchar proizvoda (catalog_product_entity_varchar), cijena - u tablici catalog_product_entity_decimal. Prije dodavanja proizvoda, preporučljivo je izričito naznačiti da koristimo administrativni izlog za uvoz podataka:

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

Dodatni atributi

Obrada dodatnih atributa proizvoda pomoću Magenta je zadovoljstvo. EAV podatkovni model za glavne entitete (vidi tablicu eav_entity_type) jedna je od ključnih značajki ove platforme. Jednostavno dodajemo odgovarajuće atribute modelu proizvoda:

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

i prilikom spremanja modela putem repo objekta:

$repoProd->save($prod);

dodatni atributi također će biti pohranjeni u odgovarajućim tablicama baze podataka.

Podaci o zalihama

Pojednostavljeno rečeno – količina proizvoda na zalihi. U Magentu 2.3, strukture u bazi podataka koje opisuju format za pohranu podataka o zalihama su bitno drugačiji od onoga što se dogodilo prije. Međutim, dodavanje količine proizvoda na zalihi putem modela proizvoda nije mnogo teže od dodavanja drugih atributa:

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

media

Medijska podrška za proizvod za klijenta u trgovini (e-commerce) u pravilu se razlikuje od medijske podrške za isti proizvod za zaposlenika u internom računovodstvenom sustavu (ERP). U prvom slučaju, preporučljivo je pokazati proizvod licem u lice; u drugom, dovoljno je dati opću ideju o proizvodu. Međutim, prijenos barem primarne slike proizvoda prilično je uobičajen. case prilikom uvoza podataka.

Prilikom dodavanja slike putem administratorske ploče, slika se prvo sprema u privremeni direktorij (./pub/media/tmp/catalog/product) i tek prilikom spremanja proizvod se premješta u direktorij medija (./pub/media/catalog/product). Također, kada se doda putem administratorske ploče, slika je označena 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);

Iz nekog razloga, medij se povezuje tek nakon što se proizvod prvo spremi i dohvati iz repozitorija. I trebate navesti atribut label prilikom dodavanja unosa u galeriju medija proizvoda (inače dobivamo iznimku Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Категории

Često se struktura kategorije trgovine i backend aplikacije ili plasman proizvoda u njima mogu značajno razlikovati. Strategije za premještanje podataka o kategorijama i proizvodima unutar njih ovise o mnogim čimbenicima. U ovom primjeru držim se sljedećeg:

  • backend i store kategorije se uspoređuju prema nazivu;
  • ako se uvozi kategorija koja nije u trgovini, tada se stvara pod korijenskom kategorijom (Default Category) i njegovo daljnje pozicioniranje u katalogu trgovine pretpostavlja se ručno;
  • proizvod se dodjeljuje kategoriji tek kada se kreira u trgovini (prvi uvoz);

Osnovni podaci o kategoriji nalaze se u tablici catalog_category_entity (katalog kategorija). Stvaranje kategorije u Magentu:

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

Povezivanje proizvoda s kategorijom provodi se pomoću ID-a kategorije i SKU-a proizvoda:

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

Ukupno

Pisanje koda za programsko dodavanje proizvoda u Magento 2 vrlo je jednostavno. Kombinirao sam sve gore navedeno u demo modul “flancer32/mage2_ext_demo_import". U modulu postoji samo jedna konzolna naredba fl32:import:prod, koji uvozi proizvode opisane u JSON datoteci "./etc/data/products.json„:

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

Slike za uvoz su u katalogu ./etc/data/img.

Vrijeme za uvoz 10 proizvoda ovom metodom je oko 10 sekundi na mom prijenosnom računalu. Ako ovu ideju dalje razvijamo, lako je doći do zaključka da se na sat može uvesti oko 3600 proizvoda, a za uvoz 100K proizvoda može biti potrebno oko 30 sati. Zamjena prijenosnog računala poslužiteljem omogućuje vam da donekle izgladite situaciju. Možda čak i nekoliko puta. Ali ne po redovima veličina. Možda je ta brzina i sporost donekle i jedan od razloga nastanka projekta magento/async-uvoz.

Radikalno rješenje za povećanje brzine uvoza mogao bi biti izravan ulazak u bazu podataka, ali u ovom slučaju se gube sve „dobrotine“ koje se tiču ​​Magento proširivosti - sve „napredno“ ćete morati učiniti sami. Međutim, isplati se. Ako uspije, razmotrit ću pristup s izravnim pisanjem u bazu podataka u sljedećem članku.

Izvor: www.habr.com

Dodajte komentar