Magento 2: kawemai tika nga hua ki roto i te papaa raraunga

В Tuhinga o mua I whakaahuahia e au te tikanga o te kawe mai i nga hua ki roto i te Magento 2 i runga i te tikanga - na roto i nga tauira me nga putunga. Ko te tikanga o mua he iti rawa te tere tukatuka raraunga. Ko taku pona e whakaputa ana mo te kotahi hua mo ia hekona. I roto i tenei haere tonu, ka whakaaro ahau ki tetahi huarahi rereke ki te kawemai i tetahi hua - ma te urunga tika ki roto i te paataka korero, ma te takahi i nga tikanga Magento 2 (tauira, wheketere, putunga). Ko te raupapa o nga hikoinga ki te kawemai i nga hua ka taea te urutau ki tetahi reo papatono ka taea te mahi me MySQL.

Whakakape: Kei a Magento nga mahi kua rite mo kawemai raraunga a, tera pea, ka ranea maau. Heoi, ki te hiahia koe kia kaha ake te whakahaere i te tukanga kawemai, kaua e whakawhäitihia ki te whakarite i te konae CSV mo nga mea kei a koe, nau mai ki te ngeru.

Magento 2: kawemai tika nga hua ki roto i te papaa raraunga

Ko te waehere i puta mai i te tuhi i nga tuhinga e rua ka taea te tiro ki te waahanga Magento "flancer32/mage2_ext_demo_import". Anei etahi here i whaia e au ki te whakangawari i te waehere kōwae demo:

  • Ko nga hua ka hangaia anake, kaore i te whakahou.
  • Kotahi te whare putunga
  • Ko nga ingoa waahanga anake ka kawemai, kaore he hanganga
  • Ka ū nga hanganga raraunga ki te putanga 2.3

JSON mo te kawemai i te hua kotahi:

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

Tirohanga o nga waahanga matua o te kawemai

  • rehitatanga o te hua ake
  • hononga i waenga i te hua me te paetukutuku
  • huanga hua taketake (EAV)
  • raraunga rārangi (te nui o te hua kei roto i nga taonga)
  • pāpāho (pikitia)
  • hononga ki nga waahanga pukapuka

Rehitatanga Hua

Ka kitea nga korero hua taketake i roto 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`)
)

Ko nga korero iti e hiahiatia ana hei hanga urunga ki te rehita hua ko:

  • attribute_set_id
  • sku

taapiri:

  • type_id — ki te kore matou e kii, katahi ka whakamahia te 'ngawari'

Hei tuhi tika ki te papaaarangi, ka whakamahi ahau i te DB adapter o Magento ake:

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

I muri i te rehitatanga o te hua me catalog_product_entity ka kitea i roto i te papa whakahaere, i te matiti hua (Putumōhio/Hua).

Magento 2: kawemai tika nga hua ki roto i te papaa raraunga

Te hononga i waenga i te hua me te paetukutuku

Ko te hononga o te hua me te papaanga ka whakatau ko wai nga toa me nga whakaaturanga ka waatea te hua ki mua.

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: kawemai tika nga hua ki roto i te papaa raraunga

Nga huanga hua taketake

Ko te hua hou kua rehitatia kaore ano kia whai ingoa, whakaahuatanga ranei. Ka mahia enei mea katoa Nga huanga EAV. Anei te rarangi o nga huanga hua taketake e hiahiatia ana kia tika te whakaatu o te hua ki mua:

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

Ka taapirihia he huanga motuhake ki tetahi hua penei (ka waiho nga korero mo te whiwhi tohu me te momo o te huanga mai i tana waehere):

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

Ma te whakamahi i te waehere huanga, ka whakatauhia e maatau tona id me te momo raraunga (datetime, decimal, int, text, varchar), ka tuhia nga raraunga mo te matapihi whakahaere ki te ripanga tika (store_id = 0).

Whai muri i te taapiri i nga huanga o runga ake nei ki te hua, ka whiwhi koe i tenei pikitia ki te papa whakahaere:

Magento 2: kawemai tika nga hua ki roto i te papaa raraunga

Raraunga Rarangi

Ka timata mai i te putanga 2.3 i Magento, e rua nga huinga whakarara o nga ripanga e whakarato ana i te rokiroki o nga korero raarangi (te rahinga hua):

  • cataloginventory_*: hanganga tawhito;
  • inventory_*: hanganga hou (MSI - Inventory Puna Maha);

Me taapiri koe i nga raraunga raarangi ki nga hanganga e rua, na te mea ko te hanganga hou kaore ano kia tino motuhake mai i te mea tawhito (ko te mea pea mo default whare putunga i roto i te hanganga hou he tepu kei roto cataloginventory_stock_status rite inventory_stock_1).

putumōhio rārangi_

I te wa e tukuna ana a Magneto 2.3 i te tuatahi ka 2 nga whakaurunga ki roto store_website, e rite ana ki nga waahi e rua - te kaiwhakahaere me te kiritaki matua:

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

Ripanga cataloginventory_stock kotahi noa ta matou urunga:

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

Arā, i roto i to tatou hanganga tawhito kotahi anake te "whare putunga" (stock) a kua honoa ki te paetukutuku whakahaere. Te taapiri i nga mea hou ma te papa whakahaere sources/stocks i roto i te MSI (hanganga hou) kaore e puta he whakaurunga hou ki roto cataloginventory_stock.

Ko nga raraunga rarangi mo nga hua i roto i te hanganga tawhito ka tuhia i te tuatahi ki nga ripanga:

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

rārangi_

I te timatanga, ko te hanganga hou mo te penapena raraunga raarangi he 1 "puna"(inventory_source):

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

me tetahi"whare putunga whare"(inventory_stock):

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

«Puna» e tohu ana i te rokiroki tinana mo nga hua (kei roto i te rekoata nga taunga tinana me te wahitau mēra). "Warehouse"he uniana arorau o etahi "puna" (inventory_source_stock_link)

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

i te taumata i puta ai te hononga ki te hongere hoko (inventory_stock_sales_channel)

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

Ma te whakatau i te hanganga raraunga, he maha nga momo huarahi hoko ka kiia, engari ma te taunoa ko te hononga "kararehe"-"paetukutuku"(Ko te hono ki te paetukutuku e whai ana i te waehere paetukutuku - base).

Kotahi"whare putunga whare"Ka taea te hono ki etahi"puna"me tetahi"puna"- ki etahi"whare putunga"(hononga maha-ki-maha). He taunoa nga okotahi "puna»Na«whare putunga whare". Kaore i te hono ano ki etahi atu hinonga (whakaiti i te taumata waehere - te hapa "Kaore e taea te tiaki hononga e pa ana ki te Puna Taunoa me te Raarangi Taunoa"). Ko etahi atu korero mo te hanganga MSI i Magento 2 ka kitea i roto i te tuhinga "Te punaha whakahaere whare putunga ma te whakamahi i te CQRS me te Mahinga Takahanga. Hoahoa".

Ka whakamahia e ahau te whirihoranga taunoa me te taapiri i nga korero katoa ki te puna default, e uru ana ki te hongere hoko e hono ana ki te paetukutuku me te waehere base (e rite ana ki te pito o mua o te toa - tirohia 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);
}

Whai muri i te taapiri i nga raraunga raarangi ki te hua i te papa whakahaere, ka whiwhi koe i tenei pikitia:

Magento 2: kawemai tika nga hua ki roto i te papaa raraunga

Pāpāho

Ina "a-ringa" te taapiri i tetahi ahua ki tetahi hua ma te roopu whakahaere, ka tuhia nga korero e tika ana ki nga ripanga e whai ake nei:

  • catalog_product_entity_media_gallery: rehita pāpāho (whakaahua me nga konae ataata);
  • catalog_product_entity_media_gallery_value: te hono i te hunga pāpāho ki nga hua me nga whakaaturanga (te rohenga);
  • catalog_product_entity_media_gallery_value_to_entity: te hono i te hunga pāpāho ki nga hua anake (te mea he ihirangi pāpāho taunoa mo te hua);
  • catalog_product_entity_varchar: Ko nga mahi e whakamahia ai te ahua ka rongoa ki konei;

a ko nga whakaahua ano ka tiakina ki te raarangi ./pub/media/catalog/product/x/y/te wahi x и y — nga reta tuatahi me te tuarua o te ingoa konae whakaahua. Hei tauira, kōnae image.png kia ora hei ./pub/media/catalog/product/i/m/image.png, kia taea ai e te papaaho te whakamahi hei ahua i te wa e whakaahua ana i nga hua mai i te raarangi.

Rēhita kua tukuna ki roto ./pub/media/catalog/product/ kōnae pāpāho (kaore i te korerohia te tukanga o te whakatakoto i te konae ake i tenei tuhinga):

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

Ina rehitatia, ka tautapahia he konae pāpāho hou he tautohu.

Ka honoa e matou te konae pāpāho kua rehitatia me te hua e rite ana mo te toa taunoa:

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

Ka honoa e matou te konae pāpāho kua rehitatia me te hua e rite ana me te kore e herea ki tetahi toa toa. Kaore i te maarama kei hea te whakamahi i enei raraunga me te aha e kore e taea te uru atu ki nga raraunga mai i te ripanga o mua, engari kei te noho tonu tenei ripanga ka tuhia nga raraunga ki a ia ka taapirihia he pikitia ki te hua. Na ko tena.

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

Ka taea te whakamahi i tetahi konae pāpāho me nga mahi rereke (kua tohuhia te waehere huanga e rite ana ki roto i nga reu):

  • turanga(image)
  • Atahanga Iti (small_image)
  • Karakōnui (thumbnail)
  • Atahanga Swatch (swatch_image)

Ko te hono i nga mahi ki tetahi konae pāpāho te mea ka tupu i roto catalog_product_entity_varchar. He rite te waehere here ki te waehere kei te "Nga huanga hua taketake".

I muri i te taapiri i tetahi ahua ki te hua i roto i te papa whakahaere ka penei te ahua:

Magento 2: kawemai tika nga hua ki roto i te papaa raraunga

Ngā Kāwai

Ripanga matua kei roto nga raraunga ma te waahanga:

  • catalog_category_entity: rehita o nga waahanga;
  • catalog_category_product: hononga i waenga i nga hua me nga waahanga;
  • catalog_category_entity_*: Uara huanga EAV;

I te timatanga, i roto i te tono Magento kau, kei roto i te rehitatanga waahanga e 2 nga waahanga (I whakapotohia e ahau nga ingoa pou: 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|

Ko te kāwai whai id=1 te putake o te katoa o te putumōhio Magento, ā, kāore i te wātea i te pae whakahaere, i te whārangi o mua rānei. Kāwai whai id=2 (Kāwai Taunoa) ko te waahanga pakiaka mo te toa matua o te pae matua (Toa Paetukutuku Matua) i hangaia i te wa e tukuna ana te tono (tirohia. Kaiwhakahaere / Toa / Toa Katoa). Ano, ko te waahanga pakiaka o te toa kaore ano i te waatea i mua, ko nga waahanga iti anake.

I te mea ko te kaupapa o tenei tuhinga kei te kawemai tonu i nga raraunga mo nga hua, kaore au e whakamahi i te urunga tika ki roto i te papaarangi i te wa e hanga ana nga waahanga, engari ka whakamahi i nga karaehe e whakaratohia ana e Magento ake (tauira me nga putunga). Ko te urunga tika ki roto i te patengi raraunga ka whakamahia anake ki te hono i te hua kawemai ki tetahi waahanga (kua whakaoritehia te waahanga ki tona ingoa, a ka tikina te id waahanga i te wa e whakataurite ana):

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

I muri i te taapiri i tetahi hononga hua ki nga waahanga "Kawai 1" me "Kawai 2", ko nga korero hua kei roto i te roopu whakahaere he penei te ahua:

Magento 2: kawemai tika nga hua ki roto i te papaa raraunga

Nga mahi taapiri

Kia oti te kawemai raraunga, me whakaoti e koe nga mahi taapiri e whai ake nei:

  • taupū raraunga: waea i roto i te papatohu ./bin/magento indexer:reindex;
  • te whakahou i nga URL mo nga hua / waahanga: ka taea e koe te whakamahi i te toronga "elgentos/regenerate-catalog-urls«

Nga hua kei te papa whakahaere i muri i te mahi i etahi atu mahi:

Magento 2: kawemai tika nga hua ki roto i te papaa raraunga

a ki mua:

Magento 2: kawemai tika nga hua ki roto i te papaa raraunga

Whakarāpopoto

Ko te huinga o nga hua (10 nga waahanga) pera i te tuhinga o mua ka kawemai i te iti rawa o te raupapa o te rahi tere (1 te rua ki te 10). Kia tika ake te whakatau i te tere, me nui ake nga hua - he maha nga rau, he pai ake ranei nga mano. Heoi, ahakoa he iti te rahi o nga raraunga whakauru, ka taea e taatau te whakatau he mea nui te whakamahi i nga taputapu e whakaratohia ana e Magento (tauira me nga whare putunga) (Ka whakanui ahau - nui!) tere te whanaketanga o nga mahi e hiahiatia ana, engari i te wa ano ka tino nui (ka whakanui ahau - nui!) whakaitihia te tere o te urunga o nga raraunga ki roto i te papanga raraunga.

Ko te mutunga mai, kua makuku te wai, ehara tenei i te whakakitenga. Heoi, inaianei kei a au te tohu hei takaro, a tera pea ka tae ki etahi whakatau pai ake.

Source: will.com