Magento 2: inportatu produktuak zuzenean datu-basera
Π aurreko artikulua Magento 2-ra produktuak inportatzeko prozesua ohiko moduan deskribatu nuen: eredu eta biltegien bidez. Ohiko metodoak datuak prozesatzeko abiadura oso baxua du. Nire ordenagailu eramangarriak segundoko produktu bat inguru ekoizten zuen. Jarraipen honetan, produktu bat inportatzeko modu alternatibo bat hartzen dut kontuan, datu-basean zuzenean sartuz, Magento 2 mekanismo estandarrak (ereduak, fabrikak, biltegiak) alde batera utziz. Produktuak inportatzeko urratsen sekuentzia MySQLrekin lan egin dezakeen edozein programazio-lengoaietara egokitu daiteke.
Lege-oharra: Magentok prest egindako funtzionalitateak ditu datuak inportatzea eta, ziurrenik, nahikoa izango zaizu. Dena den, inportazio-prozesuaren kontrol osoa behar baduzu, duzunarentzat CSV fitxategi bat prestatzera mugatu gabe, ongi etorri cat.
Bi artikuluak idaztean sortutako kodea Magento moduluan ikus daiteke "flancer32/mage2_ext_demo_import". Hona hemen demo moduluaren kodea sinplifikatzeko jarraitu ditudan murrizketa batzuk:
Produktuak soilik sortzen dira, ez eguneratzen.
Biltegi bat
Kategorien izenak bakarrik inportatzen dira, haien egiturarik gabe
Erregistratu berri den produktuak ez du oraindik izenik edo deskribapenik. Hau guztia bidez egiten da EAV atributuak. Hona hemen produktua aurrealdean behar bezala bistaratzeko behar diren oinarrizko produktuen ezaugarrien zerrenda:
name
price
description
short_description
status
tax_class_id
url_key
visibility
Honelako produktu bati beste atributu bat gehitzen zaio (bere kodetik identifikatzailea eta atributu mota lortzeko xehetasunak ez dira falta):
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);
}
}
Atributu kodea erabiliz, bere id eta datu mota zehazten ditugu (datetime, decimal, int, text, varchar), ondoren idatzi administrazio-leihorako datuak dagokion taulan (store_id = 0).
Produktuari goiko atributuak gehitu ondoren, argazki hau jasoko duzu administrazio panelean:
Inbentarioaren datuak
Magentoko 2.3 bertsiotik hasita, bi taula multzo paralelo daude inbentarioaren informazioa gordetzeko (produktu-kopurua):
cataloginventory_*: egitura zaharra;
inventory_*: egitura berria (MSI - Multi Source Inventory);
Bi egituretan inbentario-datuak gehitu behar dituzu, zeren egitura berria ez da oraindik zaharretik guztiz independentea (oso litekeena da default biltegia egitura berrian mahai batek parte hartzen du cataloginventory_stock_status gisa inventory_stock_1).
katalogoaren inbentarioa_
Magneto 2.3 zabaltzean hasieran 2 sarrera ditugu store_website, bi guneri dagokio: administratiboa eta bezero nagusia:
Hau da, gure egitura zaharrean βbiltegiβ bakarra dago (stock) eta administrazioaren webgunera estekatuta dago. Admin panelaren bidez berriak gehitzea sources/stocks MSIn (egitura berria) ez du sarrera berririk sortzen cataloginventory_stock.
Egitura zaharreko produktuei buruzko inbentario-datuak tauletan erregistratzen dira hasieran:
cataloginventory_stock_item
cataloginventory_stock_status
katalogo-inventarioa_stock_elementua
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);
}
inbentarioa_
Hasieran, inbentarioaren datuak gordetzeko egitura berriak 1 " dauka.iturri'(inventory_source):
Β«IturriaΒ» produktuen biltegiratze fisikoa adierazten du (erregistroak koordenatu fisikoak eta posta helbidea ditu). "Π‘ΠΊΠ»Π°Π΄"hainbat "iturri"ren batasun logikoa da (inventory_source_stock_link)
salmenta-kanalarekiko konexioa gertatzen den mailan (inventory_stock_sales_channel)
type |code|stock_id|
-------|----|--------|
website|base| 1|
Datuen egituraren arabera, hainbat salmenta kanal mota suposatzen dira, baina lehenespenez konexioa bakarrik "stock"-""(Webgunerako estekak webgunearen kodeari jarraitzen dio - base).
Bat "denda"hainbatekin lotu daiteke"iturri"eta bat"iturri"- hainbatei"biltegiak"(askoren arteko harremana). Salbuespenak lehenetsiak dira "iturri"Eta"denda". Ez daude berriro lotzen beste entitateekin (kode mailan muga - errorea "Ezin da gorde iturri lehenetsiarekin edo stock lehenetsiarekin erlazionatutako esteka"). Magento 2-n MSI egiturari buruzko xehetasun gehiago " artikuluan aurki daitezkeBiltegiak kudeatzeko sistema CQRS eta Event Sourcing erabiliz. Diseinua".
Lehenetsitako konfigurazioa erabiliko dut eta inbentarioaren informazio guztia gehituko dut iturrira default, kodearekin webguneari lotutako salmenta kanalean parte hartzen duena base (dendaren aurrealdeari dagokio - ikus store_website):
Admin panelean produktuari inbentario-datuak gehitu ondoren, argazki hau jasoko duzu:
media
Admin panelaren bidez produktu bati irudi bat "eskuz" gehitzean, dagokion informazioa hurrengo tauletan idazten da:
catalog_product_entity_media_gallery: multimedia-erregistroa (irudiak eta bideo-fitxategiak);
catalog_product_entity_media_gallery_value: komunikabideak produktuekin eta erakusleihoekin lotzea (lokalizazioa);
catalog_product_entity_media_gallery_value_to_entity: multimedia produktuekin soilik lotzea (ustez produktuaren multimedia eduki lehenetsia);
catalog_product_entity_varchar: Irudia erabiltzen den rolak gordetzen dira hemen;
eta irudiak berak direktorioan gordetzen dira ./pub/media/catalog/product/x/y/Non x ΠΈ y β Irudi-fitxategiaren izenaren lehen eta bigarren letrak. Adibidez, fitxategia image.png gisa gorde behar da ./pub/media/catalog/product/i/m/image.png, plataformak irudi gisa erabil dezan katalogoko produktuak deskribatzerakoan.
katalogo_produktu_entitate_media_galeria
Erregistratu argitaratuta ./pub/media/catalog/product/ multimedia fitxategia (fitxategia bera jartzeko prozesua ez da artikulu honetan eztabaidatzen):
Erregistratutako multimedia-fitxategia dagokion produktuarekin lotzen dugu inongo erakusleihoetara lotu gabe. Ez dago argi non erabiltzen diren zehatz-mehatz datu horiek eta zergatik den ezinezkoa den aurreko taulako datuetara sartzea, baina taula hau existitzen da eta produktuari argazki bat gehitzean datuak bertan idazten dira. Beraz, hori da.
Multimedia-fitxategi bat rol ezberdinekin erabil daiteke (dagokion atributu-kodea parentesi artean adierazten da):
Oinarria(image)
Irudi txikia (small_image)
Miniatura (thumbnail)
Swatch irudia (swatch_image)
Rolak multimedia-fitxategi bati lotzea da zehazki gertatzen dena catalog_product_entity_varchar. Lotura-kodea ""-ko kodearen antzekoa daProduktuaren oinarrizko ezaugarriak".
Admin panelean produktuari irudi bat gehitu ondoren, itxura hau du:
ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ
Kategoriaren arabera datuak dituzten taula nagusiak:
catalog_category_entity: kategorien erregistroa;
catalog_category_product: produktuen eta kategorien arteko lotura;
Id=1 duen kategoria Magento katalogo osoaren erroa da eta ez dago erabilgarri ez administrazio-panelean ez aurreko orrian. Id=2 duen kategoria (Kategoria lehenetsia) gune nagusiaren denda nagusiaren erro kategoria da (Webgune nagusia denda) aplikazioa zabaltzen denean sortu da (ikus. Administratzailea / Dendak / Dendak guztiak). Gainera, dendaren erro-kategoria bera ere ez dago eskuragarri aurrealdean, bere azpikategoriak bakarrik.
Artikulu honen gaia oraindik produktuen datuak inportatzen ari denez, ez dut datu-basean sarrera zuzena erabiliko kategoriak sortzerakoan, baizik eta Magentok berak emandako klaseak (ereduak eta biltegiak) erabiliko ditu. Datu-basean zuzeneko sarrera inportatutako produktua kategoria batekin lotzeko soilik erabiltzen da (kategoria bere izenarekin bat dator, eta kategoriako IDa lortzen da parekatzean):
Produktuak administrazio panelean ekintza gehigarriak egin ondoren:
eta aurrealdean:
Laburpena
Aurreko artikuluko produktu-multzo bera (10 pieza) gutxienez magnitude ordena bat azkarrago inportatzen da (segundo 1 versus 10). Abiadura zehatzago kalkulatzeko, produktu-kopuru handiagoa behar duzu, ehunka, edo hobeto esanda, milaka. Hala ere, sarrerako datuen tamaina txikia izanik ere, Magentok eskaintzen dituen tresnen (ereduak eta biltegiak) erabilera esanguratsua dela ondoriozta dezakegu (azpimarratzen dut - askoz!) behar diren funtzionalitateen garapena bizkortu, baina aldi berean nabarmen (azpimarratzen dut - askoz!) murriztu datuak datu-basean sartzeko abiadura.
Ondorioz, ura bustita zegoen eta hau ez da errebelazioa. Hala ere, orain badut kodea jolasteko eta agian ondorio interesgarriagoak ateratzeko.