Magento 2: ngimpor produk langsung menyang database
Π artikel sadurunge Aku nerangake proses ngimpor produk menyang Magento 2 kanthi cara biasa - liwat model lan repositori. Cara biasanipun nduweni kacepetan pangolahan data sing sithik banget. Laptopku ngasilake kira-kira siji produk saben detik. Ing tutugan iki, aku nimbang cara alternatif kanggo ngimpor produk - kanthi entri langsung menyang database, ngliwati mekanisme standar Magento 2 (model, pabrik, repositori). Urutan langkah kanggo ngimpor produk bisa dicocogake karo basa pamrograman apa wae sing bisa digunakake karo MySQL.
Nolak tanggung jawab: Magento wis siap-digawe fungsi kanggo ngimpor data lan, paling kamungkinan, iku bakal cukup kanggo sampeyan. Nanging, yen sampeyan butuh kontrol sing luwih lengkap babagan proses impor, ora diwatesi kanggo nyiapake file CSV kanggo apa sing sampeyan duwe, welcome to cat.
Kode asil saka nulis loro artikel bisa dideleng ing modul Magento "flancer32/mage2_ext_demo_import". Ing ngisor iki sawetara watesan sing daktindakake kanggo nyederhanakake kode modul demo:
Produk mung digawe, ora dianyari.
Gudang siji
Mung jeneng kategori sing diimpor, tanpa strukture
Produk sing mentas kadhaptar durung duwe jeneng utawa katrangan. Kabeh iki rampung liwat atribut EAV. Mangkene dhaptar atribut produk dhasar sing dibutuhake supaya produk ditampilake kanthi bener ing ngarep:
name
price
description
short_description
status
tax_class_id
url_key
visibility
Atribut kapisah ditambahake menyang produk kaya iki (rincian kanggo entuk pengenal lan jinis atribut saka kode kasebut diilangi):
public function create($prodId, $attrCode, $attrValue)
{
$attrId = /* get attribute ID by attribute code */
$attrType = /* get attribute type [datetime|decimal|int|text|varchar]) by attribute code */
if ($attrId) {
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$tblName = 'catalog_product_entity_' . $attrType;
$table = $this->resource->getTableName($tblName);
$bind = [
'attribute_id' => $attrId,
'entity_id' => $prodId,
/* put all attributes to default store view with id=0 (admin) */
'store_id' => 0,
'value' => $attrValue
];
$conn->insert($table, $bind);
}
}
Nggunakake kode atribut, kita nemtokake id lan jinis data (datetime, decimal, int, text, varchar), banjur tulis data kanggo jendhela administratif menyang tabel sing cocog (store_id = 0).
Sawise nambahake atribut ing ndhuwur menyang produk, sampeyan entuk gambar iki ing panel admin:
Data persediaan
Miwiti saka versi 2.3 ing Magento, ana rong set tabel paralel sing nyedhiyakake panyimpenan informasi inventaris (jumlah produk):
cataloginventory_*: struktur lawas;
inventory_*: struktur anyar (MSI - Multi Source Inventory);
Sampeyan kudu nambah data persediaan kanggo loro struktur, amarga struktur anyar durung rampung independen saka lawas (iku banget kamungkinan sing kanggo default gudang ing struktur anyar Tabel melu cataloginventory_stock_status minangka inventory_stock_1).
katalog inventaris_
Nalika deploying Magneto 2.3 kita pisanan duwe 2 entri ing store_website, sing cocog karo rong situs - klien administratif lan utama:
Yaiku, ing struktur lawas kita mung ana siji "gudang" (stock) lan disambung menyang situs web administratif. Nambahake sing anyar liwat panel admin sources/stocks ing MSI (struktur anyar) ora ngasilake entri anyar ing cataloginventory_stock.
Data inventaris babagan produk ing struktur lawas wiwitane dicathet ing tabel:
cataloginventory_stock_item
cataloginventory_stock_status
cataloginventory_stock_item
function createOldItem($prodId, $qty)
{
$isQtyDecimal = (((int)$qty) != $qty);
$isInStock = ($qty > 0);
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$table = $this->resource->getTableName('cataloginventory_stock_item');
$bind = [
'product_id' => $prodId,
/* we use one only stock in 'cataloginventory' structure by default */
'stock_id' => 1,
'qty' => $qty,
'is_qty_decimal' => $isQtyDecimal,
'is_in_stock' => $isInStock,
/* default stock is bound to admin website (see `cataloginventory_stock`) */
'website_id' => 0
];
$conn->insert($table, $bind);
}
cataloginventory_stock_status
function createOldStatus($prodId, $qty)
{
$isInStock = ($qty > 0);
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$table = $this->resource->getTableName('cataloginventory_stock_status');
$bind = [
'product_id' => $prodId,
/* we use one only stock in 'cataloginventory' structure by default */
'stock_id' => 1,
'qty' => $qty,
'stock_status' => MagentoCatalogInventoryApiDataStockStatusInterface::STATUS_IN_STOCK,
/* default stock is bound to admin website (see `cataloginventory_stock`) */
'website_id' => 0
];
$conn->insert($table, $bind);
}
inventaris_
Kaping pisanan, struktur anyar kanggo nyimpen data inventaris ngemot 1 "sumber"(inventory_source):
Β«SumberΒ» nggantosi panyimpenan fisik kanggo produk (cathetan ngemot koordinat fisik lan alamat layang). "Gudang"iku gabungan logis saka sawetara "sumber" (inventory_source_stock_link)
ing tingkat sing ana sambungan menyang saluran penjualan (inventory_stock_sales_channel)
type |code|stock_id|
-------|----|--------|
website|base| 1|
Miturut struktur data, macem-macem jinis saluran penjualan dianggep, nanging kanthi standar mung sambungan "Simpenan"-"situs"(link menyang situs web ngetutake kode situs web - base).
siji"gudang"bisa nyambung menyang sawetara"sumber"lan siji"sumber"- kanggo sawetara"gudang"(hubungan many-to-many). Pengecualian minangka standar'sumber"Lan"gudang". Dheweke ora disambung maneh menyang entitas liyane (watesan ing tingkat kode - kesalahan "Ora bisa nyimpen link sing gegandhengan karo Sumber Default utawa Simpenan Default"). Rincian liyane babagan struktur MSI ing Magento 2 bisa ditemokake ing artikel "Sistem manajemen gudang nggunakake CQRS lan Event Sourcing. Desain".
Aku bakal nggunakake konfigurasi gawan lan nambah kabeh informasi persediaan kanggo sumber default, sing melu saluran penjualan sing ana gandhengane karo situs web kanthi kode kasebut base (cocog karo mburi ngarep toko - ndeleng store_website):
File media bisa digunakake kanthi peran sing beda-beda (kode atribut sing cocog dituduhake ing kurung):
dhasar (image)
Gambar cilik (small_image)
Gambar cilik (thumbnail)
Gambar Swatch (swatch_image)
Nyambungake peran menyang file media persis apa sing kedadeyan catalog_product_entity_varchar. Kode binding padha karo kode ing "Atribut produk dhasar".
Sawise nambahake gambar menyang produk ing panel admin katon kaya iki:
Kategori
Tabel utama sing ngemot data miturut kategori:
catalog_category_entity: daftar kategori;
catalog_category_product: sambungan antarane produk lan kategori;
catalog_category_entity_*: Nilai atribut EAV;
Kaping pisanan, ing aplikasi Magento kosong, registri kategori ngemot 2 kategori (Aku nyepetake jeneng kolom: crt - created_at, upd - updated_at):
Kategori kanthi id=1 minangka oyod saka kabeh katalog Magento lan ora kasedhiya ing panel admin utawa ing kaca ngarep. Kategori kanthi id=2 (Kategori Default) minangka kategori root kanggo toko utama situs utama (Toko Website Utama) digawe nalika aplikasi disebarake (ndeleng. Admin / Toko / Kabeh Toko). Kajaba iku, kategori ROOT saka toko dhewe uga ora kasedhiya ing ngarep, mung subkategori sawijining.
Wiwit topik artikel iki isih ngimpor data babagan produk, aku ora bakal nggunakake entri langsung menyang database nalika nggawe kategori, nanging bakal nggunakake kelas sing diwenehake dening Magento dhewe (model lan repositori). Entri langsung menyang database mung digunakake kanggo nggandhengake produk sing diimpor karo kategori (kategori cocog karo jenenge, lan id kategori dijupuk nalika cocog):
Produk ing panel admin sawise nindakake tindakan tambahan:
lan ing ngarep:
Ringkesan
Set produk sing padha (10 potongan) kaya ing artikel sadurunge diimpor paling sethithik urutan gedhene luwih cepet (1 detik lawan 10). Kanggo ngira kacepetan kanthi luwih akurat, sampeyan butuh luwih akeh produk - sawetara atus, utawa luwih ewonan. Nanging, sanajan kanthi ukuran data input sing cilik, kita bisa nyimpulake yen panggunaan alat sing diwenehake dening Magento (model lan repositori) penting (aku nandheske - akeh!) nyepetake pangembangan fungsi sing dibutuhake, nanging ing wektu sing padha sacara signifikan (aku nandheske - akeh!) nyuda kacepetan ing data nemu menyang database.