Magento 2: hoʻokomo pololei i nā huahana i ka waihona

В ʻatikala mua Ua wehewehe au i ke kaʻina hana o ka lawe ʻana i nā huahana i Magento 2 ma ke ʻano maʻamau - ma o nā hiʻohiʻona a me nā waihona. ʻO ke ala maʻamau he haʻahaʻa haʻahaʻa loa ka wikiwiki o ka hoʻoili ʻikepili. E hana ana ka'u pona ma kahi o ho'okahi huahana no kekona. Ma kēia hoʻomau, noʻonoʻo wau i kahi ala ʻē aʻe e hoʻokomo ai i kahi huahana - ma ke komo pololei ʻana i ka waihona, ke kaʻe ʻana i nā mīkini Magento 2 maʻamau (nā kumu hoʻohālike, nā hale hana, nā waihona). Hiki ke hoʻololi ʻia ke kaʻina o nā ʻanuʻu e hoʻokomo i nā huahana i kekahi ʻōlelo papahana e hiki ke hana me MySQL.

Akahana: Loaʻa iā Magento nā hana i mākaukau no lawe ʻikepili a, ʻoi aku paha, e lawa ia iā ʻoe. Eia nō naʻe, inā makemake ʻoe i ka mana piha ma luna o ke kaʻina hana hoʻokomo, ʻaʻole i kaupalena ʻia i ka hoʻomākaukau ʻana i kahi faila CSV no kāu mea, e hoʻokipa i ka pōpoki.

Magento 2: hoʻokomo pololei i nā huahana i ka waihona

Hiki ke ʻike ʻia ke code i loaʻa mai ka kākau ʻana i nā ʻatikala ʻelua ma ka module Magento "flancer32/mage2_ext_demo_import". Eia kekahi mau kapu aʻu i hahai ai e hoʻomaʻamaʻa i ka code module demo:

  • Hoʻokumu wale ʻia nā huahana, ʻaʻole hōʻano hou.
  • Hoʻokahi hale kūʻai
  • Hoʻokomo ʻia nā inoa waeʻano wale nō, me ka ʻole o ko lākou ʻano
  • Hoʻopili nā hale ʻikepili i ka mana 2.3

JSON no ka lawe ʻana i hoʻokahi huahana:

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

ʻO ka nānā ʻana i nā pae nui o ka lawe ʻana mai

  • kakau inoa o ka huahana ponoi
  • ka pilina ma waena o ka huahana a me ka pūnaewele
  • ʻano huahana kumu (EAV)
  • ʻikepili waihona (nui o ka huahana i loko o ka waihona)
  • media (nā kiʻi)
  • pili me nā kāwai puke

Kakau inoa huahana

Hiki ke loaʻa ka ʻike kumu huahana ma 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`)
)

ʻO ka ʻike liʻiliʻi i koi ʻia no ka hana ʻana i kahi komo i ka papa inoa huahana:

  • attribute_set_id
  • sku

hou:

  • type_id - inā ʻaʻole mākou e wehewehe, a laila e hoʻohana ʻia ka 'maʻalahi'

No ke kākau pololei ʻana i ka waihona, hoʻohana wau i ka adapter DB o Magento ponoʻī:

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

Ma hope o ka hoʻopaʻa inoa ʻana i ka huahana me catalog_product_entity ʻike ʻia ia ma ka panel admin, ma ka pahu huahana (Catalog/Huahana).

Magento 2: hoʻokomo pololei i nā huahana i ka waihona

Ka pilina ma waena o ka huahana a me ka pūnaewele

ʻO ka hui o ka huahana me ka pūnaewele e hoʻoholo i nā hale kūʻai a hōʻike i ka huahana e loaʻa i 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: hoʻokomo pololei i nā huahana i ka waihona

Nā hiʻohiʻona huahana kumu

ʻAʻohe inoa a wehewehe ʻana paha i ka huahana i hoʻopaʻa inoa hou ʻia. Hana ʻia kēia mau mea a pau Nā hiʻohiʻona EAV. Eia ka papa inoa o nā ʻano huahana kumu e pono ai e hōʻike pololei ʻia ka huahana ma ke alo:

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

Hoʻohui ʻia kahi ʻano ʻokoʻa i kahi huahana e like me kēia (ua kāpae ʻia nā kikoʻī o ka loaʻa ʻana o ka mea ʻike a me ke ʻano o ka ʻano mai kāna code):

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

Ke hoʻohana nei i ka code attribute, hoʻoholo mākou i kona id a me ke ʻano ʻikepili (datetime, decimal, int, text, varchar), a laila e kākau i ka ʻikepili no ka puka makani hoʻokele i loko o ka pākaukau kūpono (store_id = 0).

Ma hope o ka hoʻohui ʻana i nā ʻano i luna i ka huahana, loaʻa iā ʻoe kēia kiʻi ma ka panel admin:

Magento 2: hoʻokomo pololei i nā huahana i ka waihona

ʻikepili waihona

E hoʻomaka ana mai ka mana 2.3 ma Magento, aia ʻelua mau papaʻaina like ʻole e hāʻawi i ka mālama ʻana i ka ʻike waihona (ka nui o nā huahana):

  • cataloginventory_*: hale kahiko;
  • inventory_*: hale hou (MSI - Multi Source Inventory);

Pono ʻoe e hoʻohui i ka ʻikepili waihona i nā hale ʻelua, no ka mea ʻAʻole kūʻokoʻa loa ka hale hou i ka mea kahiko (ʻo ia paha no default hale kūʻai i loko o ka hale hou e pili ana i kahi papaʻaina cataloginventory_stock_status e like me inventory_stock_1).

papa inoa

I ka hoʻoili ʻana iā Magneto 2.3, loaʻa iā mākou nā helu 2 i loko store_website, e pili ana i ʻelua mau pūnaewele - hoʻokele a me ka mea kūʻai nui:

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

Papakaukau cataloginventory_stock hoʻokahi wale nō kā mākou komo:

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

ʻO ia hoʻi, i loko o kā mākou hale kahiko hoʻokahi wale nō "hale hale kūʻai" (stock) a ua hoʻopili ʻia i ka pūnaewele hoʻokele. Hoʻohui i nā mea hou ma o ka admin panel sources/stocks ma MSI (ka hoʻolālā hou) ʻaʻole i loaʻa nā mea hou i loko cataloginventory_stock.

Hoʻopaʻa mua ʻia ka ʻikepili waihona e pili ana i nā huahana i ka hale kahiko ma nā papa:

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

waihona_

I ka hoʻomaka ʻana, ʻo ka hoʻolālā hou no ka mālama ʻana i ka ʻikepili waihona he 1 "kumu"(inventory_source):

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

a hoʻokahi "hale ukana"(inventory_stock):

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

«Puna» e hōʻike ana i ka mālama kino no nā huahana (ʻo ia ka moʻolelo i nā hoʻonohonoho kino a me ka helu leka uila). "Hale kūʻai"he hui kūpono o kekahi mau "kumu" (inventory_source_stock_link)

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

i ka pae kahi e pili ai i ke ala kūʻai (inventory_stock_sales_channel)

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

Ma ka hoʻoholo ʻana i ka hoʻolālā ʻikepili, manaʻo ʻia nā ʻano o nā kaila kūʻai, akā ma ka maʻamau ʻo ka pilina "kumukuai"-"paena"(ʻO ka loulou i ka pūnaewele ma muli o ke code pūnaewele - base).

ʻekahi "hale ukana"hiki ke hoʻopili ʻia i kekahi mau"kumu wai"a hoʻokahi"kumu"- i kekahi mau"hale kūʻai"(ka pilina many-to-many). He paʻamau nā ʻokoʻa "kumu"A"hale ukana". ʻAʻole lākou i hoʻopili hou ʻia i nā hui ʻē aʻe (ka palena ma ka pae code - ka hewa "ʻAʻole hiki ke mālama i ka loulou pili i ke Kumu Paʻamau a i ʻole Stock Default"). Hiki ke loaʻa nā kikoʻī hou aku e pili ana i ka hoʻolālā MSI ma Magento 2 ma ka ʻatikala "Pūnaehana hoʻokele hale kūʻai me CQRS a me Event Sourcing. Hoʻolālā".

E hoʻohana wau i ka hoʻonohonoho paʻamau a hoʻohui i nā ʻike āpau āpau i ke kumu default, ka mea e pili ana i ke ala kūʻai e pili ana i ka pūnaewele me ke code base (e pili ana i ka hope mua o ka hale kūʻai - ʻike 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);
}

Ma hope o ka hoʻohui ʻana i ka ʻikepili waiwai i ka huahana ma ka panel admin, loaʻa iā ʻoe kēia kiʻi:

Magento 2: hoʻokomo pololei i nā huahana i ka waihona

Lāpaho

Ke hoʻohui "manual" i kahi kiʻi i kahi huahana ma o ka admin panel, kākau ʻia ka ʻike pili i nā papa aʻe:

  • catalog_product_entity_media_gallery: ke kākau inoa media (nā kiʻi a me nā faila wikiō);
  • catalog_product_entity_media_gallery_value: ka hoʻopili ʻana i nā media i nā huahana a me nā hōʻikeʻike (localization);
  • catalog_product_entity_media_gallery_value_to_entity: ka hoʻopili ʻana i ka pāpaho i nā huahana wale nō (ma ke ʻano he maʻiʻo media paʻamau no ka huahana);
  • catalog_product_entity_varchar: Ua mālama ʻia nā kuleana i hoʻohana ʻia ai ke kiʻi ma ʻaneʻi;

a mālama ʻia nā kiʻi i ka papa kuhikuhi ./pub/media/catalog/product/x/y/kahi x и y - ka hua mua a me ka lua o ka inoa faila kiʻi. No ka laʻana, faila image.png pono e mālama ʻia e like me ./pub/media/catalog/product/i/m/image.png, i hiki i ka paepae ke hoʻohana ia mea ma ke ʻano he kiʻi i ka wehewehe ʻana i nā huahana mai ka papa inoa.

Hoʻopaʻa inoa ʻia ma ./pub/media/catalog/product/ waihona media (ʻaʻole i kūkākūkā ʻia ke kaʻina hana o ka waiho ʻana i ka faila ma kēia ʻatikala):

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

Ke hoʻopaʻa inoa ʻia, hāʻawi ʻia kahi faila media hou i mea hōʻike.

Hoʻopili mākou i ka faila media i hoʻopaʻa ʻia me ka huahana pili no ka hale kūʻai paʻamau:

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

Hoʻopili mākou i ka faila media i hoʻopaʻa ʻia me ka huahana pili ʻole me ka nakinaki ʻole ʻia i kekahi hale kūʻai. ʻAʻole maopopo i kahi i hoʻohana ʻia ai kēia ʻikepili a no ke aha i hiki ʻole ai ke komo i ka ʻikepili mai ka papa mua, akā aia kēia papa a kākau ʻia ka ʻikepili iā ia ke hoʻohui ʻia kahi kiʻi i ka huahana. No laila ʻo ia.

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

Hiki ke hoʻohana ʻia kahi faila media me nā kuleana like ʻole (e hōʻike ʻia ke code hiʻona e pili ana i nā pale):

  • kumu(image)
  • Kiʻi liʻiliʻi (small_image)
  • Kiʻi liʻiliʻi (thumbnail)
  • Kiʻi Swatch (swatch_image)

ʻO ka hoʻopili ʻana i nā kuleana i kahi faila media ka mea e hana ai i loko catalog_product_entity_varchar. Ua like ke code paʻa me ke code ma ka "Nā hiʻohiʻona huahana kumu".

Ma hope o ka hoʻohui ʻana i kahi kiʻi i ka huahana ma ka admin panel e like me kēia:

Magento 2: hoʻokomo pololei i nā huahana i ka waihona

Māhele

Nā papa nui i loaʻa ka ʻikepili ma ka waeʻano:

  • catalog_category_entity: kakau inoa o na mahele;
  • catalog_category_product: ka pilina ma waena o nā huahana a me nā waeʻano;
  • catalog_category_entity_*: Nā waiwai waiwai EAV;

I ka hoʻomaka ʻana, i loko o kahi noi Magento ʻole, aia ka papa inoa o ka waeʻano he 2 mau ʻāpana (Ua pōkole wau i nā inoa kolamu: 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|

ʻO ka māhele me ka id=1 ke kumu o ka papa inoa Magento holoʻokoʻa a ʻaʻole i loaʻa ma ka papa admin a i ʻole ma ka ʻaoʻao mua. Māhele me ka id=2 (Māhele Default) ʻo ia ke kumu kumu no ka hale kūʻai nui o ka pūnaewele (Hale Kūʻai Pūnaewele Nui) i hana ʻia ke kau ʻia ka noi (e ʻike. Admin / Halekuai / Halekuai a pau). Eia kekahi, ʻaʻole i loaʻa ka ʻāpana kumu o ka hale kūʻai ma mua, ʻo kāna mau subcategories wale nō.

No ka mea e hoʻokomo mau ana ke kumuhana o kēia ʻatikala i ka ʻikepili i nā huahana, ʻaʻole wau e hoʻohana i ke komo pololei i ka waihona i ka wā e hana ai i nā ʻāpana, akā e hoʻohana i nā papa i hāʻawi ʻia e Magento ponoʻī (nā hiʻohiʻona a me nā waihona). Hoʻohana ʻia ke komo pololei ʻana i ka waihona no ka hoʻopili ʻana i ka huahana i lawe ʻia mai me kahi ʻāpana (ua hoʻohālikelike ʻia ka waeʻāina me kona inoa, a kiʻi ʻia ka id waeʻano i ka wā hoʻohālikelike):

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

Ma hope o ka hoʻohui ʻana i kahi loulou huahana i nā ʻāpana "Category 1" a me "Category 2", ʻo nā kikoʻī huahana i ka admin panel e like me kēia:

Magento 2: hoʻokomo pololei i nā huahana i ka waihona

Nā hana hou

Ke pau ka lawe ʻana i ka ʻikepili, pono ʻoe e hoʻopau i kēia mau hana hou:

  • ʻikepili helu: kelepona i ka console ./bin/magento indexer:reindex;
  • hana hou i nā URL no nā huahana / ʻāpana: hiki iā ʻoe ke hoʻohana i ka hoʻonui "elgentos/regenerate-catalog-urls«

Nā huahana i ka admin panel ma hope o ka hana ʻana i nā hana hou aʻe:

Magento 2: hoʻokomo pololei i nā huahana i ka waihona

a ma ke alo:

Magento 2: hoʻokomo pololei i nā huahana i ka waihona

Hōʻuluʻulu

ʻO ka pūʻulu like o nā huahana (10 mau ʻāpana) e like me ka ʻatikala mua i lawe ʻia ma kahi o ka ʻoi aku ka nui o ka wikiwiki (1 kekona versus 10). No ka hoʻohālikelike pololei ʻana i ka wikiwiki, pono ʻoe i kahi helu nui o nā huahana - he mau haneli, a ʻoi aku paha nā tausani. Eia nō naʻe, ʻoiai me ka liʻiliʻi liʻiliʻi o ka ʻikepili hoʻokomo, hiki iā mākou ke hoʻoholo i ka hoʻohana ʻana i nā mea hana i hāʻawi ʻia e Magento (nā hiʻohiʻona a me nā repositories) he mea nui (koʻikoʻi wau - nui!) e wikiwiki i ka hoʻomohala ʻana i nā hana i koi ʻia, akā i ka manawa like me ka nui (koʻikoʻi wau - nui!) e hoemi i ka wikiwiki e komo ai ka ikepili i ka waihona.

ʻO ka hopena, ua lilo ka wai i pulu a ʻaʻole kēia he hōʻike. Eia naʻe, i kēia manawa ua loaʻa iaʻu ke code e pāʻani ai a hiki paha i kekahi mau hopena hoihoi.

Source: www.habr.com