Magento 2: Importazzjoni ta' Prodotti minn Sorsi Esterni

Magento hija soluzzjoni tal-kummerċ elettroniku, i.e. hija aktar immirata lejn il-bejgħ tal-prodotti milli lejn il-magazzinaġġ, il-loġistika jew il-kontabilità finanzjarja li jakkumpanjaw il-bejgħ. Applikazzjonijiet oħra (pereżempju, sistemi ERP) huma aktar adattati għall-applikazzjonijiet li jakkumpanjawhom. Għalhekk, ħafna drabi fil-prattika tal-użu ta 'Magento tqum il-kompitu li jintegra maħżen ma' dawn is-sistemi l-oħra (per eżempju, 1C).

B'mod ġenerali, l-integrazzjoni tista' titnaqqas għal replikazzjoni tad-dejta billi:

  • katalgu (prodotti, kategoriji);
  • data tal-inventarju (bilanċi tal-prodotti fl-imħażen u prezzijiet);
  • klijenti;
  • ordnijiet;

Magento joffri klassi separata ta' oġġetti għall-manipulazzjoni tad-dejta fid-database - repożitorji. Minħabba l-ispeċifiċitajiet ta 'Magento, iż-żieda tad-dejta fid-database permezz ta' repożitorji hija faċli biex tikkodifika, iżda, ejja ngħidu, hija bil-mod. F'din il-pubblikazzjoni, nikkunsidra l-istadji ewlenin taż-żieda programmatika ta 'prodott ma' Magento 2 bil-mod "klassiku" - bl-użu ta 'klassijiet repo.

Il-klijenti u l-ordnijiet huma normalment replikati fid-direzzjoni l-oħra - minn Magento għal sistemi ERP esterni. Għalhekk, huwa aktar sempliċi magħhom, fuq in-naħa Magento għandek bżonn biss li tagħżel id-dejta xierqa, u mbagħad "balal tellgħu minn naħa tagħna".

Prinċipji ta' reġistrazzjoni ta' data f'database

Fil-mument, il-ħolqien ta 'oġġetti salvati fid-database b'mod programmatiku f'Magento isir permezz fabbrika:

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

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

u l-kitba fid-database isir permezz Repożitorju:

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

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

L-approċċ "Fabbrika" u "Repożitorju" jista 'jintuża għall-mudelli ewlenin kollha fid-dominju Magento 2.

Informazzjoni Bażika dwar il-Prodott

Qed inħares lejn struttura tad-dejta li taqbel mal-verżjoni ta' Magento 2.3. L-aktar informazzjoni bażika dwar il-prodott tinsab fit-tabella catalog_product_entity (reġistru tal-prodott):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Jien limitat għal tip wieħed ta' prodott (type_id='simple'), sett ta' attributi default (attribute_set_id=4) u jinjora l-attributi has_options и required_options. Peress li l-attributi entity_id, created_at и updated_at huma ġġenerati awtomatikament, allura, fil-fatt, biex iżżid prodott ġdid, għandna bżonn biss li nissettjaw sku. Nagħmel dan:

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

u nieħu eċċezzjoni:

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

Inżid l-isem tal-prodott mat-talba u nieħu messaġġ li l-attribut huwa nieqes Price. Wara li żżid il-prezz, il-prodott jiġi miżjud mad-database:

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

L-isem tal-prodott huwa maħżun fit-tabella tal-attribut varchar tal-prodott (catalog_product_entity_varchar), prezz - fit-tabella catalog_product_entity_decimal. Qabel ma żżid prodott, huwa rakkomandabbli li nindikaw b'mod espliċitu li qed nużaw il-faċċata amministrattiva għall-importazzjoni tad-dejta:

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

Attributi Addizzjonali

L-ipproċessar ta 'attributi addizzjonali tal-prodott bl-użu ta' Magento huwa ta 'pjaċir. Mudell tad-dejta tal-EAV għall-entitajiet ewlenin (ara t-tabella eav_entity_type) hija waħda mill-karatteristiċi ewlenin ta' din il-pjattaforma. Aħna sempliċement inżidu l-attributi xierqa mal-mudell tal-prodott:

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

u meta tissejvja l-mudell permezz tal-oġġett repo:

$repoProd->save($prod);

attributi addizzjonali se jinħażnu wkoll fit-tabelli tad-database korrispondenti.

Data tal-inventarju

F'termini sempliċi - l-ammont ta 'prodott fl-istokk. F'Magento 2.3, strutturi fid-database li jiddeskrivu l-format għall-ħażna tad-dejta tal-inventarju huma differenti b'mod sinifikanti minn dak li ġara qabel. Madankollu, iż-żieda tal-kwantità ta' prodott fl-istokk permezz tal-mudell tal-prodott mhix wisq aktar diffiċli milli żżid attributi oħra:

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

Midja

Bħala regola, l-appoġġ tal-midja għal prodott għal klijent f'maħżen (kummerċ elettroniku) huwa differenti mill-appoġġ tal-midja għall-istess prodott għal impjegat f'sistema ta 'kontabilità interna (ERP). Fl-ewwel każ, huwa rakkomandabbli li turi l-prodott wiċċ imb wiċċ; fit-tieni, huwa biżżejjed li tingħata idea ġenerali tal-prodott. Madankollu, it-trasferiment tal-inqas l-immaġni primarja ta 'prodott huwa pjuttost komuni. case meta timporta data.

Meta żżid immaġni permezz tal-pannell tal-amministrazzjoni, l-immaġni tiġi l-ewwel issejvjata f'direttorju temporanju (./pub/media/tmp/catalog/product) u biss meta ssalva l-prodott jiġi mċaqlaq fid-direttorju tal-midja (./pub/media/catalog/product). Ukoll, meta miżjuda permezz tal-pannell tal-amministrazzjoni, l-immaġni hija ttikkettata 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);

Għal xi raġuni, il-midja hija marbuta biss wara li l-ewwel issalva l-prodott u terġa 'tiġbor mir-repożitorju. U għandek bżonn tispeċifika l-attribut label meta żżid dħul fil-gallerija tal-midja tal-prodott (inkella jkollna eċċezzjoni Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Категории

Ħafna drabi, l-istruttura tal-kategorija tal-maħżen u l-applikazzjoni backend jew it-tqegħid ta 'prodotti fihom jistgħu jvarjaw b'mod sinifikanti. Strateġiji għall-migrazzjoni tad-dejta dwar kategoriji u prodotti fi ħdanhom jiddependu fuq ħafna fatturi. F'dan l-eżempju nżomm ma' dan li ġej:

  • Il-kategoriji tal-backend u tal-maħżen huma mqabbla bl-isem;
  • jekk tiġi importata kategorija li mhix fil-maħżen, allura tinħoloq taħt il-kategorija tal-għeruq (Default Category) u l-pożizzjonament ulterjuri tiegħu fil-katalgu tal-maħżen huwa preżunt manwalment;
  • prodott huwa assenjat għal kategorija biss meta jinħoloq fil-maħżen (l-ewwel importazzjoni);

Informazzjoni bażika dwar il-kategorija tinsab fit-tabella catalog_category_entity (katalgu tal-kategoriji). Il-ħolqien ta' kategorija f'Magento:

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

Ir-rabta ta' prodott ma' kategorija titwettaq bl-użu tal-ID tal-kategorija u l-SKU tal-prodott:

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

B'kollox

Il-kitba tal-kodiċi biex iżżid prodott b'mod programmatiku ma' Magento 2 hija pjuttost faċli. Jien għaqqadt dak kollu ddikjarat hawn fuq f'modulu demo "flancer32/mage2_ext_demo_import". Hemm kmand wieħed biss tal-console fil-modulu fl32:import:prod, li timporta l-prodotti deskritti fil-fajl JSON "./etc/data/products.json":

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

Stampi għall-importazzjoni huma fil-katalgu ./etc/data/img.

Il-ħin biex timporta 10 prodotti bl-użu ta 'dan il-metodu huwa ta' madwar 10 sekondi fuq il-laptop tiegħi. Jekk niżviluppaw aktar din l-idea, huwa faċli li naslu għall-konklużjoni li madwar 3600 prodott jistgħu jiġu importati fis-siegħa, u tista 'tieħu madwar 100 siegħa biex timporta 30K prodotti. Is-sostituzzjoni ta 'laptop b'server jippermettilek li twitti xi ftit is-sitwazzjoni. Forsi anke diversi drabi. Iżda mhux b'ordnijiet ta 'kobor. Forsi din il-ħeffa u l-ħeffa hija sa ċertu punt waħda mir-raġunijiet għall-emerġenza tal-proġett magento/async-import.

Soluzzjoni radikali biex tiżdied il-veloċità tal-importazzjoni tista 'tkun dħul dirett fid-database, iżda f'dan il-każ il-"goodies" kollha dwar l-estensibilità ta' Magento jintilfu - inti jkollok tagħmel dak kollu "avvanzat" lilek innifsek. Madankollu, huwa worth it. Jekk taħdem, ser nikkunsidra l-approċċ b'kitba diretta għad-database fl-artiklu li jmiss.

Sors: www.habr.com

Żid kumment