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.

Magento 2: ingiza bidhaa moja kwa moja kwenye hifadhidata

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
  • Miundo ya data inatii toleo la 2.3

JSON kwa kuingiza bidhaa moja:

{
  "sku": "MVA20D-UBV-3",
  "name": "Π—Π°Π³Π»ΡƒΡˆΠΊΠ° для ΠΏΠ»ΠΎΠΌΠ±ΠΈΡ€ΠΎΠ²ΠΊΠΈ ВА47-29 IEK",
  "desc": "ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ устройствам ...",
  "desc_short": "Π—Π°Π³Π»ΡƒΡˆΠΊΠ° для ΠΏΠ»ΠΎΠΌΠ±ΠΈΡ€ΠΎΠ²ΠΊΠΈ ВА47-29 IEK ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для ...",
  "price": 5.00,
  "qty": 25,
  "categories": ["ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 1", "ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 2"],
  "image_path": "mva20d_ubv_3.png"
}

Muhtasari wa hatua kuu za kuagiza

  • usajili wa bidhaa yenyewe
  • uhusiano kati ya bidhaa na tovuti
  • sifa za msingi za bidhaa (EAV)
  • data ya hesabu (idadi ya bidhaa katika hisa)
  • vyombo vya habari (picha)
  • uhusiano na kategoria za katalogi

Usajili wa Bidhaa

Habari ya msingi ya bidhaa inaweza kupatikana katika catalog_product_entity:

CREATE TABLE `catalog_product_entity` (
  `entity_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Entity Id',
  `attribute_set_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Attribute Set ID',
  `type_id` varchar(32) NOT NULL DEFAULT 'simple' COMMENT 'Type ID',
  `sku` varchar(64) DEFAULT NULL COMMENT 'SKU',
  `has_options` smallint(6) NOT NULL DEFAULT '0' COMMENT 'Has Options',
  `required_options` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Required Options',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation Time',
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Update Time',
  PRIMARY KEY (`entity_id`),
  KEY `CATALOG_PRODUCT_ENTITY_ATTRIBUTE_SET_ID` (`attribute_set_id`),
  KEY `CATALOG_PRODUCT_ENTITY_SKU` (`sku`)
)

Taarifa ya chini inayohitajika ili kuunda ingizo katika sajili ya bidhaa ni:

  • attribute_set_id
  • sku

ziada:

  • type_id - tusipoibainisha, basi 'rahisi' itatumika

Kuandika moja kwa moja kwa hifadhidata, ninatumia adapta ya DB ya Magento yenyewe:

function create($sku, $typeId, $attrSetId)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_product_entity');
    $bind = [
        'sku' => $sku,
        'type_id' => $typeId,
        'attribute_set_id' => $attrSetId
    ];
    $conn->insert($table, $bind);
    $result = $conn->lastInsertId($table);
    return $result;
}

Baada ya kusajili bidhaa na catalog_product_entity inaonekana kwenye paneli ya msimamizi, kwenye gridi ya bidhaa (Katalogi/Bidhaa).

Magento 2: ingiza bidhaa moja kwa moja kwenye hifadhidata

Uhusiano kati ya bidhaa na tovuti

Uhusiano wa bidhaa na tovuti huamua ambayo maduka na maonyesho ya bidhaa yatapatikana mbele.

function linkToWebsite($prodId, $websiteId)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_product_website');
    $bind = [
        'product_id' => $prodId,
        'website_id' => $websiteId
    ];
    $conn->insert($table, $bind);
}

Magento 2: ingiza bidhaa moja kwa moja kwenye hifadhidata

Tabia za msingi za bidhaa

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:

Magento 2: ingiza bidhaa moja kwa moja kwenye hifadhidata

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:

website_id|code |name        |sort_order|default_group_id|is_default|
----------|-----|------------|----------|----------------|----------|
         0|admin|Admin       |         0|               0|         0|
         1|base |Main Website|         0|               1|         1|

Jedwali cataloginventory_stock tuna ingizo moja tu:

stock_id|website_id|stock_name|
--------|----------|----------|
       1|         0|Default   |

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):

source_code|name          |enabled|description   |latitude|longitude|country_id|...|
-----------|--------------|-------|--------------|--------|---------|----------|...|
default    |Default Source|      1|Default Source|0.000000| 0.000000|US        |...|

na mmoja"ghala'(inventory_stock):

stock_id|name         |
--------|-------------|
       1|Default Stock|

Β«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)

link_id|stock_id|source_code|priority|
-------|--------|-----------|--------|
      1|       1|default    |       1|

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):

function createNewItem($sku, $qty)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('inventory_source_item');
    $bind = [
        'source_code' => 'default',
        'sku' => $sku,
        'quantity' => $qty,
        'status' => MagentoInventoryApiApiDataSourceItemInterface::STATUS_IN_STOCK
    ];
    $conn->insert($table, $bind);
}

Baada ya kuongeza data ya hesabu kwa bidhaa kwenye paneli ya msimamizi, unapata picha hii:

Magento 2: ingiza bidhaa moja kwa moja kwenye hifadhidata

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.

Daftari limewekwa ndani ./pub/media/catalog/product/ faili ya media (mchakato wa kuweka faili yenyewe haujajadiliwa katika nakala hii):

function createMediaGallery($imgPathPrefixed)
{
    $attrId = /* get attribute ID by attribute code 'media_gallery' */
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_product_entity_media_gallery');
    $bind = [
        'attribute_id' => $attrId,
        'value' => $imgPathPrefixed,
        /* 'image' or 'video' */
        'media_type' => 'image',
        'disabled' => false
    ];
    $conn->insert($table, $bind);
    $result = $conn->lastInsertId($table);
    return $result;
}

Inaposajiliwa, faili mpya ya midia inapewa kitambulisho.

Tunahusisha faili ya midia iliyosajiliwa na bidhaa inayolingana kwa mbele ya duka chaguomsingi:

function createGalleryValue($mediaId, $prodId)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_product_entity_media_gallery_value');
    $bind = [
        'value_id' => $mediaId,
        /* use admin store view by default */
        'store_id' => 0,
        'entity_id' => $prodId,
        'label' => null,
        /* we have one only image */
        'position' => 1,
        'disabled' => false
    ];
    $conn->insert($table, $bind);
}

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.

function createGalleryValueToEntity($mediaId, $prodId)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_product_entity_media_gallery_value_to_entity');
    $bind = [
        'value_id' => $mediaId,
        'entity_id' => $prodId
    ];
    $conn->insert($table, $bind);
}

catalog_product_entity_varchar

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:

Magento 2: ingiza bidhaa moja kwa moja kwenye hifadhidata

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):

entity_id|attribute_set_id|parent_id|crt|upd|path|position|level|children_count|
---------|----------------|---------|---|---|----|--------|-----|--------------|
        1|               3|        0|...|...|1   |       0|    0|             1|
        2|               3|        1|...|...|1/2 |       1|    1|             0|

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):

function create($prodId, $catId)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_category_product');
    $bind = [
        'category_id' => $catId,
        'product_id' => $prodId,
    ];
    $conn->insert($table, $bind);
}

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:

Magento 2: ingiza bidhaa moja kwa moja kwenye hifadhidata

Vitendo vya ziada

Baada ya kuagiza data kukamilika, unahitaji kukamilisha hatua zifuatazo za ziada:

  • data indexing: piga katika console ./bin/magento indexer:reindex;
  • kuunda upya URL za bidhaa/kategoria: unaweza kutumia kiendelezi "elgentos/regenerate-catalog-urlsΒ«

Bidhaa kwenye paneli ya msimamizi baada ya kufanya vitendo vya ziada:

Magento 2: ingiza bidhaa moja kwa moja kwenye hifadhidata

na mbele:

Magento 2: ingiza bidhaa moja kwa moja kwenye hifadhidata

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.

Chanzo: mapenzi.com