Magento 2: Produkter aus externe Quellen importéieren

Magento ass eng E-Commerce Léisung, d.h. ass méi gezielt fir Produkter ze verkafen wéi op Lagerung, Logistik oder finanziell Comptabilitéit déi de Verkaf begleeden. Aner Applikatiounen (zum Beispill, ERP Systemer) si besser gëeegent fir begleet Applikatiounen. Dofir, an der Praxis vum Magento ze benotzen, entsteet d'Aufgab fir e Geschäft mat dësen anere Systemer z'integréieren (zum Beispill 1C).

Am grousse Ganzen kann d'Integratioun op Datereplikatioun reduzéiert ginn duerch:

  • Katalog (Produkter, Kategorien);
  • Inventardaten (Produktbalancen a Lagerhaiser a Präisser);
  • Clienten;
  • Uerderen;

Magento bitt eng separat Klass vun Objekter fir Daten an der Datebank ze manipuléieren - Repositories. Wéinst de Spezifizitéite vu Magento, Daten an d'Datebank duerch Repositories ze addéieren ass einfach ze codéieren, awer et ass, loosst eis soen, lues. An dëser Verëffentlechung betruechten ech d'Haaptstadien fir programmatesch e Produkt op Magento 2 op der "klassescher" Manéier ze addéieren - mat Repo Klassen.

Clienten an Bestellunge ginn normalerweis an déi aner Richtung replizéiert - vu Magento bis extern ERP Systemer. Dofir ass et méi einfach mat hinnen, op der Magento Säit musst Dir just déi entspriechend Donnéeën auswielen, an dann "Kugelen si vun eiser Säit eraus geflunn".

Prinzipien fir Daten an eng Datebank opzehuelen

Am Moment ass d'Erstelle vun Objeten, déi an der Datebank gespäichert sinn, programmatesch a Magento duerchgefouert Factory:

function __construct (MagentoCmsModelBlockFactory $blockFactory) {
    $this->blockFactory = $blockFactory;
}

/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();

a Schreiwen un d'Datebank gëtt duerch gemaach Repository:

function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
    $this->blockRepo = $blockRepo;
}

$this->blockRepo->save($block);

D'"Factory" an "Repository" Approche ka fir all gréisser Modeller am Magento 2 Domain benotzt ginn.

Basis Produit Informatiounen

Ech kucken op eng Datestruktur déi mat Magento 2.3 Versioun passt. Déi meescht Basisinformatioun iwwer de Produit ass an der Tabell catalog_product_entity (Produktregistrierung):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Ech sinn limitéiert op eng Zort Produkt (type_id='simple'), eng Rei vun Default Attributer (attribute_set_id=4) an Attributer ignoréieren has_options и required_options. Zënter den Attributer entity_id, created_at и updated_at ginn automatesch generéiert, dann, tatsächlech, fir en neit Produkt ze addéieren, brauche mir just ze setzen sku. Ech maachen dëst:

/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);

an ech kréien eng Ausnam:

The "Product Name" attribute value is empty. Set the attribute and try again.

Ech addéieren de Produktnumm op d'Ufro a kréien e Message datt d'Attribut fehlt Price. Nodeems de Präis bäigefüügt gëtt, gëtt de Produit an d'Datebank bäigefüügt:

$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);

De Produktnumm gëtt an der Produktvarchar Attributtabelle gespäichert (catalog_product_entity_varchar), Präis - an der Tabell catalog_product_entity_decimal. Ier Dir e Produkt bäidréit, ass et ubruecht explizit unzeginn datt mir den administrativen Storefront benotze fir Daten z'importéieren:

/** @var MagentoStoreModelStoreManagerInterface $manStore */
$manStore->setCurrentStore(0);

Zousätzlech Attributer

Veraarbechtung vun zousätzlech Produktattributer mat Magento ass e Genoss. EAV Datemodell fir Haaptentitéiten (kuckt Tabell eav_entity_type) ass ee vun de Schlëssel Feature vun dëser Plattform. Mir addéieren einfach déi entspriechend Attributer zum Produktmodell:

$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// или
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);

a wann Dir de Modell iwwer de Repo-Objet späichert:

$repoProd->save($prod);

zousätzlech Attributer ginn och an den entspriechende Datebank Dëscher gespäichert.

Inventar Daten

An einfach Begrëffer - de Montant vun Produit op Stock. Am Magento 2.3 sinn Strukturen an der Datebank, déi d'Format beschreiwen fir Inventardaten ze späicheren däitlech anescht vu wat virdru geschitt ass. Wéi och ëmmer, d'Quantitéit vun engem Produkt op Lager iwwer de Produktmodell ze addéieren ass net vill méi schwéier wéi aner Attributer derbäi ze ginn:

/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
    'is_in_stock' => true,
    'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);

Medien

Als Regel ënnerscheet d'Medien Ënnerstëtzung fir e Produit fir e Client an engem Buttek (E-Commerce) vun Medien Ënnerstëtzung fir déi selwecht Produit fir en Employé an engem intern Comptablesmethod System (ERP). Am éischte Fall ass et unzeroden de Produit Gesiicht zu Gesiicht ze weisen; am zweeten ass et genuch fir eng allgemeng Iddi vum Produkt ze ginn. Wéi och ëmmer, op d'mannst dat primär Bild vun engem Produkt ze transferéieren ass zimlech heefeg. case beim Import vun Daten.

Wann Dir e Bild duerch den Admin Panel bäidréit, gëtt d'Bild fir d'éischt an engem temporäre Verzeichnis gespäichert (./pub/media/tmp/catalog/product) an nëmmen wann de Produit späichert gëtt an de Medienverzeechnes geréckelt (./pub/media/catalog/product). Och wann iwwer d'Administratiounspanel bäigefüügt gëtt, gëtt d'Bild markéiert 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);

Aus e puer Grënn sinn d'Medien nëmme verlinkt nodeems Dir d'Produkt als éischt gespäichert hutt an et erëm aus dem Repository zréckhëlt. An Dir musst den Attribut uginn label wann Dir en Entrée an d'Produktmediagalerie bäidréit (soss kréie mir eng Ausnam Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Kategorien

Oft kann d'Kategoriestruktur vum Geschäft an der Backend-Applikatioun oder d'Placement vun de Produkter an hinnen wesentlech ënnerscheeden. Strategien fir d'Migratioun vun Daten iwwer Kategorien a Produkter bannent hinnen hänkt vu ville Faktoren of. An dësem Beispill halen ech mech un déi folgend:

  • Backend- a Buttekkategorien gi mam Numm verglach;
  • wann eng Kategorie importéiert gëtt déi net am Geschäft ass, da gëtt se ënner der Rootkategorie erstallt (Default Category) a seng weider Positionéierung am Buttekkatalog gëtt manuell ugeholl;
  • e Produit gëtt nëmmen eng Kategorie zougewisen wann et am Geschäft erstallt gëtt (éischten Import);

Basis Informatioun iwwer d'Kategorie ass an der Tabell catalog_category_entity (Katalog vun de Kategorien). Eng Kategorie am Magento erstellen:

/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);

D'Verbindung vun engem Produkt mat enger Kategorie gëtt mat der Kategorie ID a Produkt SKU duerchgefouert:

/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);

Total

Code schreiwen fir e Produkt programmatesch op Magento 2 ze addéieren ass ganz einfach. Ech hunn alles uewen ernimmt an engem Demo Modul kombinéiert "flancer32/mage2_ext_demo_import". Et gëtt nëmmen ee Konsol Kommando am Modul fl32:import:prod, déi d'Produkter importéiert, déi an der JSON Datei beschriwwe sinn "./etc/data/products.json":

[
  {
    "sku": "...",
    "name": "...",
    "desc": "...",
    "desc_short": "...",
    "price": ...,
    "qty": ...,
    "categories": ["..."],
    "image_path": "..."
  }
]

Biller fir Import sinn am Katalog ./etc/data/img.

D'Zäit fir 10 Produkter mat dëser Method z'importéieren ass ongeféier 10 Sekonnen op mengem Laptop. Wa mir dës Iddi weider entwéckelen, ass et einfach zu der Conclusioun ze kommen, datt ongeféier 3600 Produkter pro Stonn importéiert kënne ginn, an et kann ongeféier 100 Stonnen daueren fir 30K Produkter z'importéieren. E Laptop mat engem Server ersetzen erlaabt Iech d'Situatioun e bëssen auszegläichen. Vläicht souguer e puer Mol. Awer net duerch Uerdnung vun der Gréisst. Vläicht ass dës Geschwindegkeet an d'Lauegkeet zu engem gewësse Mooss ee vun de Grënn fir d'Entstoe vum Projet magento/async-import.

Eng radikal Léisung fir d'Vitesse vum Import z'erhéijen kéint den direkten Entrée an d'Datebank sinn, awer an dësem Fall sinn all "Goodies" iwwer d'Extensibilitéit vu Magento verluer - Dir musst alles "fortgeschratt" selwer maachen. Allerdéngs ass et derwäert. Wann et klappt, wäert ech d'Approche mat direktem Schreiwen op d'Datebank am nächsten Artikel berücksichtegen.

Source: will.com

Setzt e Commentaire