Magento është një zgjidhje e-commerce, pra është më shumë e orientuar drejt shitjes së produkteve sesa drejt llogaritjes mbështetëse të shitjeve për depozitimin, logjistikën ose financat. Për mbështetje më të mirë do të ishin të përshtatshme aplikacione të tjera (p.sh., sistemet ERP). Prandaj, shpesh në praktikën e përdorimit të Magento paraqitet detyra për të integruar dyqanin me këto sisteme të tjera (p.sh., me 1C).
Në thelb, integrimi mund të reduktohet në replika të dhënash për:
- katalogun (produkte, kategori);
- të dhënat inventar (rekupertimet e produkteve në depo dhe çmimet);
- klientët;
- porositë;
Magento pĂ«r manipulimin e tĂ« dhĂ«nave nĂ« bazĂ« ofron njĂ« klasĂ« tĂ« veçantĂ« objektesh â . PĂ«r shkak tĂ« specifikave tĂ« Magento, shtimi i tĂ« dhĂ«nave nĂ« bazĂ« pĂ«rmes repozitoreve Ă«shtĂ« i lehtĂ« pĂ«r t'u koduar, por ndodh, le tĂ« themi, jo shpejt. NĂ« kĂ«tĂ« publikim po shqyrtoj hapat kryesorĂ« tĂ« shtimit programatik tĂ« produktit nĂ« Magento 2 nĂ« mĂ«nyrĂ«n "klasike" â duke pĂ«rdorur klasat repo.
KlientĂ«t dhe porositĂ« riplikohen, zakonisht, nĂ« drejtimin tjetĂ«r â nga Magento nĂ« sistemet ERP tĂ« jashtme. Prandaj, me ta Ă«shtĂ« mĂ« e lehtĂ«, nĂ« anĂ«n e Magento duhet thjesht tĂ« zgjidhni tĂ« dhĂ«nat pĂ«rkatĂ«se, e mĂ« pas â "nga ana nga pallat e dolĂ«n«.
Principet e regjistrimit të të dhënave në databazë
Aktualisht, krijimi i objekteve që ruhet në databazë në Magento bëhet nëpërmjet :
function __construct (MagentoCmsModelBlockFactory $blockFactory) {
$this->blockFactory = $blockFactory;
}
/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();dhe regjistrimi nĂ« databazĂ« â nĂ«pĂ«rmjet :
function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
$this->blockRepo = $blockRepo;
}
$this->blockRepo->save($block);Qasja me përdorimin e «Factory» dhe «Repository» mund të përdoret për të gjitha modelet kryesore në fushën e Magento 2.
Informacioni bazë mbi produktin
Po shqyrtoj strukturën e të dhënave që përputhet me versionin Magento 2.3. Informacioni më i rëndësishëm në lidhje me produktin ndodhet në tabelën catalog_product_entity (regjistri i produkteve):
entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_atPo kufizohem në një lloj produkti (type_id='simple'), një grup atributesh sipas parazgjedhjes (attribute_set_id=4) dhe injoroj atributet has_options dhe required_options. Duke qenë se atributet entity_id, created_at dhe updated_at generohen automatikisht, në përfundim, për të shtuar një produkt të ri, na mjafton të përcaktojmë sku. E bëj kështu:
/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);dhe marr një përjashtim:
Vlera e atributit "Emri i Produktit" Ă«shtĂ« bosh. PĂ«rcaktoni atributin dhe provoni pĂ«rsĂ«ri.Shtoj nĂ« kĂ«rkesĂ« emrin e produktit dhe marr njĂ« mesazh se i mungon atributi Ămimi. Pas shtimit tĂ« çmimit, produkti ruhatet nĂ« bazĂ«:
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);Emri i produktit ruhet nĂ« tabelĂ«n e atributeve varchar tĂ« produktit (catalog_product_entity_varchar), çmimi â nĂ« tabelĂ«n catalog_product_entity_decimal. Para se tĂ« shtoni produktin, Ă«shtĂ« e rekomandueshme tĂ« specifikoni qartĂ« se po pĂ«rdorim vitrinĂ«n administrative pĂ«r importimin e tĂ« dhĂ«nave:
/** @var MagentoStoreModelStoreManagerInterface $manStore */
$manStore->setCurrentStore(0);Atributet shtesë
PĂ«rpunimi i atributeve shtesĂ« tĂ« produkteve me mjete Magento â Ă«shtĂ« njĂ« kĂ«naqĂ«si. Modeli EAV i tĂ« dhĂ«nave pĂ«r entitetet kryesore (shih tabelĂ«n eav_entity_type) â Ă«shtĂ« njĂ« nga karakteristikat kryesore tĂ« kĂ«saj platforme. Thjesht shtojmĂ« atributet pĂ«rkatĂ«se nĂ« modelin e produktit:
$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// ose
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);dhe kur ruajmë modelin përmes objektit repo:
$repoProd->save($prod);atributet shtesë do të ruhen gjithashtu në tabelat përkatëse të DB.
Të dhënat për inventar
Thjesht â sasia e produktit nĂ« magazinĂ«. NĂ« Magento 2.3, strukturat nĂ« DB qĂ« pĂ«rshkruajnĂ« formatin e ruajtjes sĂ« tĂ« dhĂ«nave tĂ« inventarit, nga ajo qĂ« ishte mĂ« parĂ«. MegjithatĂ«, shtimi i sasisĂ« sĂ« produktit nĂ« magazinĂ« nĂ«pĂ«rmjet modelit tĂ« produktit nuk Ă«shtĂ« shumĂ« mĂ« i komplikuar se sa shtimi i atributeve tĂ« tjera:
/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
'is_in_stock' => true,
'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);Media
Si zakonisht, mbështetja mediale e produktit për klientin në dyqan (e-commerce) dallon nga mbështetja mediale e të njëjtit produkt për punonjësin në sistemin e brendshëm të llogarive (ERP). Në rastin e parë, është e dëshirueshme të tregohet "produkti në fytyrë", ndërsa në të dytin, mjafton të jepet një pamje e përgjithshme e produktit. Megjithatë, transferimi i të paktën imazhit fillestar të produktit është një rast në importimin e të dhënave.
Kur shtohet imazhi pĂ«rmes administratĂ«s, fotografia fillimisht ruhet nĂ« njĂ« katalog pĂ«rkohĂ«sor (./pub/media/tmp/catalog/product) dhe vetĂ«m kur ruhet produkti, пДŃĐ”ĐœĐŸŃĐžŃŃŃ nĂ« katalogun mediatik (./pub/media/catalog/product). Gjithashtu, kur shtohet pĂ«rmes administratĂ«s, imazhit i jepet etiketat 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);Për një arsye, media ngadalësohet vetëm pas ruajtjes paraprakisht të produktit dhe rikthimit të tij nga repozitori. Duhet cituar atributi etiketë në kohën e shtimit të një regjistrimi në galerinë e medias së produktit (ndryshe do të marrim një përjashtim Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).
Kategoritë
Shpesh struktura e kategorive të dyqanit dhe aplikacionit backend ose vendosja e produkteve në to mund të ndryshojnë ndjeshëm. Strategjitë për transferimin e të dhënave për kategoritë dhe produktet në to varen nga shumë faktorë. Në këtë shembull, unë po e zbatoj këtë:
- kategoritë e backend-it dhe të dyqanit përshtaten sipas emrit;
- nëse importohet një kategori që nuk ekziston në dyqan, ajo krijohet nën kategorinë rrënjë (
Default Category) dhe pozita e saj e mëtejshme në katalogun e dyqanit supozohet të bëhet manualisht; - lidhi e produktit me kategorinë ndodhi vetëm kur ai krijohet në dyqan (në importin e parë);
Informacioni kryesor mbi kategorinë ndodhet në tabelën catalog_category_entity (katalogu i kategorive). Krijimi i një kategorie në Magento:
/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);Lidhja e produktit me kategorinë bëhet sipas ID-së së kategorisë dhe SKU-së së produktit:
/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);Në përfundim
TĂ« shkruash kod pĂ«r tĂ« shtuar produkte nĂ« Magento 2 nĂ« mĂ«nyrĂ« programore nuk Ă«shtĂ« shumĂ« e komplikuar. Gjithçka e pĂ«rshkruar mĂ« sipĂ«r e kam pĂ«rmbledhur nĂ« modul demonstrues ââ. NĂ« modul ka vetĂ«m njĂ« komandĂ« konsolle fl32:import:prod, e cila importon produktet e pĂ«rshkruara nĂ« skedarin JSON â«:
[
{
"sku": "...",
"name": "...",
"desc": "...",
"desc_short": "...",
"price": ...,
"qty": ...,
"categories": ["..."],
"image_path": "..."
}
]Imazhet për importim ndodhen në direktoriumin ./etc/data/img.
Koha e importit për 10 produkte në këtë mënyrë është rreth 10 sekonda në laptopin tim. Nëse e zhvillojmë këtë ide më tej, është e lehtë të arrijmë në përfundimin se në një orë mund të importojmë rreth 3600 produkte, dhe për importin e 100K produkteve mund të nevojiten rreth 30 orë. Zëvendësimi i laptopit me një server lejon të lehtësohet pak situata. Mund të jetë edhe disa herë më shpejt. Por jo në masa të mëdha. Mundësisht kjo ngadalësim është njëra nga arsyet për shfaqjen e projektit .
NjĂ« zgjidhje radikale pĂ«r tĂ« rritur shpejtĂ«sinĂ« e importit mund tĂ« jetĂ« regjistrimi i drejtpĂ«rdrejtĂ« nĂ« bazĂ«n e tĂ« dhĂ«nave, por nĂ« kĂ«tĂ« rast humbet gjithĂ« "pluset" qĂ« lidhen me zgjerueshmĂ«rinĂ« e Magento â do tĂ« duhet tĂ« bĂ«ni gjithçka "tĂ« zgjeruar" nga e para. MegjithatĂ«, ia vlen. NĂ«se arrij, do tĂ« shqyrtoj qasjen me regjistrime tĂ« drejtpĂ«rdrejta nĂ« DB nĂ« artikullin e ardhshĂ«m.
Burimi: habr.com
