Magento 2: produktu importÄ“Å”ana no ārējiem avotiem

Magento ir e-komercijas risinājums, t.i. ir vairāk vērsta uz produktu pārdoÅ”anu, nevis uz noliktavu, loÄ£istiku vai pārdoÅ”anu pavadoÅ”o finanÅ”u uzskaiti. Citas lietojumprogrammas (piemēram, ERP sistēmas) ir labāk piemērotas papildu lietojumprogrammām. Tāpēc diezgan bieži Magento lietoÅ”anas praksē rodas uzdevums integrēt veikalu ar Ŕīm citām sistēmām (piemēram, 1C).

Kopumā integrāciju var samazināt līdz datu replikācijai, veicot tālāk norādītās darbības.

  • katalogs (produkti, kategorijas);
  • krājumu dati (produktu atlikumi noliktavās un cenas);
  • klientiem;
  • pasÅ«tÄ«jumi;

Magento piedāvā atseviŔķu objektu klasi datu manipulÄ“Å”anai datu bāzē - krātuves. Pateicoties Magento specifikai, datu pievienoÅ”ana datu bāzei caur krātuvēm ir viegli kodējama, taču tā, teiksim, ir lēna. Å ajā publikācijā es aplÅ«koju galvenos posmus, kā programmatiski pievienot produktu Magento 2 ā€œklasiskāā€ veidā - izmantojot repo klases.

Klienti un pasÅ«tÄ«jumi parasti tiek replicēti otrā virzienā ā€“ no Magento uz ārējām ERP sistēmām. Tāpēc ar tiem ir vienkārŔāk, Magento pusē jums vienkārÅ”i jāizvēlas atbilstoÅ”ie dati un pēc tam "no mÅ«su puses izlidoja lodes".

Datu ierakstÄ«Å”anas datubāzē principi

Šobrīd datubāzē saglabāto objektu izveide programmatiski Magento tiek veikta fabrika:

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

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

un rakstÄ«Å”ana datu bāzē tiek veikta cauri Krātuve:

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

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

"Rūpnīcas" un "Repozitorija" pieeju var izmantot visiem galvenajiem Magento 2 domēna modeļiem.

Pamatinformācija par produktu

Es skatos datu struktūru, kas atbilst Magento 2.3 versijai. VisvienkārŔākā informācija par produktu ir atrodama tabulā catalog_product_entity (produktu reģistrs):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Man ir tikai viena veida produkts (type_id='simple'), noklusējuma atribÅ«tu kopa (attribute_set_id=4) un ignorēt atribÅ«tus has_options Šø required_options. Tā kā atribÅ«ti entity_id, created_at Šø updated_at tiek Ä£enerēti automātiski, tad faktiski, lai pievienotu jaunu produktu, mums vienkārÅ”i jāiestata sku. Es daru tā:

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

un man ir izņēmums:

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

PieprasÄ«jumam pievienoju produkta nosaukumu un saņemu ziņojumu, ka trÅ«kst atribÅ«ta Price. Pēc cenas pievienoÅ”anas prece tiek pievienota datu bāzei:

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

Produkta nosaukums tiek saglabāts produkta varchar atribÅ«tu tabulā (catalog_product_entity_varchar), cena - tabulā catalog_product_entity_decimal. Pirms produkta pievienoÅ”anas ir ieteicams skaidri norādÄ«t, ka datu importÄ“Å”anai izmantojam administratÄ«vo veikala mājaslapu:

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

Papildu atribūti

Papildu produkta atribÅ«tu apstrāde, izmantojot Magento, ir prieks. EAV datu modelis galvenajām entÄ«tijām (sk. tabulu eav_entity_type) ir viena no Ŕīs platformas galvenajām funkcijām. Mēs vienkārÅ”i pievienojam atbilstoÅ”os atribÅ«tus produkta modelim:

$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// ŠøŠ»Šø
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);

un saglabājot modeli, izmantojot repo objektu:

$repoProd->save($prod);

papildu atribūti tiks saglabāti arī attiecīgajās datu bāzes tabulās.

Inventāra dati

VienkārŔā izteiksmē - preces daudzums noliktavā. Programmā Magento 2.3 datu bāzes struktÅ«ras, kas apraksta krājumu datu glabāŔanas formātu, ir bÅ«tiski atŔķiras no iepriekÅ” notikuŔā. Tomēr noliktavā esoŔā produkta daudzuma pievienoÅ”ana, izmantojot produkta modeli, nav daudz grÅ«tāka nekā citu atribÅ«tu pievienoÅ”ana:

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

Mediju

Parasti mediju atbalsts produktam klientam veikalā (e-komercija) atŔķiras no mediju atbalsta tādam paÅ”am produktam darbiniekam iekŔējā grāmatvedÄ«bas sistēmā (ERP). Pirmajā gadÄ«jumā ir ieteicams produktu parādÄ«t aci pret aci, otrajā gadÄ«jumā pietiek ar vispārēju priekÅ”statu par produktu. Tomēr vismaz produkta primārā attēla pārsÅ«tÄ«Å”ana ir diezgan izplatÄ«ta parādÄ«ba. case importējot datus.

Pievienojot attēlu caur admin paneli, attēls vispirms tiek saglabāts pagaidu direktorijā (./pub/media/tmp/catalog/product) un tikai tad, kad produkts tiek pārvietots uz multivides direktoriju (./pub/media/catalog/product). Turklāt, pievienojot, izmantojot administratora paneli, attēls tiek atzīmēts 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);

Kādu iemeslu dēļ datu nesējs tiek piesaistÄ«ts tikai pēc produkta saglabāŔanas un atkārtotas izgÅ«Å”anas no krātuves. Un jums ir jānorāda atribÅ«ts label pievienojot ierakstu produkta multivides galerijai (pretējā gadÄ«jumā mēs saņemam izņēmumu Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Kategorija

Bieži vien veikala kategoriju struktÅ«ra un aizmugurprogramma vai produktu izvietojums tajās var bÅ«tiski atŔķirties. Stratēģijas datu migrÄ“Å”anai par kategorijām un produktiem tajās ir atkarÄ«gas no daudziem faktoriem. Å ajā piemērā es pieturos pie sekojoŔā:

  • aizmugursistēmas un veikalu kategorijas tiek salÄ«dzinātas pēc nosaukuma;
  • ja tiek importēta kategorija, kas neatrodas veikalā, tad tā tiek izveidota zem saknes kategorijas (Default Category) un tā turpmākā pozicionÄ“Å”ana veikala katalogā tiek pieņemta manuāli;
  • prece tiek pieŔķirta kategorijai tikai tad, kad tā ir izveidota veikalā (pirmā importÄ“Å”ana);

Pamatinformācija par kategoriju ir atrodama tabulā catalog_category_entity (kategoriju katalogs). Kategorijas izveide programmā Magento:

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

Produkta saistīŔana ar kategoriju tiek veikta, izmantojot kategorijas ID un produkta SKU:

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

Kopā

RakstÄ«t kodu, lai programmatiski pievienotu produktu Magento 2, ir diezgan vienkārÅ”i. Esmu apvienojis visu iepriekÅ” minēto demonstrācijas modulÄ« "flancer32/mage2_ext_demo_import". ModulÄ« ir tikai viena konsoles komanda fl32:import:prod, kas importē JSON failā aprakstÄ«tos produktus./etc/data/products.json":

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

Attēli importÄ“Å”anai ir katalogā ./etc/data/img.

Laiks 10 produktu importÄ“Å”anai, izmantojot Å”o metodi, manā klēpjdatorā ir aptuveni 10 sekundes. Ja mēs Å”o ideju attÄ«stām tālāk, var viegli nonākt pie secinājuma, ka stundā var ievest aptuveni 3600 produktu, bet 100 30 produktu imports var aizņemt aptuveni XNUMX stundas. Klēpjdatora aizstāŔana ar serveri ļauj nedaudz izlÄ«dzināt situāciju. VarbÅ«t pat vairākas reizes. Bet ne pēc lieluma kārtām. Iespējams, Å”is ātrums un lēnums zināmā mērā ir viens no projekta raÅ”anās iemesliem magento/async-import.

Radikāls risinājums importÄ“Å”anas ātruma palielināŔanai varētu bÅ«t tieÅ”a ievade datu bāzē, taču Å”ajā gadÄ«jumā tiek zaudētas visas Magento paplaÅ”ināŔanas ā€œlabÄ«basā€ - viss bÅ«s jādara ā€œuzlabotiā€. Tomēr tas ir tā vērts. Ja tas izdosies, nākamajā rakstā apsvērÅ”u pieeju ar tieÅ”u rakstÄ«Å”anu datu bāzē.

Avots: www.habr.com

Pievieno komentāru