Magento Àr en e-handelslösning, vilket innebÀr att den Àr mer inriktad pÄ att sÀlja produkter Àn pÄ relaterad lagring, logistik eller finansiell redovisning. För detta ÀndamÄl passar andra applikationer (t.ex. ERP-system) bÀttre. DÀrför uppstÄr det ganska ofta i praktisk anvÀndning av Magento behov av att integrera butiken med dessa andra system (t.ex. med 1C).
Generellt kan integrationen sammanfattas som replikering av data för:
- katalogen (produkter, kategorier);
- lagerdata (produkters lagernivÄer och priser);
- kunder;
- bestÀllningar;
Magento erbjuder en speciell klass av objekt för att manipulera data i databasen â . PĂ„ grund av Magento-specifikationen Ă€r tillĂ€gg av data i databasen via repositories lĂ€tt att koda, men sker inte direkt. I denna publikation kommer jag att gĂ„ igenom de huvudsakliga stegen för programmatisk tillĂ€gg av produkten i Magento 2 pĂ„ det "klassiska" sĂ€ttet â med hjĂ€lp av repo-klasser.
Kunder och bestĂ€llningar replikeras vanligtvis Ă„t andra hĂ„llet â frĂ„n Magento till externa ERP-system. DĂ€rför Ă€r det enklare, pĂ„ Magento-sidan behöver man bara vĂ€lja de lĂ€mpliga uppgifterna, och sedan â "frĂ„n vĂ„r sida flög kulorna ut«.
Principer för att skriva data till databasen
För nÀrvarande skapas objekt som lagras i databasen programmatiskt i Magento via :
function __construct (MagentoCmsModelBlockFactory $blockFactory) {
$this->blockFactory = $blockFactory;
}
/** @var MagentoCmsModelBlock $block * /
$block = $this->blockFactory->create();och att skriva till databasen â via :
function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
$this->blockRepo = $blockRepo;
}
$this->blockRepo->save($block);TillvÀgagÄngssÀttet med anvÀndning av "Factory" och "Repository" kan anvÀndas för alla huvudsakliga modeller inom Magento 2:s ÀmnesomrÄde.
GrundlÀggande produktinformation
Jag analyserar datakonstruktionen som motsvarar versionen Magento 2.3. Den mest grundlÀggande informationen om produkten finns i tabellen catalog_product_entity (produktenhet):
entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_atJag begrÀnsar mig till en produktkategori (type_id='simple'), en uppsÀttning standardattribut (attribute_set_id=4) och ignorerar attributen has_options och required_optionsEftersom attributen entity_id, created_at och updated_at genereras automatiskt, Àr det i princip tillrÀckligt för oss att ange sku. Jag gör sÄ hÀr:
/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);och fÄr ett undantag:
AttributvÀrdet för "Produktnamn" Àr tomt. StÀll in attributet och försök igen.Jag lÀgger till produktnamnet i begÀran och fÄr ett meddelande om att det saknas en attribut. Pris. Efter att ha lagt till priset sparas produkten i databasen:
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);Produktens namn sparas i tabellen för varchar-attribut (catalog_product_entity_varchar), priset sparas i tabellen catalog_product_entity_decimal. Innan produkten lÀggs till Àr det bra att tydligt ange att vi anvÀnder den administrativa vy:n för att importera data:
/** @var MagentoStoreModelStoreManagerInterface $manStore */
$manStore->setCurrentStore(0);Ytterligare attribut
Att behandla ytterligare produktattribut med hjÀlp av Magento Àr ett nöje. EAV-datamodellen för huvudentiteter (se tabell eav_entity_type) Àr en av de nyckelfunktioner som denna plattform har. Vi lÀgger helt enkelt till de relevanta attributen till produktmodellen:
$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// eller
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);och vid sparande av modellen via repo-objektet:
$repoProd->save($prod);kommer de ytterligare attributen Àven att sparas i motsvarande databastabeller.
Lagerdata
Enkelt uttryckt â mĂ€ngden av produkten i lagret. I Magento 2.3 skiljer sig strukturerna i databasen som beskriver lagring av lagerdata signifikant Media
/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
'is_in_stock' => true,
'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);Som regel skiljer sig mediastöd för produkten för kunden i butiken (e-handel) frÄn mediastödet för samma produkt för anstÀllda i det interna redovisningssystemet (ERP). I det första fallet Àr det önskvÀrt att visa "produkten frontal", i det andra fallet rÀcker det med att ge en allmÀn översikt över produkten. Trots detta Àr överföringen av Ätminstone den primÀra bilden av produkten ganska vanlig
fall vid datainport. NÀr en bild lÀggs till via adminpanelen sparas bilden först i en tillfÀllig katalog (
./pub/media/tmp/catalog/product) och flyttas först till mediakatalogen (./pub/media/catalog/product) nÀr produkten sparas. OcksÄ nÀr man lÀgger till via adminpanelen tilldelas bilden taggarsmall_image bild, thumbnail, swatch_image, Av nÄgon anledning kopplas media endast efter att produkten har sparats prelimÀrt och hÀmtats frÄn repot pÄ nytt. Och man mÄste ange attributet.
/** @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);ĐĐŸŃĐ”ĐŒŃ-ŃĐŸ ĐŒĐ”ĐŽĐžĐ° ĐżĐŸĐŽĐČŃĐ·ŃĐČаДŃŃŃ ŃĐŸĐ»ŃĐșĐŸ ĐżĐŸŃлД ĐżŃДЎĐČаŃĐžŃДлŃĐœĐŸĐłĐŸ ŃĐŸŃ
ŃĐ°ĐœĐ”ĐœĐžŃ ĐżŃĐŸĐŽŃĐșŃа Đž ĐżĐŸĐ»ŃŃĐ”ĐœĐžŃ Đ”ĐłĐŸ Оз ŃĐ”ĐżĐŸĐ·ĐžŃĐŸŃĐžŃ Đ·Đ°ĐœĐŸĐČĐŸ. Đ ĐœŃĐ¶ĐœĐŸ ŃĐșазŃĐČаŃŃ Đ°ŃŃОбŃŃ label vid skapandet av en post i produktens mediegalleri (annars fĂ„r vi ett undantag Odefinierad index: label i .../modul-katalog/Model/Product/Gallery/CreateHandler.php pĂ„ rad 516).
Kategorier
Strukturen för butikens kategorier och backend-applikationen eller placeringen av produkterna kan ofta variera betydligt. Strategier för att överföra data om kategorier och produkter beror pÄ mÄnga faktorer. I det hÀr exemplet följer jag följande:
- kategorier i backend och butik motsvarar varandra efter namn;
- om en kategori importeras som inte finns i butiken skapas den under roten av kategorin (
Standardkategori) och dess framtida positionering i butikens katalog planeras manuellt; - kopplingen av produkten till kategorin sker endast vid dess skapande i butiken (vid första importen);
Huvudinformationen om kategorin finns i tabellen catalog_category_entity (katalogen över kategorier). Skapande av kategori i Magento:
/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);Kopplingen av produkten till kategorin sker via kategori-ID och produktens SKU:
/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);Sammanfattningsvis
Att skriva kod för att programatiskt lÀgga till en produkt i Magento 2 Àr ganska enkelt. Allt ovan har jag sammanstÀllt i en demomodul "". Modulen har endast ett konsolkommando fl32:import:prod, som importerar produkter beskrivna i JSON-filen "«:
[
{
"sku": "...",
"name": "...",
"desc": "...",
"desc_short": "...",
"price": ...,
"qty": ...,
"categories": ["..."],
"image_path": "..."
}
]Bilder för importen finns i katalogen ./etc/data/img.
Tiden för att importera 10 produkter pÄ detta sÀtt Àr cirka 10 sekunder pÄ min laptop. Om vi utvecklar denna tanke vidare, kan vi enkelt komma fram till att vi kan importera cirka 3600 produkter pÄ en timme, och det kan ta omkring 30 timmar att importera 100K produkter. Att byta ut laptopen mot en server kan lindra situationen nÄgot. Kanske till och med i stora drag. Men inte i ordning. Möjligen Àr denna hastighet sÀrskilt lÄngsam pÄ nÄgot sÀtt en av anledningarna till att projektet .
En radikal lösning för att öka importhastigheten kan vara direktinspelning i databasen, men i sĂ„ fall förloras alla "fördelar" som rör Magento:s utvidgbarhet - allt "utökat" mĂ„ste göras sjĂ€lv. ĂndĂ„ Ă€r det vĂ€rt det. Om möjligheten ges, kommer jag att övervĂ€ga tillvĂ€gagĂ„ngssĂ€ttet med direktinspelning i databasen i nĂ€sta artikel.
KĂ€lla: habr.com
