Magento 2: shigo da kayayyaki kai tsaye cikin ma'ajin bayanai

В labarin da ya gabata Na bayyana tsarin shigo da kayayyaki zuwa Magento 2 a cikin hanyar da aka saba - ta hanyar samfura da wuraren ajiya. Hanyar da aka saba tana da ƙarancin saurin sarrafa bayanai. Laptop dina yana samar da kusan samfura ɗaya a sakan daya. A cikin wannan ci gaba, na yi la'akari da wata hanya ta dabam don shigo da samfur - ta hanyar shiga kai tsaye cikin bayanan, ketare daidaitattun hanyoyin Magento 2 (samfurai, masana'antu, ma'aji). Za a iya daidaita jerin matakai don shigo da kayayyaki zuwa kowane yaren shirye-shirye wanda zai iya aiki tare da MySQL.

Disclaimer: Magento yana da shirye-shiryen aiki don shigo da bayanai kuma, mai yiwuwa, zai ishe ku. Koyaya, idan kuna buƙatar ƙarin cikakken iko akan tsarin shigo da kaya, ba'a iyakance ga shirya fayil ɗin CSV don abin da kuke da shi ba, barka da zuwa cat.

Magento 2: shigo da kayayyaki kai tsaye cikin ma'ajin bayanai

Ana iya duba lambar da ta samo asali daga rubuta labaran biyu a cikin tsarin Magento "flancer32/mage2_ext_demo_import". Anan akwai wasu ƙuntatawa da na bi don sauƙaƙe lambar demo module:

  • Ana ƙirƙira samfuran kawai, ba sabunta su ba.
  • Sito daya
  • Sunayen rukuni kawai ake shigo da su, ba tare da tsarin su ba
  • Tsarin bayanai sun dace da sigar 2.3

JSON don shigo da samfur guda ɗaya:

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

Bayanin babban matakan shigo da kaya

  • rajista na samfurin kanta
  • haɗi tsakanin samfur da gidan yanar gizo
  • Halayen samfuran asali (EAV)
  • bayanan ƙididdiga (yawan samfuran da ke hannun jari)
  • kafofin watsa labarai (hotuna)
  • haɗi tare da nau'ikan kasida

Rijistar Samfura

Ana iya samun bayanan samfur na asali a ciki 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`)
)

Mafi ƙarancin bayanin da ake buƙata don ƙirƙirar shigarwa a cikin rajistar samfur shine:

  • attribute_set_id
  • sku

kari:

  • type_id - idan ba mu bayyana shi ba, to za a yi amfani da 'mai sauƙi'

Don rubuta kai tsaye zuwa bayanan bayanai, Ina amfani da adaftar DB na Magento kanta:

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

Bayan yin rijistar samfurin tare da catalog_product_entity yana bayyana a cikin kwamitin gudanarwa, a cikin grid samfurin (Katalogi/Kayayyaki).

Magento 2: shigo da kayayyaki kai tsaye cikin ma'ajin bayanai

Dangantaka tsakanin samfur da gidan yanar gizo

Haɗin samfurin tare da rukunin yanar gizon yana ƙayyade a cikin waɗanne shagunan da nunin samfuran zasu kasance a gaba.

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: shigo da kayayyaki kai tsaye cikin ma'ajin bayanai

Halayen samfur na asali

Sabon samfurin da aka yi rajista bashi da suna ko kwatance. Duk wannan ana yin ta ne Siffofin EAV. Anan akwai jerin mahimman halayen samfur waɗanda ake buƙata don samfurin ya nuna daidai a gaba:

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

Ana ƙara wani sifa na dabam ga samfur kamar wannan (ba a cire cikakkun bayanai na samun mai ganowa da nau'in sifa daga lambar sa):

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

Yin amfani da lambar sifa, muna ƙayyade id da nau'in bayanai (datetime, decimal, int, text, varchar), sa'an nan kuma rubuta bayanan don taga mai gudanarwa a cikin teburin da ya dace (store_id = 0).

Bayan ƙara abubuwan da ke sama zuwa samfurin, kuna samun wannan hoton a cikin rukunin gudanarwa:

Magento 2: shigo da kayayyaki kai tsaye cikin ma'ajin bayanai

Bayanan kaya

An fara daga sigar 2.3 a cikin Magento, akwai teburi guda biyu masu kama da juna waɗanda ke ba da ajiyar bayanan kaya (yawan samfur):

  • cataloginventory_*: tsohon tsari;
  • inventory_*: sabon tsarin (MSI - Multi Source Inventory);

Kuna buƙatar ƙara bayanan ƙira zuwa tsarin biyu, saboda sabon tsarin bai riga ya zama cikakken 'yancin kai daga tsohon daya (yana da yuwuwar hakan don default sito a cikin sabon tsarin akwai tebur a ciki cataloginventory_stock_status kamar yadda inventory_stock_1).

katalogin lissafi_

Lokacin tura Magneto 2.3 da farko muna da shigarwar 2 a ciki store_website, wanda ya dace da shafuka biyu - gudanarwa da babban abokin ciniki:

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

Tebur cataloginventory_stock muna da shigarwa ɗaya kawai:

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

Wato, a cikin tsohon tsarinmu akwai "gidajen ajiya" guda ɗaya kawai (stock) kuma yana da alaƙa da gidan yanar gizon gudanarwa. Ƙara sababbi ta hanyar admin panel sources/stocks a cikin MSI (sabon tsari) baya haifar da sabbin shigarwar ciki cataloginventory_stock.

Bayanan ƙididdiga game da samfurori a cikin tsohon tsarin an fara rubuta su a cikin tebur:

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

kaya_

Da farko, sabon tsarin don adana bayanan kaya ya ƙunshi 1"source"(inventory_source):

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

kuma daya"sito"(inventory_stock):

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

«Source» yana wakiltar ma'ajin jiki don samfuran (rikodin ya ƙunshi daidaitawar jiki da adireshin aikawasiku). "Warehouse"haɗin kai ne na ma'ana na "sources" da yawa (inventory_source_stock_link)

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

a matakin da haɗin kai zuwa tashar tallace-tallace ke faruwa (inventory_stock_sales_channel)

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

Yin la'akari da tsarin bayanan, ana ɗaukar nau'ikan tashoshi na tallace-tallace daban-daban, amma ta tsohuwa kawai haɗin gwiwa "stock"-"yanar"(Haɗin yanar gizon yana bin lambar gidan yanar gizon - base).

Daya"sito"za a iya danganta su da yawa"kafofin"kuma daya"source"- da yawa"ɗakunan ajiya"( dangantaka mai yawa-da-yawa). Abubuwan da aka keɓance sun kasance na asali"source"Kuma"sito". Ba a sake haɗa su da wasu ƙungiyoyi ba (iyakance a matakin lambar - kuskuren "Ba za a iya ajiye hanyar haɗi mai alaƙa da Tsohuwar Tushen ko Tsohuwar Stock"). Ana iya samun ƙarin cikakkun bayanai game da tsarin MSI a cikin Magento 2 a cikin labarin "Tsarin Gudanar da Warehouse ta amfani da CQRS da Event Sourcing. Zane".

Zan yi amfani da saitunan tsoho kuma in ƙara duk bayanan ƙira zuwa tushen default, wanda ke da hannu a cikin tashar tallace-tallace da ke hade da gidan yanar gizon tare da lambar base (daidai da ƙarshen shagon - duba 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);
}

Bayan ƙara bayanan ƙira ga samfurin a cikin rukunin gudanarwa, kuna samun wannan hoton:

Magento 2: shigo da kayayyaki kai tsaye cikin ma'ajin bayanai

Mai jarida

Lokacin da “da hannu” ƙara hoto zuwa samfur ta hanyar kwamitin gudanarwa, ana rubuta bayanan da suka dace a cikin tebur masu zuwa:

  • catalog_product_entity_media_gallery: rajistar kafofin watsa labarai (hotuna da fayilolin bidiyo);
  • catalog_product_entity_media_gallery_value: haɗa kafofin watsa labaru zuwa samfurori da nunin (localization);
  • catalog_product_entity_media_gallery_value_to_entity: haɗa kafofin watsa labaru zuwa samfurori kawai (mai yiwuwa tsoho abun ciki na samfurin);
  • catalog_product_entity_varchar: Ana adana ayyukan da aka yi amfani da hoton a nan;

kuma hotunan da kansu an ajiye su zuwa kundin adireshi ./pub/media/catalog/product/x/y/inda x и y - haruffa na farko da na biyu na sunan fayil ɗin hoton. Misali, fayil image.png ya kamata a cece kamar yadda ./pub/media/catalog/product/i/m/image.png, ta yadda dandalin zai iya amfani da shi azaman hoto lokacin da aka kwatanta samfurori daga kasida.

An buga rajista a ciki ./pub/media/catalog/product/ fayilolin mai jarida (tsarin sanya fayil ɗin kanta ba a tattauna shi a cikin wannan labarin):

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

Lokacin rajista, sabon fayil ɗin mai jarida ana sanya mai ganowa.

Muna danganta fayil ɗin mai jarida mai rijista tare da samfurin da ya dace don tsohuwar gaban shagon:

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

Muna haɗa fayil ɗin mai jarida mai rijista tare da samfurin da ya dace ba tare da an ɗaure shi da kowane gaban shago ba. Ba a bayyana ainihin inda ake amfani da wannan bayanan ba da kuma dalilin da yasa ba zai yiwu ba don samun damar bayanai daga teburin da ya gabata, amma wannan tebur yana wanzu kuma ana rubuta bayanan lokacin da aka ƙara hoto a cikin samfurin. To shi ke nan.

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

Ana iya amfani da fayil ɗin mai jarida tare da ayyuka daban-daban (ana nuna lambar sifa mai dacewa a cikin baka):

  • Tushe(image)
  • Karamin Hoto (small_image)
  • Thumbnail (thumbnail)
  • Hoton Swatch (swatch_image)

Haɗa matsayi zuwa fayil ɗin mai jarida daidai abin da ke faruwa a ciki catalog_product_entity_varchar. Lambar dauri yayi kama da lambar da ke cikin "Halayen samfur na asali".

Bayan ƙara hoto zuwa samfurin a cikin admin panel yana kama da haka:

Magento 2: shigo da kayayyaki kai tsaye cikin ma'ajin bayanai

Categories

Babban teburi masu ɗauke da bayanai ta rukuni:

  • catalog_category_entity: rajista na rukuni;
  • catalog_category_product: haɗi tsakanin samfurori da nau'i;
  • catalog_category_entity_*: ƙimar sifa na EAV;

Da farko, a cikin aikace-aikacen Magento mara komai, rukunin rajista ya ƙunshi nau'ikan nau'ikan 2 (Na gajarta sunayen shafi: 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|

Rukunin tare da id=1 shine tushen gabaɗayan kasida na Magento kuma baya samuwa ko dai a cikin kwamitin gudanarwa ko a shafi na gaba. Rukuni tare da id=2 (Nau'in Default) shine tushen tushen babban kantin sayar da gidan yanar gizon (Babban Shagon Yanar Gizo) ƙirƙira lokacin da aka tura aikace-aikacen (duba. Admin / Stores / Duk Stores). Haka kuma, tushen tushen kantin da kansa ma ba a samunsa a gaba, sai dai rukunoninsa.

Tun da har yanzu batun wannan labarin yana ci gaba da shigo da bayanai kan samfuran, ba zan yi amfani da shigarwa kai tsaye a cikin bayanan ba lokacin ƙirƙirar nau'ikan, amma zan yi amfani da azuzuwan da Magento ya samar da kanta (samfurai da wuraren ajiya). Ana amfani da shigarwa kai tsaye cikin ma'ajin bayanai kawai don haɗa samfurin da aka shigo da shi da wani nau'i (nau'in yana daidaita da sunansa, kuma ana dawo da nau'in id yayin daidaitawa):

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

Bayan ƙara hanyar haɗin samfur zuwa nau'ikan "Kategori 1" da "Kashi na 2", cikakkun bayanan samfurin a cikin kwamitin gudanarwa sun yi kama da haka:

Magento 2: shigo da kayayyaki kai tsaye cikin ma'ajin bayanai

Ƙarin ayyuka

Da zarar shigo da bayanan ya cika, kuna buƙatar kammala ƙarin matakai masu zuwa:

  • bayanai indexing: kira a cikin na'ura wasan bidiyo ./bin/magento indexer:reindex;
  • sabunta URLs don samfuran / nau'ikan: zaku iya amfani da tsawo "elgentos/sake haɓaka-catalog-urls«

Samfura a cikin kwamitin gudanarwa bayan yin ƙarin ayyuka:

Magento 2: shigo da kayayyaki kai tsaye cikin ma'ajin bayanai

kuma a gaba:

Magento 2: shigo da kayayyaki kai tsaye cikin ma'ajin bayanai

Takaitaccen

Saitin samfuran iri ɗaya ( guda 10) kamar a labarin da ya gabata ana shigo da shi aƙalla tsari na girma cikin sauri (1 daƙiƙa 10). Don ƙarin kimanta saurin daidai, kuna buƙatar babban adadin samfuran - ɗaruruwan ɗari, ko mafi kyau tukuna dubbai. Duk da haka, ko da tare da irin wannan ƙananan girman bayanan shigarwa, za mu iya yanke shawarar cewa amfani da kayan aikin da Magento (samfurai da ma'ajin ajiya) ke bayarwa yana da mahimmanci (na jaddada - yawa!) hanzarta haɓaka aikin da ake buƙata, amma a lokaci guda mahimmanci (Na jaddada - yawa!) rage saurin da bayanai ke shiga rumbun adana bayanai.

Sakamakon haka, ruwan ya zama jike kuma wannan ba wahayi bane. Duk da haka, yanzu ina da lambar da zan yi wasa da ita kuma watakila na zo wasu ƙarin mafi ban sha'awa ƙarshe.

source: www.habr.com