Magento minangka solusi e-commerce, yaiku. luwih ngarahake adol produk tinimbang gudang, logistik utawa akuntansi finansial sing ngiringi dodolan. Aplikasi liyane (contone, sistem ERP) luwih cocog kanggo aplikasi sing ngiringi. Mulane, ing praktik nggunakake Magento, tugas nggabungake toko karo sistem liyane (contone, 1C) muncul.
UmumΓ©, integrasi bisa dikurangi dadi replikasi data kanthi:
- katalog (produk, kategori);
- data persediaan (imbangan produk ing gudang lan rega);
- klien;
- pesenan;
Magento nawakake kelas obyek sing kapisah kanggo manipulasi data ing basis data -
Pelanggan lan pesenan biasane ditiru ing arah liyane - saka Magento menyang sistem ERP eksternal. Mula, luwih gampang karo dheweke, ing sisih Magento sampeyan mung kudu milih data sing cocog, banjur "peluru mabur metu saka sisih kita".
Prinsip ngrekam data menyang database
Ing wayahe, nggawe obyek disimpen ing database programmatically ing Magento wis rampung liwat
function __construct (MagentoCmsModelBlockFactory $blockFactory) {
$this->blockFactory = $blockFactory;
}
/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();
lan nulis kanggo database rampung liwat
function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
$this->blockRepo = $blockRepo;
}
$this->blockRepo->save($block);
Pendekatan "Pabrik" lan "Repositori" bisa digunakake kanggo kabeh model utama ing domain Magento 2.
Informasi Produk dhasar
Aku ndeleng struktur data sing cocog karo versi Magento 2.3. Informasi paling dhasar babagan produk kasebut ana ing tabel catalog_product_entity
(daftar produk):
entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at
Aku diwatesi mung siji jinis produk (type_id='simple'
), kumpulan atribut standar (attribute_set_id=4
) lan nglirwakake atribut has_options
ΠΈ required_options
. Wiwit atribut entity_id
, created_at
ΠΈ updated_at
digawe kanthi otomatis, banjur, nyatane, kanggo nambah produk anyar, kita mung kudu nyetel sku
. Aku nindakake iki:
/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);
lan aku njaluk pangecualian:
The "Product Name" attribute value is empty. Set the attribute and try again.
Aku nambahake jeneng produk menyang panyuwunan lan entuk pesen yen atribut kasebut ilang Price
. Sawise nambahake rega, produk kasebut ditambahake menyang database:
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);
Jeneng produk disimpen ing tabel atribut varchar produk (catalog_product_entity_varchar
), rega - ing meja catalog_product_entity_decimal
. Sadurunge nambahake produk, disaranake kanthi jelas nuduhake yen kita nggunakake storefront administratif kanggo ngimpor data:
/** @var MagentoStoreModelStoreManagerInterface $manStore */
$manStore->setCurrentStore(0);
Atribut Tambahan
Ngolah atribut produk tambahan nggunakake Magento minangka kesenengan. Model data EAV kanggo entitas utama (ndeleng tabel eav_entity_type
) minangka salah sawijining fitur utama platform iki. Kita mung nambah atribut sing cocog kanggo model produk:
$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// ΠΈΠ»ΠΈ
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);
lan nalika nyimpen model liwat obyek repo:
$repoProd->save($prod);
atribut tambahan uga bakal disimpen ing tabel database sing cocog.
Data persediaan
Ing istilah prasaja - jumlah produk ing saham. Ing Magento 2.3, struktur ing basis data sing nggambarake format kanggo nyimpen data inventaris yaiku
/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
'is_in_stock' => true,
'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);
Media
Minangka aturan, dhukungan media kanggo produk kanggo klien ing toko (e-commerce) beda karo dhukungan media kanggo produk sing padha kanggo karyawan ing sistem akuntansi internal (ERP). Ing kasus sing sepisanan, dianjurake kanggo nuduhake produk kanthi adhep-adhepan; ing kaloro, cukup kanggo menehi gambaran umum babagan produk kasebut. Nanging, mindhah paling ora gambar utama produk cukup umum. case
nalika ngimpor data.
Nalika nambahake gambar liwat panel admin, gambar kasebut pisanan disimpen ing direktori sementara (./pub/media/tmp/catalog/product
) lan mung nalika nyimpen produk dipindhah menyang direktori media (./pub/media/catalog/product
). Uga, nalika ditambahake liwat panel admin, gambar kasebut diwenehi tag 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 sawetara alasan, media disambungake mung sawise nyimpen produk kasebut lan njupuk maneh saka gudang. Lan sampeyan kudu nemtokake atribut kasebut label
nalika nambahake entri menyang galeri media produk (yen ora, kita entuk pangecualian Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516
).
Kategori
Asring, struktur kategori toko lan aplikasi backend utawa panggonan produk ing kono bisa beda-beda sacara signifikan. Sastranegara kanggo migrasi data babagan kategori lan produk ing jerone gumantung saka akeh faktor. Ing conto iki, aku tetep ing ngisor iki:
- backend lan kategori toko dibandhingake jeneng;
- yen kategori diimpor sing ora ana ing toko, banjur digawe ing kategori root (
Default Category
) lan posisi luwih lanjut ing katalog toko dianggep kanthi manual; - produk ditugasake menyang kategori mung nalika digawe ing toko (impor pisanan);
Informasi dhasar babagan kategori kasebut ana ing tabel catalog_category_entity
(katalog kategori). Nggawe kategori ing Magento:
/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);
Nyambungake produk menyang kategori ditindakake nggunakake ID kategori lan SKU produk:
/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);
Total
Nulis kode kanggo nambah produk kanthi program Magento 2 cukup gampang. Aku wis nggabungake kabeh sing kasebut ing ndhuwur dadi modul demo "fl32:import:prod
, sing ngimpor produk sing diterangake ing file JSON "
[
{
"sku": "...",
"name": "...",
"desc": "...",
"desc_short": "...",
"price": ...,
"qty": ...,
"categories": ["..."],
"image_path": "..."
}
]
Gambar kanggo ngimpor ana ing katalog ./etc/data/img
.
Wektu ngimpor 10 produk nggunakake metode iki kira-kira 10 detik ing laptopku. Yen kita ngembangake gagasan iki luwih, iku gampang teka menyang kesimpulan sing bab 3600 produk bisa diimpor saben jam, lan bisa njupuk bab 100 jam kanggo ngimpor 30K produk. Ngganti laptop nganggo server ngidini sampeyan ngrampungake kahanan kasebut. Mungkin malah kaping pirang-pirang. Nanging ora kanthi pesenan gedhene. Mbok menawa kacepetan lan kalem iki minangka salah sawijining alesan kanggo muncule proyek kasebut
Solusi radikal kanggo nambah kacepetan impor bisa uga langsung mlebu menyang database, nanging ing kasus iki, kabeh "barang" babagan ekstensibilitas Magento ilang - sampeyan kudu nindakake kabeh "maju" dhewe. Nanging, iku worth iku. Yen bisa, aku bakal nimbang pendekatan kanthi nulis langsung menyang database ing artikel sabanjure.
Source: www.habr.com