Magento 2: Ngimpor Produk ti Sumber Luar

Magento mangrupikeun solusi e-commerce, nyaéta. langkung ditujukeun pikeun ngajual produk tibatan di gudang, logistik atanapi akuntansi kauangan anu ngiringan penjualan. Aplikasi séjén (contona, sistem ERP) langkung cocog pikeun aplikasi anu disarengan. Ku alatan éta, dina praktekna ngagunakeun Magento, tugas ngahijikeun toko sareng sistem anu sanés ieu (contona, 1C) timbul.

Sacara umum, integrasi bisa diréduksi jadi réplikasi data ku:

  • katalog (produk, kategori);
  • data inventaris (kasaimbangan produk di gudang sareng harga);
  • klien;
  • pesenan;

Magento nawiskeun kelas objék anu misah pikeun ngamanipulasi data dina pangkalan data - repositories. Kusabab spésifik Magento, nambihan data kana pangkalan data ngaliwatan repositori gampang dikodekeun, tapi éta, hayu urang nyarios, laun. Dina ieu publikasi, kuring mertimbangkeun tahapan utama programmatically nambahkeun produk ka Magento 2 dina cara "klasik" - ngagunakeun kelas repo.

Konsumén sareng pesenan biasana ditiru dina arah anu sanés - ti Magento ka sistem ERP éksternal. Ku sabab éta, langkung saderhana sareng aranjeunna, di sisi Magento anjeun ngan ukur kedah milih data anu pas, teras "pélor ngalayang kaluar ti sisi urang".

Prinsip ngarékam data kana pangkalan data

Di momen, nyieun objék disimpen dina database programmatically di Magento dipigawé ngaliwatan pabrik:

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

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

jeung nulis ka database dipigawé ngaliwatan Repository:

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

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

Pendekatan "Pabrik" sareng "Repository" tiasa dianggo pikeun sadaya modél utama dina domain Magento 2.

Émbaran Produk Dasar

Kuring ningali struktur data anu cocog sareng versi Magento 2.3. Inpormasi anu paling dasar ngeunaan produk aya dina tabél catalog_product_entity (pendaptaran produk):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Abdi dugi ka hiji jinis produk (type_id='simple'), sakumpulan atribut standar (attribute_set_id=4) jeung malire atribut has_options и required_options. Kusabab atribut entity_id, created_at и updated_at dihasilkeun sacara otomatis, lajeng, kanyataanna, pikeun nambahkeun produk anyar, urang ngan perlu nyetél sku. Kuring ngalakukeun ieu:

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

sareng kuring nampi pengecualian:

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

Kuring nambahkeun ngaran produk kana pamundut jeung meunang pesen yén atribut nu leungit Price. Saatos nambihan hargana, produkna ditambah kana pangkalan data:

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

Ngaran produk disimpen dina tabel atribut varchar produk (catalog_product_entity_varchar), harga - dina tabél catalog_product_entity_decimal. Sateuacan nambihan produk, disarankeun pikeun nunjukkeun sacara eksplisit yén kami nganggo toko administrasi pikeun ngimpor data:

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

Atribut tambahan

Ngolah atribut produk tambahan nganggo Magento mangrupikeun pelesir. Modél data EAV pikeun éntitas utama (tingali tabél eav_entity_type) nyaéta salah sahiji fitur konci platform ieu. Urang ngan saukur nambahkeun atribut luyu kana model produk:

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

sareng nalika nyimpen modél via obyék repo:

$repoProd->save($prod);

atribut tambahan ogé bakal disimpen dina tabel database pakait.

Data inventaris

Dina istilah basajan - jumlah produk di stock. Dina Magento 2.3, struktur dina pangkalan data anu ngajelaskeun format pikeun nyimpen data inventaris nyaéta béda sacara signifikan ti kajadian saméméhna. Sanajan kitu, nambahkeun kuantitas produk di stock via model produk teu leuwih hese ti nambahkeun atribut sejenna:

/** @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

Sakumaha aturan, dukungan média pikeun produk pikeun klien di toko (e-commerce) béda sareng dukungan média pikeun produk anu sami pikeun karyawan dina sistem akuntansi internal (ERP). Dina kasus nu pertama, éta sasaena pikeun nembongkeun produk pahareup-hareup; dina kadua, éta cukup pikeun masihan gambaran umum ngeunaan produk. Tapi, nransferkeun sahenteuna gambar primér produk anu cukup umum. case nalika ngimpor data.

Nalika nambahkeun gambar ngaliwatan panel admin, gambar munggaran disimpen dina diréktori samentara (./pub/media/tmp/catalog/product) jeung ngan lamun nyimpen produk dipindahkeun ka diréktori média (./pub/media/catalog/product). Ogé, nalika ditambahkeun via panel admin, gambar ditandaan 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);

Kanggo sababaraha alesan, média dikaitkeun ngan saatos nyimpen produk sareng nyandak deui tina gudang deui. Jeung anjeun kudu nangtukeun atribut label nalika nambihan éntri kana galeri média produk (upami urang nampi pengecualian Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

kategori

Seringna, struktur kategori toko sareng aplikasi backend atanapi panempatan produk di jerona tiasa bénten sacara signifikan. Strategi pikeun migrasi data ngeunaan kategori sareng produk di jerona gumantung kana sababaraha faktor. Dina conto ieu kuring lengket di handap:

  • backend jeung toko kategori dibandingkeun ku ngaran;
  • upami kategori diimpor anu henteu aya di toko, maka éta didamel dina kategori akar (Default Category) sareng posisi salajengnana dina katalog toko dianggap sacara manual;
  • produk ditugaskeun ka kategori ngan lamun dijieun di toko (impor munggaran);

Inpormasi dasar ngeunaan kategori aya dina tabél catalog_category_entity (katalog kategori). Nyiptakeun kategori di Magento:

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

Ngahubungkeun produk ka kategori dilaksanakeun nganggo ID kategori sareng SKU produk:

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

dina total

Nulis kode pikeun nambahkeun produk programmatically ka Magento 2 cukup gampang. Kuring geus ngagabungkeun sagalana dinyatakeun di luhur kana modul demo "flancer32 / mage2_ext_demo_import". Aya ngan hiji paréntah konsol dina modul nu fl32:import:prod, anu ngimpor produk anu dijelaskeun dina file JSON "./etc/data/products.json":

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

Gambar pikeun impor aya dina katalog ./etc/data/img.

Waktu ngimpor 10 produk nganggo metode ieu sakitar 10 detik dina laptop kuring. Lamun urang ngamekarkeun gagasan ieu salajengna, éta gampang pikeun datang ka kacindekan yén ngeunaan 3600 produk bisa diimpor per jam, sarta eta tiasa nyandak ngeunaan 100 jam pikeun ngimpor 30K produk. Ngaganti laptop sareng server ngamungkinkeun anjeun pikeun ngaleungitkeun kaayaan rada. Meureun malah sababaraha kali. Tapi henteu ku pesenan gedéna. Panginten laju sareng kalambatan ieu mangrupikeun salah sahiji alesan pikeun mecenghulna proyék magento / async-impor.

Solusi radikal pikeun ningkatkeun kagancangan impor tiasa langsung asup kana pangkalan data, tapi dina hal ieu, sadaya "goodies" ngeunaan extensibility Magento leungit - anjeun kedah ngalakukeun sadayana "maju" nyalira. Sanajan kitu, éta patut eta. Upami éta jalan, kuring bakal nganggap pendekatan kalayan tulisan langsung kana pangkalan data dina tulisan salajengna.

sumber: www.habr.com

Tambahkeun komentar