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 -
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
function __construct (MagentoCmsModelBlockFactory $blockFactory) {
$this->blockFactory = $blockFactory;
}
/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();
jeung nulis ka database dipigawé ngaliwatan
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
/** @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 "fl32:import:prod
, anu ngimpor produk anu dijelaskeun dina file 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
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