Magento 2: gbe awọn ọja wọle taara sinu ibi ipamọ data

В ti tẹlẹ article Mo ṣe apejuwe ilana ti gbigbe ọja wọle si Magento 2 ni ọna deede - nipasẹ awọn awoṣe ati awọn ibi ipamọ. Ọna deede ni iyara sisẹ data kekere pupọ. Kọǹpútà alágbèéká mi ti n ṣejade nipa ọja kan fun iṣẹju kan. Ni lilọsiwaju yii, Mo gbero ọna yiyan lati gbe ọja wọle - nipasẹ titẹsi taara sinu ibi ipamọ data, ni ikọja awọn ọna ṣiṣe Magento 2 boṣewa (awọn awoṣe, awọn ile-iṣelọpọ, awọn ibi ipamọ). Ọkọọkan awọn igbesẹ lati gbe awọn ọja wọle le ṣe deede si eyikeyi ede siseto ti o le ṣiṣẹ pẹlu MySQL.

be: Magento ni iṣẹ ṣiṣe ti o ṣetan fun agbewọle data ati, julọ seese, o yoo to fun o. Sibẹsibẹ, ti o ba nilo iṣakoso pipe diẹ sii lori ilana agbewọle, ko ni opin si murasilẹ faili CSV fun ohun ti o ni, kaabọ si ologbo.

Magento 2: gbe awọn ọja wọle taara sinu ibi ipamọ data

Awọn koodu ti o waye lati kikọ awọn nkan mejeeji ni a le wo ni module Magento "flancer32 / mage2_ext_demo_import". Eyi ni diẹ ninu awọn ihamọ ti Mo tẹle lati ṣe irọrun koodu module demo naa:

  • Awọn ọja nikan ni a ṣẹda, kii ṣe imudojuiwọn.
  • Ile-ipamọ kan
  • Awọn orukọ ẹka nikan ni a ko wọle, laisi eto wọn
  • Awọn ẹya data ni ibamu pẹlu ẹya 2.3

JSON fun gbigbe ọja kan wọle:

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

Akopọ ti awọn ipele akọkọ ti agbewọle

  • iforukọsilẹ ti ọja funrararẹ
  • asopọ laarin ọja ati aaye ayelujara
  • Awọn abuda ọja ipilẹ (EAV)
  • data akojo oja (opoiye ọja ninu iṣura)
  • media (awọn aworan)
  • asopọ pẹlu katalogi isori

Iforukọsilẹ ọja

Alaye ọja ipilẹ ni a le rii ni 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`)
)

Alaye to kere julọ ti o nilo lati ṣẹda titẹ sii ni iforukọsilẹ ọja ni:

  • attribute_set_id
  • sku

afikun:

  • type_id — ti a ko ba sọ pato rẹ, lẹhinna 'rọrun' yoo ṣee lo

Lati kọ taara si ibi ipamọ data, Mo lo oluyipada DB ti Magento funrararẹ:

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

Lẹhin ti forukọsilẹ ọja pẹlu catalog_product_entity o di han ninu nronu abojuto, ninu akoj ọja (Katalogi / Awọn ọja).

Magento 2: gbe awọn ọja wọle taara sinu ibi ipamọ data

Ibasepo laarin ọja ati aaye ayelujara

Ijọpọ ti ọja pẹlu aaye naa pinnu ninu eyiti awọn ile itaja ati ṣafihan ọja yoo wa ni iwaju.

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: gbe awọn ọja wọle taara sinu ibi ipamọ data

Awọn abuda ọja ipilẹ

Ọja tuntun ti a forukọsilẹ ko sibẹsibẹ ni orukọ tabi apejuwe. Gbogbo eyi ni a ṣe nipasẹ EAV eroja. Eyi ni atokọ ti awọn abuda ọja ipilẹ ti o nilo fun ọja lati ṣafihan ni deede ni iwaju:

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

Ẹya ara ọtọ ti wa ni afikun si ọja bii eyi (awọn alaye ti gbigba idamo ati iru ẹya lati koodu rẹ ti yọkuro):

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

Lilo koodu abuda, a pinnu id ati iru data (datetime, decimal, int, text, varchar), lẹhinna kọ data fun window iṣakoso sinu tabili ti o yẹ (store_id = 0).

Lẹhin fifi awọn abuda ti o wa loke si ọja naa, o gba aworan yii ni igbimọ abojuto:

Magento 2: gbe awọn ọja wọle taara sinu ibi ipamọ data

Oja data

Bibẹrẹ lati ẹya 2.3 ni Magento, awọn tabili afiwera meji wa ti o pese ibi ipamọ ti alaye akojo oja (iye ọja):

  • cataloginventory_*: atijọ be;
  • inventory_*: titun be (MSI - Multi Orisun Oja);

O nilo lati ṣafikun data akojo oja si awọn ẹya mejeeji, nitori titun be ni ko sibẹsibẹ patapata ominira ti atijọ (o jẹ gidigidi seese wipe fun default ile ise ninu titun be a tabili lowo cataloginventory_stock_status bi inventory_stock_1).

kataloginventory_

Nigbati o ba n gbe Magneto 2.3 lọ, a ni awọn titẹ sii 2 ni ibẹrẹ store_website, eyiti o ni ibamu si awọn aaye meji - iṣakoso ati alabara akọkọ:

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

Tabili cataloginventory_stock A ni titẹsi kan nikan:

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

Iyẹn ni, ninu eto atijọ wa “ile itaja” kan ṣoṣo ni o wa (stock) ati pe o ni asopọ si oju opo wẹẹbu iṣakoso. Fifi titun eyi nipasẹ abojuto nronu sources/stocks ni MSI (titun be) ko ni ja si ni titun awọn titẹ sii ni cataloginventory_stock.

Awọn data akojo oja nipa awọn ọja ni ọna atijọ ti wa ni ibẹrẹ ni awọn tabili:

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

akojo oja_

Ni ibẹrẹ, eto tuntun fun titoju data akojo oja ni 1 ”.orisun"(inventory_source):

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

ati ọkan"ile itaja"(inventory_stock):

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

«Orisun» duro fun ibi ipamọ ti ara fun awọn ọja (igbasilẹ naa ni awọn ipoidojuko ti ara ati adirẹsi ifiweranṣẹ). "Iṣura"jẹ iṣọkan ọgbọn ti ọpọlọpọ awọn "orisun" (inventory_source_stock_link)

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

ni ipele eyiti asopọ si ikanni tita waye (inventory_stock_sales_channel)

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

Ni idajọ nipasẹ ọna data, ọpọlọpọ awọn oriṣi ti awọn ikanni tita ni a ro, ṣugbọn nipasẹ aiyipada nikan ni asopọ "iṣura"-"aaye ayelujara"(ọna asopọ si oju opo wẹẹbu tẹle koodu oju opo wẹẹbu - base).

Ọkan"ile itaja"le ti sopọ si orisirisi"awọn orisun"ati ọkan"orisun"- si orisirisi"awọn ile ise"(Ọpọlọpọ-si-Ọpọlọpọ ibasepo). Awọn imukuro jẹ aiyipada"orisun"Ati"ile itaja". Wọn ko tun ni asopọ si awọn nkan miiran (iwọn ni ipele koodu - aṣiṣe naa "Ko le fi ọna asopọ pamọ ti o ni ibatan si Orisun Aiyipada tabi Iṣura Aiyipada"). Awọn alaye diẹ sii nipa eto MSI ni Magento 2 ni a le rii ninu nkan naa “Eto iṣakoso ile-iṣẹ ni lilo CQRS ati Iṣẹlẹ Iṣẹlẹ. Apẹrẹ".

Emi yoo lo iṣeto aiyipada ati ṣafikun gbogbo alaye akojo oja si orisun default, eyiti o ni ipa ninu ikanni tita ti o ni nkan ṣe pẹlu oju opo wẹẹbu pẹlu koodu naa base (ni ibamu si opin iwaju ti ile itaja - wo 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);
}

Lẹhin fifi data ọja-ọja kun ọja naa ninu nronu abojuto, o gba aworan yii:

Magento 2: gbe awọn ọja wọle taara sinu ibi ipamọ data

Media

Nigbati “pẹlu ọwọ” ṣafikun aworan kan si ọja nipasẹ ẹgbẹ alabojuto, alaye ti o wulo ni a kọ si isalẹ ninu awọn tabili atẹle:

  • catalog_product_entity_media_gallery: media iforukọsilẹ (awọn aworan ati awọn faili fidio);
  • catalog_product_entity_media_gallery_value: sisopọ media si awọn ọja ati awọn ifihan (ipopo);
  • catalog_product_entity_media_gallery_value_to_entity: sisopọ media si awọn ọja nikan (aigbekele akoonu media aiyipada fun ọja naa);
  • catalog_product_entity_varchar: Awọn ipa ti o ti lo aworan ti wa ni ipamọ nibi;

ati awọn aworan ara wọn ti wa ni fipamọ si awọn liana ./pub/media/catalog/product/x/y/nibo x и y - awọn lẹta akọkọ ati keji ti orukọ faili aworan naa. Fun apẹẹrẹ, faili image.png yẹ ki o wa ni fipamọ bi ./pub/media/catalog/product/i/m/image.png, ki Syeed le lo bi aworan nigbati o n ṣe apejuwe awọn ọja lati inu iwe-ipamọ naa.

Forukọsilẹ Pipa ni ./pub/media/catalog/product/ faili media (ilana ti gbigbe faili funrararẹ ko ni ijiroro ninu nkan yii):

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

Nigbati o ba forukọsilẹ, faili media titun ni a yan idamo kan.

A ṣe idapọ faili media ti o forukọsilẹ pẹlu ọja ti o baamu fun iwaju ile itaja aiyipada:

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

A ṣepọ faili media ti o forukọsilẹ pẹlu ọja ti o baamu laisi ti so mọ eyikeyi iwaju ile itaja. Ko ṣe afihan ibiti a ti lo data gangan gangan ati idi ti ko ṣee ṣe lati wọle si data lati tabili iṣaaju, ṣugbọn tabili yii wa ati pe a kọ data naa si nigbati a ṣafikun aworan si ọja naa. Nitorinaa iyẹn ni.

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 media le ṣee lo pẹlu awọn ipa oriṣiriṣi (koodu ti o baamu jẹ itọkasi ni awọn akọmọ):

  • ipilẹ(image)
  • Aworan Kekere (small_image)
  • Eekanna atanpako (thumbnail)
  • Aworan Swatch (swatch_image)

Awọn ipa ọna asopọ si faili media jẹ ohun ti o ṣẹlẹ ni deede catalog_product_entity_varchar. Koodu abuda jẹ iru si koodu ti o wa ninu "Awọn abuda ọja ipilẹ".

Lẹhin fifi aworan kun ọja naa ni igbimọ abojuto o dabi eyi:

Magento 2: gbe awọn ọja wọle taara sinu ibi ipamọ data

Ilana

Awọn tabili akọkọ ti o ni data ninu nipasẹ ẹka:

  • catalog_category_entity: Forukọsilẹ ti awọn ẹka;
  • catalog_category_product: asopọ laarin awọn ọja ati awọn ẹka;
  • catalog_category_entity_*: Awọn iye abuda EAV;

Ni ibẹrẹ, ninu ohun elo Magento ti o ṣofo, iforukọsilẹ ẹka ni awọn ẹka 2 (Mo kuru awọn orukọ ọwọn: 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|

Ẹka pẹlu id=1 ni gbongbo gbogbo iwe akọọlẹ Magento ati pe ko si boya ninu igbimọ abojuto tabi ni oju-iwe iwaju. Ẹka pẹlu id=2 (Aiyipada Ẹka) jẹ ẹka gbongbo fun ile itaja akọkọ ti aaye akọkọ (Ile itaja oju opo wẹẹbu akọkọ) ti a ṣẹda nigbati ohun elo naa ba wa (wo. Abojuto / Awọn ile itaja / Gbogbo Awọn ile itaja). Pẹlupẹlu, ẹka gbongbo ti ile itaja funrararẹ ko tun wa ni iwaju, awọn ẹka-ẹka rẹ nikan.

Niwọn igba ti koko ọrọ yii tun n gbe data wọle lori awọn ọja, Emi kii yoo lo titẹsi taara sinu ibi ipamọ data nigbati o ṣẹda awọn ẹka, ṣugbọn yoo lo awọn kilasi ti Magento funrararẹ (awọn awoṣe ati awọn ibi ipamọ). Titẹwọle taara sinu ibi ipamọ data jẹ lilo nikan lati ṣe idapọ ọja ti a ko wọle pẹlu ẹka kan (ẹka naa ti baamu pẹlu orukọ rẹ, ati pe id ti ẹya naa ti gba pada lakoko ibaramu):

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

Lẹhin fifi ọna asopọ ọja kan kun si awọn ẹka “Ẹka 1” ati “Ẹka 2”, awọn alaye ọja ninu nronu abojuto wo nkan bii eyi:

Magento 2: gbe awọn ọja wọle taara sinu ibi ipamọ data

Awọn iṣe afikun

Ni kete ti agbewọle data ba ti pari, o nilo lati pari awọn igbesẹ afikun atẹle wọnyi:

  • titọka data: pe ninu console ./bin/magento indexer:reindex;
  • Awọn URL ti n ṣe atunṣe fun awọn ọja/awọn ẹka: o le lo itẹsiwaju "elgentos / atunbi-katalogi-urls«

Awọn ọja ninu nronu abojuto lẹhin ṣiṣe awọn iṣe afikun:

Magento 2: gbe awọn ọja wọle taara sinu ibi ipamọ data

ati ni iwaju:

Magento 2: gbe awọn ọja wọle taara sinu ibi ipamọ data

Akopọ

Eto kanna ti awọn ọja (awọn ege 10) bi ninu nkan ti tẹlẹ ti gbe wọle o kere ju aṣẹ titobi ni iyara (1 keji dipo 10). Lati ṣe iṣiro iyara diẹ sii ni deede, o nilo nọmba nla ti awọn ọja - ọpọlọpọ awọn ọgọrun, tabi dara julọ sibẹsibẹ awọn ẹgbẹẹgbẹrun. Sibẹsibẹ, paapaa pẹlu iru iwọn kekere ti data titẹ sii, a le pinnu pe lilo awọn irinṣẹ ti Magento pese (awọn awoṣe ati awọn ibi ipamọ) jẹ pataki (Mo tẹnumọ - pataki!) yiyara idagbasoke ti iṣẹ ṣiṣe ti o nilo, ṣugbọn ni akoko kanna ni pataki (Mo tẹnumọ - pataki!) dinku iyara ti data n wọle sinu ibi ipamọ data.

Bi abajade, omi ti jade lati jẹ tutu ati eyi kii ṣe ifihan. Sibẹsibẹ, ni bayi Mo ni koodu lati mu ṣiṣẹ pẹlu ati boya wa si awọn ipinnu ti o nifẹ diẹ sii.

orisun: www.habr.com