Magento 2: bubata ngwaahịa ozugbo na nchekwa data

В akụkọ gara aga Akọwara m usoro mbubata ngwaahịa na Magento 2 n'ụzọ a na-emebu - site na ụdị na ebe nchekwa. Usoro a na-emebu nwere ọsọ nhazi data dị ala. Laptọọpụ m nọ na-emepụta ihe dị ka otu ngwaahịa kwa nkeji. Na nke a na-aga n'ihu, m na-atụle ụzọ ọzọ isi bubata ngwaahịa - site na ịbanye ozugbo na nchekwa data, na-agafe usoro ọkọlọtọ Magento 2 (ụdị, ụlọ ọrụ, ebe nchekwa). Usoro usoro ibubata ngwaahịa nwere ike ime ka asụsụ mmemme ọ bụla nwere ike ịrụ ọrụ na MySQL.

Disclaimer: Magento nwere ọrụ emebere maka ya mbubata data na, dịcha, ọ ga-ezuru gị. Agbanyeghị, ọ bụrụ na ịchọrọ njikwa zuru oke na usoro mbubata, ọnweghị oke na ịkwadebe faịlụ CSV maka ihe ị nwere, nabata nwamba.

Magento 2: bubata ngwaahịa ozugbo na nchekwa data

Enwere ike ịlele koodu nke sitere na ide edemede abụọ ahụ na modul Magento "flancer32/mage2_ext_demo_import". Nke a bụ ụfọdụ mmachi m gbasoro iji mee ka koodu modul ngosi dị mfe:

  • A na-emepụta naanị ngwaahịa, anaghị emelite ya.
  • Otu ụlọ nkwakọba ihe
  • Naanị otu aha ka a na-ebubata, na-enweghị usoro ha
  • Ọdịdị data na-akwado ụdị 2.3

JSON maka ibubata otu ngwaahịa:

{
  "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"
}

Nchịkọta nke isi usoro mbubata

  • ndebanye aha ngwaahịa n'onwe ya
  • njikọ n'etiti ngwaahịa na weebụsaịtị
  • njirimara ngwaahịa (EAV)
  • data ngwa ahịa (ọnụọgụ ngwaahịa dị na ngwaahịa)
  • mgbasa ozi (foto)
  • njikọ na katalọgụ edemede

Ndebanye aha ngwaahịa

Enwere ike ịchọta ozi ngwaahịa n'ime 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`)
)

Ozi kacha nta achọrọ iji mepụta ntinye na ndekọ ngwaahịa bụ:

  • attribute_set_id
  • sku

mgbakwunye:

  • type_id - ọ bụrụ na anyị akọwaghị ya, mgbe ahụ, a ga-eji 'mfe' mee ihe

Iji dee ozugbo na nchekwa data, m na-eji ihe nkwụnye DB nke Magento n'onwe ya:

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;
}

Mgbe ị debanyere ngwaahịa na catalog_product_entity a na-ahụ ya na ngalaba nchịkwa, na grid ngwaahịa (Katalọgụ/ Ngwaahịa).

Magento 2: bubata ngwaahịa ozugbo na nchekwa data

Mmekọrịta dị n'etiti ngwaahịa na weebụsaịtị

Njikọ nke ngwaahịa ahụ na saịtị ahụ na-ekpebi ebe a na-echekwa ma gosipụta ngwaahịa a ga-adị n'ihu.

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: bubata ngwaahịa ozugbo na nchekwa data

Njirimara ngwaahịa bụ isi

Ngwaahịa edebanyere aha ọhụrụ enwebeghị aha ma ọ bụ nkọwa. Emere ihe a niile site na ya Njirimara EAV. Nke a bụ ndepụta nke njirimara ngwaahịa achọrọ ka ewepụtara ngwaahịa ahụ nke ọma n'ihu:

  • name
  • price
  • description
  • short_description
  • status
  • tax_class_id
  • url_key
  • visibility

A na-agbakwunye àgwà dị iche na ngwaahịa dị ka nke a (nkọwapụta nke inweta ihe nchọpụta na ụdị nke njirimara site na koodu ya):

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);
    }
}

N'iji koodu njirimara, anyị na-ekpebi id na ụdị data (datetime, decimal, int, text, varchar), wee dee data maka windo nhazi n'ime tebụl kwesịrị ekwesị (store_id = 0).

Ka ịgbakwunye njirimara ndị dị n'elu na ngwaahịa a, ị ga-enweta foto a na panel nchịkwa:

Magento 2: bubata ngwaahịa ozugbo na nchekwa data

Data ngwa ahịa

Malite na ụdị 2.3 na Magento, enwere tebụl abụọ yiri nke na-enye nchekwa nke ozi ngwa ahịa (ọnụọgụ ngwaahịa):

  • cataloginventory_*: ihe owuwu ochie;
  • inventory_*: ihe owuwu ọhụrụ (MSI - Multi Source Inventory);

Ịkwesịrị ịgbakwunye data ngwa ahịa na nhazi abụọ ahụ, n'ihi na ọhụrụ Ọdịdị bụ ma kpamkpam onwe nke ochie (ọ bụ nnọọ eleghi anya na maka default ụlọ nkwakọba ihe na nhazi ọhụrụ a na-etinye tebụl cataloginventory_stock_status dị ka inventory_stock_1).

katalọgụ_

Mgbe anyị na-ebuga Magneto 2.3 anyị nwere ntinye 2 na mbụ store_website, nke kwekọrọ na saịtị abụọ - nhazi na onye ahịa:

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

Tebụl cataloginventory_stock anyị nwere naanị otu ntinye:

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

Ya bụ, na ụlọ ochie anyị, e nwere naanị otu “ụlọ nkwakọba ihe” (stock) ma jikọta ya na webụsaịtị nchịkwa. Na-agbakwụnye ọhụrụ site na admin panel sources/stocks na MSI (ihe owuwu ọhụrụ) anaghị ebute ndenye ọhụrụ cataloginventory_stock.

A na-edekọ data ngwa ahịa gbasara ngwaahịa n'ụdị ochie na tebụl:

  • 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);
}

Ndepụta aha_

Na mbụ, usoro ọhụrụ maka ịchekwa data ngwa ahịa nwere 1 "isi iyi"(inventory_source):

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

na otu"nkwakọba ihe"(inventory_stock):

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

«Isi Iyi» na-anọchi anya nchekwa anụ ahụ maka ngwaahịa (ndekọ ahụ nwere nhazi anụ ahụ na adreesị nzipu ozi). "Nkwakọba"bụ njikọ ezi uche dị na ya nke ọtụtụ "isi mmalite" (inventory_source_stock_link)

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

na ọkwa nke njikọ na ọwa ahịa na-eme (inventory_stock_sales_channel)

type   |code|stock_id|
-------|----|--------|
website|base|       1|

Na-ekpe ikpe site na nhazi data, a na-ewere ụdị ọwa ahịa dị iche iche, mana na ndabara naanị njikọ "ngwaahịa"-"website"(njikọ na webụsaịtị na-esote koodu weebụsaịtị - base).

Otu"nkwakọba ihe"nwere ike jikọọ na ọtụtụ"isi mmalite"na otu"isi iyi"- na ọtụtụ"ụlọ nkwakọba ihe"(ọtụtụ-na-ọtụtụ mmekọrịta). Ewepụrụ bụ ndabara"isi iyi"Na"nkwakọba ihe". Ejikọtaghị ha na ụlọ ọrụ ndị ọzọ (mmachi na ọkwa koodu - njehie ahụ "Enweghị ike ichekwa njikọ metụtara Isi mmalite ma ọ bụ ebuka emeghị eme"). Enwere ike ịchọta nkọwa ndị ọzọ gbasara usoro MSI na Magento 2 n'isiokwu "Sistemụ njikwa ụlọ nkwakọba ihe na-eji CQRS na Ihe Omume. Nhazi".

M ga-eji nhazi ndabara wee tinye ozi ngwaahịa niile na isi mmalite default, nke na-etinye aka na ọwa ahịa nke jikọtara na ebe nrụọrụ weebụ na koodu base (dakọtara na njedebe ihu nke ụlọ ahịa ahụ - lee 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);
}

Ka ịgbakwunye data ngwa ahịa na ngwaahịa dị na panel nchịkwa, ị ga-enweta foto a:

Magento 2: bubata ngwaahịa ozugbo na nchekwa data

Mgbasa ozi

Mgbe “iji aka” tinye onyonyo na ngwaahịa site na ngalaba nchịkwa, a na-edenye ozi dị mkpa na tebụl ndị a:

  • catalog_product_entity_media_gallery: ndekọ mgbasa ozi (onyinyo na faịlụ vidiyo);
  • catalog_product_entity_media_gallery_value: na-ejikọta mgbasa ozi na ngwaahịa na ihe ngosi (localization);
  • catalog_product_entity_media_gallery_value_to_entity: ijikọ mgbasa ozi na ngwaahịa naanị (ma eleghị anya ọdịnaya mgbasa ozi ndabere maka ngwaahịa ahụ);
  • catalog_product_entity_varchar: A na-echekwa ọrụ ndị a na-eji ihe oyiyi ahụ ebe a;

na ihe oyiyi n'onwe ha ka echekwara na ndekọ ./pub/media/catalog/product/x/y/ebe x и y - akwụkwọ ozi mbụ na nke abụọ nke aha faịlụ oyiyi. Dịka ọmụmaatụ, faịlụ image.png kwesịrị ịzọpụta dị ka ./pub/media/catalog/product/i/m/image.png, nke mere na ikpo okwu nwere ike iji ya dị ka ihe oyiyi mgbe a na-akọwa ngwaahịa sitere na katalọgụ.

Ndebanye aha ezigara ./pub/media/catalog/product/ faịlụ mgbasa ozi (usoro nke itinye faịlụ n'onwe ya adịghị atụle n'isiokwu a):

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;
}

Mgbe edebanye aha, a na-ekenye faịlụ mgbasa ozi ọhụrụ ihe njirimara.

Anyị na-ejikọta faịlụ mgbasa ozi edebanyere aha na ngwaahịa dabara adaba maka ihu ụlọ ahịa ndabara:

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);
}

Anyị na-ejikọta faịlụ mgbasa ozi edebanyere aha na ngwaahịa kwekọrọ na-ejikọtaghị ya n'ihu ụlọ ahịa ọ bụla. O doro anya na ebe a na-eji data a kpọmkwem na ihe kpatara na ọ gaghị ekwe omume ịnweta data site na tebụl gara aga, ma tebụl a dị ma dee ya data mgbe agbakwunyere foto na ngwaahịa ahụ. Ya mere ọ bụ ya.

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

Enwere ike iji faịlụ mgbasa ozi nwere ọrụ dị iche iche (a na-egosi koodu njirimara kwekọrọ na mbikọ):

  • Isi (image)
  • Obere onyonyo (small_image)
  • thumbnail (thumbnail)
  • Onyonyo Swatch (swatch_image)

Njikọ ọrụ na faịlụ mgbasa ozi bụ kpọmkwem ihe na-eme catalog_product_entity_varchar. Koodu njide yiri koodu dị na "Njirimara ngwaahịa bụ isi".

Ka ịgbakwunye ihe onyonyo na ngwaahịa a na panel admin ọ dị ka nke a:

Magento 2: bubata ngwaahịa ozugbo na nchekwa data

Ngalaba

Tebụlụ isi nwere data site na otu:

  • catalog_category_entity: ndekọ nke edemede;
  • catalog_category_product: njikọ n'etiti ngwaahịa na edemede;
  • catalog_category_entity_*: EAV àgwà ụkpụrụ;

Na mbido, n'ime ngwa Magento efu, ụdị ndekọ ahụ nwere edemede 2 (Emebiri m aha kọlụm: 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|

Otu nwere id=1 bụ mgbọrọgwụ nke katalọgụ Magento niile, ọ dịghịkwa na panel nchịkwa ma ọ bụ n'ihu ihu. Otu nwere id=2 (Udi ezighi ezi) bụ ụdị mgbọrọgwụ maka ụlọ ahịa isi saịtị (Ụlọ ahịa Weebụsaịtị isi) emepụtara mgbe etinyere ngwa a (lee. Onye nchịkwa / ụlọ ahịa / ụlọ ahịa niile). Ọzọkwa, ụdị mgbọrọgwụ nke ụlọ ahịa ahụ n'onwe ya adịghịkwa n'ihu, ọ bụ naanị subcategories ya.

Ebe ọ bụ na isiokwu nke isiokwu a ka na-ebubata data na ngwaahịa, agaghị m eji ntinye aka kpọmkwem na nchekwa data mgbe ị na-emepụta edemede, ma ga-eji klas ndị Magento nyere n'onwe ya (ụdị na ebe nchekwa). A na-eji ntinye ozugbo na nchekwa data naanị iji jikọta ngwaahịa ebubatara na otu (ụdị a dabara na aha ya, a na-eweghachite ụdị id n'oge dakọtara):

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);
}

Ka ịgbakwunye njikọ ngwaahịa na edemede "Aka 1" na "ụdị 2", nkọwa ngwaahịa dị na panel nchịkwa dị ka nke a:

Magento 2: bubata ngwaahịa ozugbo na nchekwa data

Omume ndị ọzọ

Ozugbo mbubata data zuru, ị ga-emerịrị usoro ndị a:

  • indexing data: kpọọ na console ./bin/magento indexer:reindex;
  • na-emegharị URL maka ngwaahịa / otu: ị nwere ike iji ndọtị ahụ "elgentos/regenerate-catalog-urls«

Ngwaahịa dị na panel nchịkwa mgbe emechara omume ndị ọzọ:

Magento 2: bubata ngwaahịa ozugbo na nchekwa data

na n'ihu:

Magento 2: bubata ngwaahịa ozugbo na nchekwa data

Nchịkọta

Otu ụdị ngwaahịa (iberibe 10) dị ka ọ dị na isiokwu gara aga ka a na-ebubata ma ọ dịkarịa ala usoro ịdị ukwuu ngwa ngwa (1 sekọnd karịa 10). Iji mee atụmatụ n'ụzọ ziri ezi nke ọsọ, ị chọrọ ọnụ ọgụgụ buru ibu nke ngwaahịa - ọtụtụ narị, ma ọ bụ mma ma ọtụtụ puku. Agbanyeghị, ọbụlagodi na obere data ntinye dị otú ahụ, anyị nwere ike ikwubi na iji ngwaọrụ ndị Magento nyere (ụdị na ebe nchekwa) dị mkpa (m mesie ike - ihe!) mee ngwa ngwa mmepe nke ọrụ achọrọ, mana n'otu oge ahụ nke ukwuu (m mesie ike - ihe!) belata ọsọ nke data na-abanye na nchekwa data.

N'ihi ya, mmiri ahụ tụgharịrị bụrụ mmiri na nke a abụghị mkpughe. Agbanyeghị, ugbu a enwere m koodu m ga-eji na-egwu ma eleghị anya, bịarute nkwubi okwu ndị ọzọ na-atọ ụtọ.

isi: www.habr.com