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 â . 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 :
function __construct (MagentoCmsModelBlockFactory $blockFactory) {
$this->blockFactory = $blockFactory;
}
/** @var MagentoCmsModelBlock $block *//
$block = $this->blockFactory->create();ja andmebaasi kirjutamine toimub lÀbi :
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_atPiirdun ĂŒ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, 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 ««. Moodulis on ainult ĂŒks konsooli kĂ€sk fl32:import:prod, mis impordib tooteid, mis on kirjeldatud JSON-failis ««:
[
{
"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 .
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
