ProHoster > blog > Utawala > Magento 2: ingiza bidhaa moja kwa moja kwenye hifadhidata
Magento 2: ingiza bidhaa moja kwa moja kwenye hifadhidata
Π makala iliyopita Nilielezea mchakato wa kuagiza bidhaa kwenye Magento 2 kwa njia ya kawaida - kupitia mifano na hifadhi. Njia ya kawaida ina kasi ya chini sana ya usindikaji wa data. Laptop yangu ilikuwa ikitoa takriban bidhaa moja kwa sekunde. Katika mwendelezo huu, ninazingatia njia mbadala ya kuagiza bidhaa - kwa kuingia moja kwa moja kwenye hifadhidata, kupitisha mifumo ya kawaida ya Magento 2 (mifano, viwanda, hazina). Mlolongo wa hatua za kuagiza bidhaa unaweza kubadilishwa kwa lugha yoyote ya programu ambayo inaweza kufanya kazi na MySQL.
Onyo: Magento ina utendakazi tayari kwa uagizaji wa data na, uwezekano mkubwa, itakuwa ya kutosha kwako. Hata hivyo, ikiwa unahitaji udhibiti kamili zaidi wa mchakato wa kuleta, sio tu katika kuandaa faili ya CSV kwa ulicho nacho, karibu cat.
Nambari inayotokana na kuandika nakala zote mbili inaweza kutazamwa kwenye moduli ya Magento "flancer32/mage2_ext_demo_import". Hapa kuna vizuizi kadhaa nilivyofuata ili kurahisisha nambari ya moduli ya onyesho:
Bidhaa zinaundwa tu, sio kusasishwa.
Ghala moja
Majina ya kategoria pekee ndiyo yanaletwa, bila muundo wao
Bidhaa mpya iliyosajiliwa bado haina jina au maelezo. Haya yote yanafanywa kupitia Tabia za EAV. Hapa kuna orodha ya sifa za msingi za bidhaa ambazo zinahitajika ili bidhaa ionyeshwe kwa usahihi mbele:
name
price
description
short_description
status
tax_class_id
url_key
visibility
Sifa tofauti huongezwa kwa bidhaa kama hii (maelezo ya kupata kitambulisho na aina ya sifa kutoka kwa nambari yake yameachwa):
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);
}
}
Kwa kutumia nambari ya sifa, tunaamua kitambulisho chake na aina ya data (datetime, decimal, int, text, varchar), kisha andika data ya dirisha la kiutawala kwenye jedwali linalofaa (store_id = 0).
Baada ya kuongeza sifa zilizo hapo juu kwa bidhaa, unapata picha hii kwenye paneli ya msimamizi:
Data ya hesabu
Kuanzia toleo la 2.3 katika Magento, kuna seti mbili sambamba za jedwali zinazotoa uhifadhi wa taarifa ya hesabu (idadi ya bidhaa):
cataloginventory_*: muundo wa zamani;
inventory_*: muundo mpya (MSI - Multi Source Inventory);
Unahitaji kuongeza data ya hesabu kwa miundo yote miwili, kwa sababu muundo mpya bado haujajitegemea kabisa na ule wa zamani (kuna uwezekano mkubwa kwamba kwa default ghala katika muundo mpya meza inahusika cataloginventory_stock_status kama inventory_stock_1).
orodha ya orodha_
Wakati wa kupeleka Magneto 2.3 mwanzoni tuna maingizo 2 ndani store_website, ambayo inalingana na tovuti mbili - kiutawala na mteja mkuu:
Hiyo ni, katika muundo wetu wa zamani kuna "ghala" moja tu (stock) na imeunganishwa na tovuti ya utawala. Kuongeza mpya kupitia paneli ya msimamizi sources/stocks katika MSI (muundo mpya) haileti maingizo mapya cataloginventory_stock.
Data ya hesabu kuhusu bidhaa katika muundo wa zamani hurekodiwa awali katika jedwali:
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);
}
orodha_
Hapo awali, muundo mpya wa kuhifadhi data ya hesabu una 1 ".chanzo'(inventory_source):
Β«ChanzoΒ» inawakilisha hifadhi halisi ya bidhaa (rekodi ina viwianishi halisi na anwani ya barua). "Ghala"ni muungano wa kimantiki wa "vyanzo" kadhaa (inventory_source_stock_link)
kwa kiwango ambacho unganisho kwenye chaneli ya mauzo hufanyika (inventory_stock_sales_channel)
type |code|stock_id|
-------|----|--------|
website|base| 1|
Kwa kuzingatia muundo wa data, aina mbalimbali za njia za mauzo huchukuliwa, lakini kwa chaguo-msingi tu unganisho "hisa"-"tovuti"(kiungo cha tovuti kinafuata msimbo wa tovuti - base).
Moja"ghala"inaweza kuunganishwa na kadhaa"vyanzo"na moja"chanzo"- kwa kadhaa"maghala"(uhusiano wa wengi kwa wengi). Isipokuwa ni chaguomsingi "chanzo"Na"ghala". Hazijaunganishwa tena na vyombo vingine (kizuizi katika kiwango cha nambari - kosa "Haiwezi kuhifadhi kiungo kinachohusiana na Chanzo Chaguomsingi au Hisa Chaguomsingi"). Maelezo zaidi juu ya muundo wa MSI katika Magento 2 yanaweza kupatikana katika kifungu "Mfumo wa usimamizi wa ghala kwa kutumia CQRS na Upataji wa Tukio. Kubuni".
Nitatumia usanidi chaguo-msingi na kuongeza habari zote za hesabu kwenye chanzo default, ambayo inahusika katika njia ya mauzo inayohusishwa na tovuti iliyo na msimbo base (inalingana na mwisho wa mbele wa duka - tazama store_website):
Baada ya kuongeza data ya hesabu kwa bidhaa kwenye paneli ya msimamizi, unapata picha hii:
Vyombo vya habari
Unapoongeza picha kwa bidhaa kwa "mkono" kupitia paneli ya msimamizi, maelezo muhimu huandikwa katika majedwali yafuatayo:
catalog_product_entity_media_gallery: Usajili wa vyombo vya habari (picha na faili za video);
catalog_product_entity_media_gallery_value: kuunganisha vyombo vya habari kwa bidhaa na maonyesho (ujanibishaji);
catalog_product_entity_media_gallery_value_to_entity: kuunganisha midia kwa bidhaa pekee (huenda maudhui ya midia chaguomsingi kwa bidhaa);
catalog_product_entity_varchar: Majukumu ambayo picha inatumiwa yanahifadhiwa hapa;
na picha zenyewe zimehifadhiwa kwenye saraka ./pub/media/catalog/product/x/y/Ambapo x ΠΈ y β herufi ya kwanza na ya pili ya jina la faili ya picha. Kwa mfano, faili image.png inapaswa kuokolewa kama ./pub/media/catalog/product/i/m/image.png, ili jukwaa liweze kuitumia kama picha wakati wa kuelezea bidhaa kutoka kwa katalogi.
catalog_product_entity_media_gallery
Daftari limewekwa ndani ./pub/media/catalog/product/ faili ya media (mchakato wa kuweka faili yenyewe haujajadiliwa katika nakala hii):
Tunahusisha faili ya midia iliyosajiliwa na bidhaa husika bila kuunganishwa na mbele ya duka lolote. Haijulikani ni wapi hasa data hii inatumiwa na kwa nini haiwezekani kufikia data kutoka kwa meza ya awali, lakini meza hii ipo na data imeandikwa kwake wakati picha imeongezwa kwa bidhaa. Hivyo ndivyo ilivyo.
Faili ya midia inaweza kutumika na majukumu tofauti (msimbo wa sifa unaolingana umeonyeshwa kwenye mabano):
Msingi (image)
Picha Ndogo (small_image)
Kijipicha (thumbnail)
Swatch Picha (swatch_image)
Kuunganisha majukumu na faili ya midia ndio hasa hufanyika catalog_product_entity_varchar. Nambari ya kumfunga ni sawa na nambari ya "Tabia za msingi za bidhaa".
Baada ya kuongeza picha kwa bidhaa kwenye paneli ya msimamizi inaonekana kama hii:
Jamii
Jedwali kuu zilizo na data kwa kategoria:
catalog_category_entity: rejista ya makundi;
catalog_category_product: uhusiano kati ya bidhaa na makundi;
catalog_category_entity_*: Maadili ya sifa za EAV;
Hapo awali, katika programu tupu ya Magento, sajili ya kategoria ina aina 2 (nilifupisha majina ya safu: crt - created_at, upd - updated_at):
Kategoria yenye id=1 ndio mzizi wa katalogi nzima ya Magento na haipatikani ama kwenye paneli ya msimamizi au kwenye ukurasa wa mbele. Kitengo chenye id=2 (Aina Chaguomsingi) ni kategoria ya mizizi ya duka kuu la tovuti (Duka Kuu la Tovuti) iliyoundwa wakati programu inatumwa (tazama. Msimamizi / Maduka / Maduka Yote) Zaidi ya hayo, aina ya mizizi ya duka yenyewe pia haipatikani mbele, tu vijamii vyake.
Kwa kuwa mada ya kifungu hiki bado inaleta data kwenye bidhaa, sitatumia kuingia moja kwa moja kwenye hifadhidata wakati wa kuunda kategoria, lakini nitatumia madarasa yaliyotolewa na Magento yenyewe (mifano na kumbukumbu). Kuingia moja kwa moja kwenye hifadhidata kunatumika tu kuhusisha bidhaa iliyoagizwa na kategoria (aina inalinganishwa na jina lake, na kitambulisho cha kategoria kinarejeshwa wakati wa kulinganisha):
Baada ya kuongeza kiungo cha bidhaa kwenye kategoria za "Kitengo cha 1" na "Kitengo cha 2", maelezo ya bidhaa kwenye paneli ya msimamizi yanaonekana hivi:
Vitendo vya ziada
Baada ya kuagiza data kukamilika, unahitaji kukamilisha hatua zifuatazo za ziada:
data indexing: piga katika console ./bin/magento indexer:reindex;
Bidhaa kwenye paneli ya msimamizi baada ya kufanya vitendo vya ziada:
na mbele:
Muhtasari
Seti sawa ya bidhaa (vipande 10) kama katika makala iliyotangulia ni nje angalau amri ya ukubwa kwa kasi (sekunde 1 dhidi ya 10). Ili kukadiria kwa usahihi kasi, unahitaji idadi kubwa ya bidhaa - mia kadhaa, au bora zaidi maelfu. Walakini, hata kwa saizi ndogo kama hiyo ya data ya pembejeo, tunaweza kuhitimisha kuwa utumiaji wa zana zinazotolewa na Magento (mifano na hazina) ni muhimu (nasisitiza - mengi!) kuharakisha maendeleo ya utendaji unaohitajika, lakini wakati huo huo kwa kiasi kikubwa (nasisitiza - mengi!) punguza kasi ambayo data huingia kwenye hifadhidata.
Matokeo yake, maji yaligeuka kuwa mvua na hii sio ufunuo. Walakini, sasa nina nambari ya kucheza nayo na labda kufikia hitimisho la kupendeza zaidi.