Magento 2: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² прямо Π² Π±Π°Π·Ρƒ

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я описал процСсс ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² Π² Magento 2 ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ способом β€” Ρ‡Π΅Ρ€Π΅Π· ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ способ отличаСтся вСсьма Π½ΠΈΠ·ΠΊΠΎΠΉ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. На ΠΌΠΎΡ‘ΠΌ Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠ»ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ Π² сСкунду. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠΈ я Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° β€” прямой записью Π² Π±Π°Π·Ρƒ, Π² ΠΎΠ±Ρ…ΠΎΠ΄ стандартных ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Magento 2 (ΠΌΠΎΠ΄Π΅Π»ΠΈ, Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ, Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ). ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ шагов, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄ любой язык программирования, способный Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с MySQL.

Disclaimer: Π’ Magento Π΅ΡΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ΠΏΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ, скорСС всСго, Π²Π°ΠΌ Π΅Π³ΠΎ Ρ…Π²Π°Ρ‚ΠΈΡ‚. Однако Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° процСссом ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°, Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΎΠΉ CSV-Ρ„Π°ΠΉΠ»Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ β€” Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

Magento 2: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² прямо Π² Π±Π°Π·Ρƒ

Код, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ написания ΠΎΠ±Π΅ΠΈΡ… статСй, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Magento-ΠΌΠΎΠ΄ΡƒΠ»Π΅ «flancer32/mage2_ext_demo_import«. Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… я придСрТивался, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π΄Π΅ΠΌΠΎ-модуля:

  • ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ, Π½Π΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ.
  • Один склад
  • Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ названия ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ, Π±Π΅Π· ΠΈΡ… структуры
  • Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ вСрсии 2.3

JSON для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°:

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

ΠžΠ±Π·ΠΎΡ€ основных этапов ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°

  • рСгистрация самого ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°
  • связь ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΈ web-сайта
  • Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° (EAV)
  • ΠΈΠ²Π΅Π½Ρ‚Π°Ρ€Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (количСство ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Π½Π° складС)
  • ΠΌΠ΅Π΄ΠΈΠ° (ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ)
  • связь с катСгориями ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

РСгистрация ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°

Базовая информация ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅ находится Π² 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`)
)

Минимально нСобходимая информация для создания записи Π² рССстрС ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²:

  • attribute_set_id
  • sku

Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ:

  • type_id β€” Ссли Π½Π΅ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ использовано ‘simple’

Для прямой записи Π² Π±Π°Π·Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ DB-Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ самой Magento:

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

ПослС рСгистрации ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Π² catalog_product_entity ΠΎΠ½ становится Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅, Π² Π³Ρ€ΠΈΠ΄Π΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² (Catalog / Products).

Magento 2: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² прямо Π² Π±Π°Π·Ρƒ

Бвязь ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΈ web-сайта

Бвязь ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° с сайтом опрСдСляСт, Π² ΠΊΠ°ΠΊΠΈΡ… ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°Ρ… ΠΈ Π½Π° ΠΊΠ°ΠΊΠΈΡ… Π²ΠΈΡ‚Ρ€ΠΈΠ½Π°Ρ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ доступСн Π½Π° Ρ„Ρ€ΠΎΠ½Ρ‚Π΅.

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: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² прямо Π² Π±Π°Π·Ρƒ

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°

Π£ свСТСзарСгистрированного ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚ Π½ΠΈ ΠΈΠΌΠ΅Π½ΠΈ, Π½ΠΈ описания. Всё это дСлаСтся Ρ‡Π΅Ρ€Π΅Π· EAV-Π°Ρ‚Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹. Π’ΠΎΡ‚ список Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½Ρ‹ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ достаточно ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ показывался Π½Π° Ρ„Ρ€ΠΎΠ½Ρ‚Π΅:

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

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΊ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρƒ добавляСтся Π²ΠΎΡ‚ Ρ‚Π°ΠΊ (ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹ Π΄Π΅Ρ‚Π°Π»ΠΈ получСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈ Ρ‚ΠΈΠΏΠ° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΏΠΎ Π΅Π³ΠΎ ΠΊΠΎΠ΄Ρƒ):

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

По ΠΊΠΎΠ΄Ρƒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° опрСдСляСм Π΅Π³ΠΎ id ΠΈ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… (datetime, decimal, int, text, varchar), Π·Π°Ρ‚Π΅ΠΌ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ пишСм Π΄Π°Π½Π½Ρ‹Π΅ для административной Π²ΠΈΡ‚Ρ€ΠΈΠ½Ρ‹ (store_id = 0).

ПослС добавлСния Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΊ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρƒ получаСтся Π²ΠΎΡ‚ такая ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅:

Magento 2: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² прямо Π² Π±Π°Π·Ρƒ

Π˜Π½Π²Π΅Π½Ρ‚Π°Ρ€Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

Начиная с вСрсии 2.3 Π² Magento ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ сущСствуСт Π΄Π²Π° Π½Π°Π±ΠΎΡ€Π° Ρ‚Π°Π±Π»ΠΈΡ†, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (количСство ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°):

  • cataloginventory_*: старая структура;
  • inventory_*: новая структура (MSI β€” Multi Source Inventory);

Π”ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π² ΠΎΠ±Π΅ структуры, Ρ‚.ΠΊ. новая структура ΠΏΠΎΠΊΠ° Π΅Ρ‰Ρ‘ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависима ΠΎΡ‚ старой (ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ для default склада Π² Π½ΠΎΠ²ΠΎΠΉ структурС задСйствована Ρ‚Π°Π±Π»ΠΈΡ†Π° cataloginventory_stock_status Π² качСствС inventory_stock_1).

cataloginventory_

ΠŸΡ€ΠΈ Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ Magneto 2.3 ΠΌΡ‹ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Π΅ΠΌ 2 записи Π² store_website, Ρ‡Ρ‚ΠΎ соотвСтствуСт Π΄Π²ΡƒΠΌ сайтам β€” административному ΠΈ основному клиСнтскому:

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

Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ cataloginventory_stock Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° запись:

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

Π’.Π΅., Ρƒ нас Π² старой структурС Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ «ΡΠΊΠ»Π°Π΄» (stock) ΠΈ ΠΎΠ½ привязан ΠΊ административному website’Ρƒ. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π°Π΄ΠΌΠΈΠ½ΠΊΡƒ Π½ΠΎΠ²Ρ‹Ρ… sources/stocks Π² MSI (Π½ΠΎΠ²ΡƒΡŽ структуру) Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ появлСнию Π½ΠΎΠ²Ρ‹Ρ… записСй Π² cataloginventory_stock.

Π˜Π½Π²Π΅Π½Ρ‚Π°Ρ€Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°Ρ… Π² старой структурС ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…:

  • 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_

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ новая структура для хранСния ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… содСрТит 1 «ΠΈΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ» (inventory_source):

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

ΠΈ ΠΎΠ΄ΠΈΠ½ «ΡΠΊΠ»Π°Π΄» (inventory_stock):

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

«Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ» прСдставляСт собой физичСскоС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² (запись содСрТит физичСскиС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ адрСс). «Π‘ΠΊΠ»Π°Π΄» прСдставляСт собой логичСскоС объСдинСниС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… «ΠΈΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΎΠ²» (inventory_source_stock_link)

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

Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ происходит привязка ΠΊ ΠΊΠ°Π½Π°Π»Ρƒ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠΈ (inventory_stock_sales_channel)

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

Будя ΠΏΠΎ структурС Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΏΡ€ΠΎΠ΄Π°ΠΆ, Π½ΠΎ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ связь «stock«-«website» (ссылка Π½Π° web-сайт ΠΈΠ΄Ρ‘Ρ‚ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ web-сайта β€” base).

Один «ΡΠΊΠ»Π°Π΄» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ привязан ΠΊ нСскольким «ΠΈΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠ°ΠΌ«, Π° ΠΎΠ΄ΠΈΠ½ «ΠΈΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ» β€” ΠΊ нСскольким «ΡΠΊΠ»Π°Π΄Π°ΠΌ» (ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ «ΠΌΠ½ΠΎΠ³ΠΈΠ΅-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌ»). Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ default’ΠΎΠ²Ρ‹Π΅ «ΠΈΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ» ΠΈ «ΡΠΊΠ»Π°Π΄«. Они Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ сущностям (ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ΄Π° β€” Π²Ρ‹Π»Π΅Ρ‚Π°Π΅Ρ‚ ошибка «Can not save link related to Default Source or Default Stock«). Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ структурС MSI Π² Magento 2 ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ «Π‘истСма управлСния складом с использованиСм CQRS ΠΈ Event Sourcing. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅«.

Π― Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ default’ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ всю ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² источник default, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ задСйствован Π² ΠΊΠ°Π½Π°Π»Π΅ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠΈ, связанном с web-сайтом с ΠΊΠΎΠ΄ΠΎΠΌ base (соотвСтствуСт клиСнтской части ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° β€” см. 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);
}

ПослС добавлСния ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΊ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρƒ Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅ получаСтся Π²ΠΎΡ‚ такая ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°:

Magento 2: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² прямо Π² Π±Π°Π·Ρƒ

МСдиа

ΠŸΡ€ΠΈ «Ρ€ΡƒΡ‡Π½ΠΎΠΌ» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΊ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρƒ изобраТСния Ρ‡Π΅Ρ€Π΅Π· Π°Π΄ΠΌΠΈΠ½ΠΊΡƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ информация прописываСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…:

  • catalog_product_entity_media_gallery: ΠΌΠ΅Π΄ΠΈΠ°-рССстр (изобраТСния ΠΈ Π²ΠΈΠ΄Π΅ΠΎ-Ρ„Π°ΠΉΠ»Ρ‹);
  • catalog_product_entity_media_gallery_value: привязка ΠΌΠ΅Π΄ΠΈΠ° ΠΊ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°ΠΌ ΠΈ Π²ΠΈΡ‚Ρ€ΠΈΠ½Π°ΠΌ (локализация);
  • catalog_product_entity_media_gallery_value_to_entity: привязка ΠΌΠ΅Π΄ΠΈΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°ΠΌ (ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, default ΠΌΠ΅Π΄ΠΈΠ°-ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ для ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°);
  • catalog_product_entity_varchar: здСсь ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Ρ€ΠΎΠ»ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅;

Π° сами изобраТСния ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ./pub/media/catalog/product/x/y/, Π³Π΄Π΅ x ΠΈ y β€” пСрвая ΠΈ вторая Π±ΡƒΠΊΠ²Ρ‹ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. НапримСр, Ρ„Π°ΠΉΠ» image.png Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ сохранён ΠΊΠ°ΠΊ ./pub/media/catalog/product/i/m/image.png, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° ΠΌΠΎΠ³Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² качСствС изобраТСния ΠΏΡ€ΠΈ описании ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

РСгистрируСм Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹ΠΉ Π² ./pub/media/catalog/product/ ΠΌΠ΅Π΄ΠΈΠ°-Ρ„Π°ΠΉΠ» (сам процСсс размСщСния Ρ„Π°ΠΉΠ»Π° Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π΅ рассматриваСтся):

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

ΠŸΡ€ΠΈ рСгистрации Π½ΠΎΠ²ΠΎΠΌΡƒ ΠΌΠ΅Π΄ΠΈΠ°-Ρ„Π°ΠΉΠ»Ρƒ присваиваСтся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡ‚ΠΎΡ€.

БвязываСм зарСгистрированный ΠΌΠ΅Π΄ΠΈΠ°-Ρ„Π°ΠΉΠ» с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠΌ для default-Π²ΠΈΡ‚Ρ€ΠΈΠ½Ρ‹:

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

БвязываСм зарСгистрированный ΠΌΠ΅Π΄ΠΈΠ°-Ρ„Π°ΠΉΠ» с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠΌ Π±Π΅Π· привязки ΠΊ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π²ΠΈΡ‚Ρ€ΠΈΠ½Π΅. НС понятно, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ нСльзя ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π½ΠΎ Π²ΠΎΡ‚ эта Ρ‚Π°Π±Π»ΠΈΡ†Π° сущСствуСт ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π½Π΅Ρ‘ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΊ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ.

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

МСдиа-Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ролями (Π² скобках ΡƒΠΊΠ°Π·Π°Π½ ΠΊΠΎΠ΄ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°):

  • Base (image)
  • Small Image (small_image)
  • Thumbnail (thumbnail)
  • Swatch Image (swatch_image)

ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° Ρ€ΠΎΠ»Π΅ΠΉ ΠΊ ΠΌΠ΅Π΄ΠΈΠ°-Ρ„Π°ΠΉΠ»Ρƒ ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ происходит Π² catalog_product_entity_varchar. Код привязки Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΊΠΎΠ΄Ρƒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°«.

ПослС добавлСния изобраТСния ΠΊ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρƒ Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅ получаСтся Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

Magento 2: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² прямо Π² Π±Π°Π·Ρƒ

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТатся Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ катСгориям:

  • catalog_category_entity: рССстр ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ;
  • catalog_category_product: связь ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ;
  • catalog_category_entity_*: значСния EAV-Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²;

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ, Π² пустом Magento-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π² рССстрС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ содСрТится 2 ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ (я сократил названия ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ: 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|

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ с id=1 являСтся ΠΊΠΎΡ€Π½Π΅ΠΌ всСго Magento-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ нСдоступна Π½ΠΈ Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅, Π½ΠΈ Π½Π° Ρ„Ρ€ΠΎΠ½Ρ‚Π΅. ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ с id=2 (Default Category) являСтся ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠ΅ΠΉ для основного ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° основного сайта (Main Website Store), создаваСмого ΠΏΡ€ΠΈ Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ прилоТСния (см. Admin / Stores / All Stores). ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ сама корнСвая катСгория ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Π½Π° Ρ„Ρ€ΠΎΠ½Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ нСдоступна, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Ρ‘ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅ΠΌΠΎΠΉ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ всё-Ρ‚Π°ΠΊΠΈ являСтся ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°ΠΌ, Ρ‚ΠΎ я Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΡΠΌΡƒΡŽ запись Π² Π±Π°Π·Ρƒ ΠΏΡ€ΠΈ создании ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ, Π° Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡΡŒ классами прСдоставляСмыми самой Magento (ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ). ΠŸΡ€ΡΠΌΠ°Ρ запись Π² Π±Π°Π·Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для связи ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° с ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠ΅ΠΉ (сопоставлСниС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ происходит ΠΏΠΎ Π΅Ρ‘ ΠΈΠΌΠ΅Π½ΠΈ, ΠΏΡ€ΠΈ сопоставлСнии извлСкаСтся id ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ):

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

ПослС добавлСния связи ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° с катСгориями «ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 1» ΠΈ «ΠšΠ°Ρ‚Сгория 2» Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅ выглядят ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

Magento 2: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² прямо Π² Π±Π°Π·Ρƒ

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π΄Π°Π½Π½Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия:

  • индСксация Π΄Π°Π½Π½Ρ‹Ρ…: Π²Ρ‹Π·ΠΎΠ² Π² консоли ./bin/magento indexer:reindex;
  • рСгСнСрация URL’ΠΎΠ² для ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²/ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ: ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ «elgentos/regenerate-catalog-urls«

ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅ послС выполнСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий:

Magento 2: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² прямо Π² Π±Π°Π·Ρƒ

ΠΈ Π½Π° Ρ„Ρ€ΠΎΠ½Ρ‚Π΅:

Magento 2: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² прямо Π² Π±Π°Π·Ρƒ

РСзюмС

Π’ΠΎΡ‚ ΠΆΠ΅ самый Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² (10 ΡˆΡ‚ΡƒΠΊ), Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅, импортируСтся, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Π½Π° порядок быстрСС (1 сСкунда ΠΏΡ€ΠΎΡ‚ΠΈΠ² 10). Для Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΎΡ†Π΅Π½ΠΊΠΈ скорости Π½ΡƒΠΆΠ½ΠΎ большСС количСство ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² β€” нСсколько сотСн, Π° Π»ΡƒΡ‡ΡˆΠ΅ тысяч. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ нСбольшом Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ использованиС инструмСнтария, прСдоставляСмого Magento (ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ), Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ (Π°ΠΊΡ†Π΅Π½Ρ‚ΠΈΡ€ΡƒΡŽ β€” Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ!) ΡƒΡΠΊΠΎΡ€ΡΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π°, Π½ΠΎ ΠΏΡ€ΠΈ этом Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ (Π°ΠΊΡ†Π΅Π½Ρ‚ΠΈΡ€ΡƒΡŽ β€” Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ!) ΡΠ½ΠΈΠΆΠ°ΡŽΡ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ попадания Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±Π°Π·Ρƒ.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π²ΠΎΠ΄Π° оказалась ΠΌΠΎΠΊΡ€ΠΎΠΉ ΠΈ это Π½ΠΈΠΊΠ°ΠΊΠΎΠ΅ Π½Π΅ ΠΎΡ‚ΠΊΡ€ΠΎΠ²Π΅Π½ΠΈΠ΅. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ мСня Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ³Ρ€Π°Ρ‚ΡŒΡΡ дальшС ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ интСрСсныС Π²Ρ‹Π²ΠΎΠ΄Ρ‹.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com