Magento 2: fa'aulu sa'o mai oloa ile fa'amaumauga

В mataupu muamua Na ou faamatalaina le faagasologa o le faaulufaleina mai o oloa i totonu o Magento 2 i le auala masani - e ala i faʻataʻitaʻiga ma faleoloa. O le auala masani e maualalo tele le saoasaoa o faʻamaumauga. O la'u komepiuta feavea'i na gaosia pe tusa ma le tasi le oloa i le sekone. I lenei faʻaauau, ou te mafaufau i se isi auala e faʻaulufale mai ai se oloa - e ala i le tuʻuina saʻo i totonu o faʻamaumauga, faʻafeiloaʻi le tulaga masani Magento 2 (faʻataʻitaʻiga, faleoloa, faleoloa). O le fa'asologa o laasaga e fa'aulufale mai ai oloa e mafai ona fa'afetaui i so'o se gagana fa'apolokalame e mafai ona galue ma MySQL.

Tuuese: Magento ua saunia-faia galuega mo fa'amatalaga fa'aulufale mai ma, e foliga mai, o le a lava mo oe. Ae peita'i, afai e te mana'omia le fa'atonuina atoatoa o le fa'aulufale mai, e le gata i le sauniaina o se faila CSV mo mea o lo'o ia te oe, fa'afeiloa'i ile pusi.

Magento 2: fa'aulu sa'o mai oloa ile fa'amaumauga

O le faʻailoga e mafua mai i le tusiaina o tala e lua e mafai ona vaʻaia i le Magento module "flancer32/mage2_ext_demo_import". O nisi nei o tapulaʻa na ou mulimulitaʻia e faʻafaigofie ai le code module demo:

  • O oloa e na'o le fausiaina, e le'o fa'afouina.
  • Tasi faleteuoloa
  • Na'o igoa o vaega e fa'aulufale mai, e aunoa ma le latou fausaga
  • O fa'amaumauga o fa'amaumauga e ogatasi ma le version 2.3

JSON mo le fa'aulufaleina mai o se oloa e tasi:

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

Vaaiga lautele o vaega autu o le faaulufale mai

  • resitalaina o le oloa lava ia
  • feso'ota'iga i le va o oloa ma le upega tafa'ilagi
  • uiga autu o oloa (EAV)
  • fa'amaumauga o fa'amaumauga (tele o oloa o lo'o i totonu o fa'asoa)
  • ala o faasalalauga (ata)
  • feso'ota'iga ma fa'avasegaga fa'amaumauga

Faamauina o oloa

E mafai ona maua fa'amatalaga autu o oloa ile 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`)
)

Ole fa'amatalaga la'ititi e mana'omia e fai ai se fa'amatalaga ile resitala o oloa ole:

  • attribute_set_id
  • sku

fa'aopoopo:

  • type_id - afai tatou te le faʻamaonia, ona 'faigofie' o le a faʻaaogaina

Ina ia tusi saʻo i le database, ou te faʻaogaina le DB adapter o Magento lava ia:

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

Ina ua uma ona lesitala le oloa ma catalog_product_entity e mafai ona iloa i le admin panel, i le faasologa o oloa (Catalog/Oloa).

Magento 2: fa'aulu sa'o mai oloa ile fa'amaumauga

Sootaga i le va o oloa ma le upega tafaʻilagi

O le feso'ota'iga o le oloa ma le 'upega tafa'ilagi e fuafua po'o fea faleoloa ma fa'aalia le oloa o le a maua i luma.

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: fa'aulu sa'o mai oloa ile fa'amaumauga

Uiga autu o oloa

Ole oloa faatoa resitalaina e le'i iai se igoa po'o se fa'amatalaga. O nei mea uma e faia EAV uiga. Ole lisi lea o uiga fa'avae oloa e mana'omia ina ia fa'aalia sa'o le oloa ile pito i luma:

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

E fa'aopoopoina se uiga ese'ese i se oloa fa'apenei (o fa'amatalaga o le mauaina o le fa'amatalaga ma le ituaiga o uiga mai lona fa'ailoga ua le maua):

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

I le faʻaaogaina o le faʻailoga uiga, matou te fuafuaina lona id ma faʻamaumauga (datetime, decimal, int, text, varchar), ona tusi lea o faʻamatalaga mo le faʻamalama pulega i totonu o le laulau talafeagai (store_id = 0).

A maeʻa ona faʻaopoopo uiga o loʻo i luga i le oloa, e te mauaina le ata lea i le admin panel:

Magento 2: fa'aulu sa'o mai oloa ile fa'amaumauga

Fa'amaumauga o fa'amaumauga

Amata mai le version 2.3 i Magento, e lua seti tutusa o laulau o loʻo tuʻuina atu ai le teuina o faʻamatalaga faʻamaumauga (tele oloa):

  • cataloginventory_*: fausaga tuai;
  • inventory_*: fausaga fou (MSI - Multi Source Inventory);

E te manaʻomia le faʻaopoopoina o faʻamaumauga o suʻesuʻega i fausaga uma e lua, aua o le fausaga fou e leʻi tutoʻatasi atoatoa mai le mea tuai (e foliga mai mo default faleteuoloa i le fausaga fou e aofia ai se laulau cataloginventory_stock_status e pei inventory_stock_1).

cataloginventory_

Pe a faʻaaogaina le Magneto 2.3 muamua matou te maua 2 faʻamaumauga i totonu store_website, lea e fetaui ma nofoaga e lua - pulega ma le kalani autu:

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

Laupapa cataloginventory_stock e na'o le tasi le matou ulufale:

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

O lona uiga, i totonu o le matou fausaga tuai e naʻo le tasi le "fale teu oloa" (stock) ma o loʻo fesoʻotaʻi atu i le upega tafaʻilagi a le pulega. Fa'aopoopo mea fou e ala i le admin panel sources/stocks i le MSI (faatulagaga fou) e le maua ai ni fa'amaumauga fou i totonu cataloginventory_stock.

O fa'amaumauga o fa'amaumauga e uiga i oloa i le fausaga tuai o lo'o fa'amauina muamua i laulau:

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

inventory_

I le taimi muamua, o le fausaga fou mo le teuina o faʻamaumauga faʻamaumauga e aofia ai le 1 "punavai"(inventory_source):

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

ma le tasi"faletupe"(inventory_stock):

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

«Punaoa» o lo'o fa'atusalia le teuina fa'aletino mo oloa (o lo'o iai fa'amaumauga fa'apitoa ma tuatusi meli). "Fale teu oloa"o se fa'atasiga talafeagai o le tele o" puna'oa (inventory_source_stock_link)

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

i le tulaga o loʻo tupu ai le fesoʻotaʻiga i le auala faʻatau (inventory_stock_sales_channel)

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

Faʻamasinoina i le faʻatulagaina o faʻamaumauga, o ituaiga eseese o auala faʻatau e faʻaaogaina, ae naʻo le faʻaogaina o le fesoʻotaʻiga "oloa"-"website"(o le sootaga i le upega tafaʻilagi e mulimuli i le upega tafaʻilagi code - base).

Tasi "faletupe"e mafai ona faʻafesoʻotaʻi i nisi"i punaoa"ma le tasi"punavai"- i ni nai"faleteuoloa"(tele-i-tele sootaga). O tuusaunoaga e faaletonu "punavai"Ma"faletupe". Latou te le toe faʻafesoʻotaʻi i isi faʻalapotopotoga (faʻatapulaʻa i le tulaga faʻailoga - o le mea sese "E le mafai ona fa'asaoina so'oga e feso'ota'i ma Punavai Fa'aleaogaina po'o Fa'asoa Fa'atonu"). O nisi faʻamatalaga e uiga i le fausaga MSI i Magento 2 e mafai ona maua i le tusiga "Faiga fa'afoega o faleteuoloa e fa'aaoga ai le CQRS ma le Fa'asologa o Mea. Fuafuaga".

O le a ou faʻaogaina le faʻaoga le faʻaogaina ma faʻaopoopo uma faʻamatalaga faʻamaumauga i le puna default, lea o loʻo aʻafia i le auala faʻatau e fesoʻotaʻi ma le upega tafaʻilagi ma le code base (e fetaui ma le pito i luma o le faleoloa - vaʻai 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);
}

A maeʻa ona faʻaopoopo faʻamaumauga faʻamaumauga i le oloa ile admin panel, e te mauaina le ata lenei:

Magento 2: fa'aulu sa'o mai oloa ile fa'amaumauga

Faasalalauga

Pe a "lima" faʻaopoopoina se ata i se oloa e ala i le admin panel, o faʻamatalaga talafeagai e tusia i lalo i laulau nei:

  • catalog_product_entity_media_gallery: resitala o ala o faasalalauga (ata ma faila vitio);
  • catalog_product_entity_media_gallery_value: feso'ota'i fa'asalalauga i oloa ma fa'aaliga (localization);
  • catalog_product_entity_media_gallery_value_to_entity: fa'afeso'ota'i ala fa'asalalau i na'o oloa (atonu e le'i fa'aogaina mea fa'asalalau mo le oloa);
  • catalog_product_entity_varchar: O matafaioi o loʻo faʻaogaina ai le ata o loʻo teuina iinei;

ma o ata lava ia e teuina i le lisi ./pub/media/catalog/product/x/y/fea x и y - mataitusi muamua ma le lua o le igoa faila ata. Mo se faʻataʻitaʻiga, faila image.png e tatau ona faasaoina e pei ./pub/media/catalog/product/i/m/image.png, ina ia mafai e le faʻavae ona faʻaaogaina o se ata pe a faʻamatalaina oloa mai le faʻamaumauga.

Resitala lafo i totonu ./pub/media/catalog/product/ faila faila (o le faagasologa o le tuʻuina o le faila lava ia e le o talanoaina i lenei tusiga):

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

A resitalaina, o se faila faʻasalalau fou e tuʻuina atu se faʻamatalaga.

Matou te fa'afeso'ota'ia le faila fa'asalalau fa'asalalau fa'atasi ma le oloa fa'atatau mo le faleoloa fa'aletonu:

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

Matou te fa'afeso'ota'ia le faila fa'asalalau fa'asalalau ma le oloa fa'atatau e aunoa ma le nonoa i so'o se faleoloa. E le o manino poʻo fea tonu o loʻo faʻaogaina ai nei faʻamatalaga ma pe aisea e le mafai ai ona maua faʻamatalaga mai le laulau muamua, ae o loʻo i ai lenei laulau ma o loʻo tusia i ai faʻamatalaga pe a faʻaopoopo se ata i le oloa. O lea la.

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

E mafai ona fa'aogaina se faila fa'asalalau i ni matafaioi eseese (o lo'o fa'aalia le fa'ailoga o uiga fa'atatau i puipui):

  • faavae(image)
  • Ata Laiti (small_image)
  • Ata lima (thumbnail)
  • Swatch Ata (swatch_image)

Fa'afeso'ota'i matafaioi i se faila fa'asalalau o le mea tonu lava lea e tupu i totonu catalog_product_entity_varchar. O le faʻamaufaʻailoga e tutusa ma le code i le "Uiga autu o oloa".

A maeʻa ona faʻapipiʻi se ata i le oloa i le admin panel e pei o lenei:

Magento 2: fa'aulu sa'o mai oloa ile fa'amaumauga

Vaega

Laupapa autu o lo'o iai fa'amaumauga i vaega:

  • catalog_category_entity: resitala o vaega;
  • catalog_category_product: sootaga i le va o oloa ma vaega;
  • catalog_category_entity_*: EAV uiga taua;

I le taimi muamua, i totonu o se talosaga Magento gaogao, o le resitala vaega e aofia ai vaega e 2 (Na ou faapuupuuina igoa koluma: 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|

Ole vaega ile id=1 ole a'a ole lisi atoa o Magento ma e le o maua ile admin panel po'o luga ole itulau pito i luma. Vaega ma id=2 (Vasega Fa'atonu) o le vaega a'a mo le faleoloa autu a le nofoaga autu (Faleoloa Upega Tafa'ilagi Autu) faia pe a faʻapipiʻiina le talosaga (vaai. Pule / Faleoloa / Faleoloa Uma). E le gata i lea, o le aʻa o le faleoloa lava ia e le o maua i luma, naʻo ona vaega laiti.

Talu ai o le autu o lenei tusiga o loʻo faʻauluina pea faʻamatalaga i luga o oloa, o le a ou le faʻaogaina saʻo i totonu o le database pe a fatuina vaega, ae o le a faʻaaogaina vasega na saunia e Magento lava ia (faʻataʻitaʻiga ma faleoloa). O le fa'aoga sa'o i totonu o fa'amaumauga e fa'aoga na'o le fa'afeso'ota'i o oloa fa'aulufale mai ma se vaega (o le vaega e fetaui ma lona igoa, ma le vaega id e toe maua i le taimi o le fa'atusa):

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

A maeʻa ona faʻapipiʻi se fesoʻotaʻiga oloa i vaega "Vaega 1" ma le "Vaega 2", o faʻamatalaga o oloa i le admin panel e pei o lenei:

Magento 2: fa'aulu sa'o mai oloa ile fa'amaumauga

Gaoioiga faaopoopo

A mae'a le fa'aulufaleina mai o fa'amaumauga, e tatau ona e fa'amae'aina laasaga fa'aopoopo nei:

  • fa'amaumauga fa'amaumauga: vala'au i totonu o le fa'amafanafanaga ./bin/magento indexer:reindex;
  • toe faʻafouina URL mo oloa / vaega: e mafai ona e faʻaogaina le faʻaopoopoga "elgentos/regenerate-catalog-urls«

O oloa i le admin panel pe a uma ona faia ni gaioiga faaopoopo:

Magento 2: fa'aulu sa'o mai oloa ile fa'amaumauga

ma i luma:

Magento 2: fa'aulu sa'o mai oloa ile fa'amaumauga

Aotelega

O le seti tutusa o oloa (10 fasi pepa) e pei ona i ai i le mataupu muamua o loʻo faʻaulufaleina mai ia le itiiti ifo ma le faʻatonuina o le tele vave (1 sekone faʻatusatusa i le 10). Ina ia sili atu ona saʻo le faʻatusatusaina o le saoasaoa, e te manaʻomia se numera tele o oloa - e fia selau, pe sili atu le afe. Ae ui i lea, e tusa lava pe laʻititi laʻititi o faʻamatalaga faʻapipiʻi, e mafai ona tatou faʻamaonia o le faʻaaogaina o meafaigaluega na tuʻuina mai e Magento (faʻataʻitaʻiga ma fale teu oloa) e taua tele (Ou te faamamafaina - taua!) faʻavaveina le atinaʻeina o galuega manaʻomia, ae i le taimi lava e tasi e taua tele (Ou te faamamafa atu - taua!) fa'aitiitia le saoasaoa e maua ai fa'amaumauga i totonu o fa'amaumauga.

O le i'uga, na susū le vai ma e le o se fa'aaliga lea. Ae ui i lea, o lea ua ia te aʻu le code e taʻalo ai ma atonu o le a oʻo mai i ni faʻaiuga sili atu ona manaia.

puna: www.habr.com