Magento 2: termékek importálása külső forrásokból

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 — tárhelyen. 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: Factory:

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: Az Eloquent segítségével történő megvalósítása meglehetősen egyszerű::

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_at

Egyetlen 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, jelentősen eltérnek 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 „flancer32/mage2_ext_demo_import„. A modulnak csak egy konzolparancsa van fl32:import:prod, amely importálja a JSON fájlban leírt termékeket „./etc/data/products.json«:

[
  {
    "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. magento/async-import.

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

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster