A Magento egy e-kereskedelmi megoldás, ami azt jelenti, hogy inkább a termékek értékesítésére összpontosít, semmint a kapcsolódó raktári, logisztikai vagy pénzügyi elszámolásokra. Az ilyen jellegű feladatokhoz más alkalmazások (például ERP rendszerek) jobban megfelelőek. Ezért a Magento használatának gyakorlatában gyakran előfordul, hogy integrálni kell az üzletet ezekkel a rendszerekkel (például az 1C-vel).
Alapvetően az integrációt az adatok replikaálására lehet leegyszerűsíteni:
- katalógus (termékek, kategóriák);
- készletadatok (termékek raktáron lévő mennyisége és ára);
- ügyfelek;
- rendelések;
A Magento az adatbázisban lévő adatok kezelése érdekében külön objektumosztályt kínál — . A Magento sajátosságai miatt az új adatok hozzáadása az adatbázishoz a tárolókon keresztül könnyen kódolható, de, hogy így mondjam, nem túl gyors. A jelen jelentésben a Magento 2-ben a termék "klasszikus" módon történő programozott hozzáadásának fő lépéseit vizsgálom — a repo-osztályok használatával.
Az ügyfelek és rendelések általában a másik irányba replikálódnak — a Magento-tól a külső ERP rendszerekbe. Ezért ezekkel egyszerűbb, a Magento oldalán csak ki kell választani a megfelelő adatokat, a többi — "a mi oldalunkról a golyók elhagyták«.
Adatok rögzítésének alapelvei
Jelenleg a tárolható objektumok programozott létrehozása a Magento-ban a következő módon történik: :
function __construct (MagentoCmsModelBlockFactory $blockFactory) {
$this->blockFactory = $blockFactory;
}
/** @var MagentoCmsModelBlock $block *//
$block = $this->blockFactory->create();míg az adatbázisba való írás a következő módon történik: :
function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
$this->blockRepo = $blockRepo;
}
$this->blockRepo->save($block);A "Factory" és "Repository" megközelítést az összes alapvető modellhez használhatjuk a Magento 2 tág fogalmában.
Alapvető információ a termékről
Az adatszerkezetet a Magento 2.3 verzióhoz viszonyítva vizsgálom. A legfontosabb információ a termékről az alábbi táblázatban található: catalog_product_entity (terméknyilvántartás):
entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_atEgyetlen terméktípusra (type_id='simple'), az alapértelmezett attribútumkészletre (attribute_set_id=4) korlátozódok és figyelmen kívül hagyom az attribútumokat has_options és required_options. Mivel az attribútumok entity_id, ASOF JOIN és updated_at automatikusan generálódnak, gyakorlatilag ahhoz, hogy új terméket adjunk hozzá, elegendő csak megadnunk sku. Ezt így teszem:
/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);és kivételezést kapok:
A "Terméknév" attribútum értéke üres. Állítsa be az attribútumot és próbálja újra.A termék nevét hozzáadom a kéréshez, és kapok egy üzenetet, hogy hiányzik egy attribútum. Ár. Az ár hozzáadását követően a termék bekerül az adatbázisba:
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);A termék neve a varchar attribútumtáblában kerül mentésre (catalog_product_entity_varchar), az ár pedig a táblában catalog_product_entity_decimal. A termék hozzáadása előtt ajánlott világosan jelezni, hogy adminisztratív felületet használunk az adatok importálásához:
/** @var MagentoStoreModelStoreManagerInterface $manStore */
$manStore->setCurrentStore(0);További attribútumok
A Magento által kezelt további termékattribútumok igazi élvezetet jelentenek. Az alapvető entitások EAV-adatmodelje (lásd a táblázatot eav_entity_type) az egyik kulcsfontosságú jellemzője ennek a platformnak. Egyszerűen hozzáadjuk a megfelelő attribútumokat a termék modellhez:
$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// vagy
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);és a modell mentése a repo-objektumon keresztül:
$repoProd->save($prod);a további attribútumok szintén a megfelelő DB táblákban kerülnek mentésre.
Készletadatok
Egyszerűen fogalmazva — a termék mennyisége a raktáron. A Magento 2.3 adatbázis struktúrái, amelyek a készletadatok tárolási formátumát írják le, a korábbiaktól. Mindazonáltal, a termék mennyiségének hozzáadása a termék modellhez nem sokkal bonyolultabb, mint más attribútumok hozzáadása:
/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
'is_in_stock' => true,
'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);Média
Általában a termék média kísérése a vásárló számára a boltban (e-kereskedelem) eltér a termék média kísérletétől a munkavállaló számára a belső nyilvántartási rendszerben (ERP). Az előbbi esetben célszerű "terméket szemből" bemutatni, míg az utóbbiban elegendő csak általános képet adni a termékről. Mindazonáltal, akár egy elsődleges kép termékbe történő átvitele is meglehetősen elterjedt case az adatok importálásakor.
Kép hozzáadása esetén az admin felületen a kép először ideiglenes mappába kerül mentésre (./pub/media/tmp/catalog/product) és csak a termék mentésekor kerül áthelyezésre a média mappába (./pub/media/catalog/product). Kép hozzáadása esetén az adminisztrációs felületen címkéket is rendelnek a képhez. kép, 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);Valamiért a média csak a termék előzetes mentését követően kapcsolódik, és szükséges az attribútum megadása label a termék média galériájába való bejegyzés hozzáadásakor (különben kivételt kapunk. Definíciós index: címke az .../module-catalog/Model/Product/Gallery/CreateHandler.php 516. sorában).
Kategóriák
Gyakran a bolt kategóriáinak és a backend alkalmazásnak a felépítése, illetve az abban lévő termékek elhelyezése jelentősen eltérhet. A kategóriák és azok termékeinek adatainak átvitelének stratégiái számos tényezőtől függenek. Ebben a példában a következőket követem:
- a backend és a bolt kategóriái neveik alapján társítva vannak;
- ha egy olyan kategóriát importálunk, amely nincs a boltban, akkor az a gyökér kategória alatt jön létre (
Default Category) és a bolt katalógusában való további elhelyezését manuálisan kell megoldani; - a termék kategóriához való rendelése csak a boltban való létrehozásakor (első importnál) történik meg;
A kategória fő információi a táblázatban találhatók catalog_category_entity (kategóriák katalógusa). Kategória létrehozása Magento-ban:
/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);A termék kategóriához való rendelése a kategória ID-ján és a termék SKU-n alapul:
/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);Összesen
Kódot írni a Magento 2 termék programozott hozzáadásához nem túl nehéz. Az eddig említett információkat egy demó modulba sűrítettem „„. A modulnak csak egy konzolparancsa van fl32:import:prod, amely importálja a JSON fájlban leírt termékeket „«:
[
{
"sku": "...",
"name": "...",
"desc": "...",
"desc_short": "...",
"price": ...,
"qty": ...,
"categories": ["..."],
"image_path": "..."
}
]Az importálásra szánt képek a következő könyvtárban találhatók ./etc/data/img.
10 termék importálása e módon körülbelül 10 másodpercet vesz igénybe a laptopomon. Ha ezt tovább fejlesztjük, könnyen arra a megállapításra juthatunk, hogy egy órában körülbelül 3600 terméket lehet importálni, és 100K termék importálásához körülbelül 30 óra szükséges. A laptop szerverre cserélése némileg javíthatja a helyzetet. Talán akár többször is. De nem drámai mértékben. Lehetséges, hogy ez a lassú sebesség valamilyen mértékben a projekt megjelenésének egyik oka. .
A betöltési sebesség növelésének radikális megoldása lehet a közvetlen adatbázis írás, de ebben az esetben elveszítjük az összes Magento-ra vonatkozó «előnyét» — mindent saját magunknak kell megoldanunk. Ennek ellenére megéri. Ha lehetséges, a következő cikkben megvizsgálom a közvetlen adatbázis írási hozzáállást.
Forrás: habr.com
