Magento 2: рдереЗрдЯ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдЙрддреНрдкрд╛рджрдиреЗ рдЖрдпрд╛рдд рдХрд░рд╛

╨Т рдорд╛рдЧреАрд▓ рд▓реЗрдЦ рдореА рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ Magento 2 рдордзреНрдпреЗ рдЙрддреНрдкрд╛рджрдиреЗ рдЖрдпрд╛рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ - рдореЙрдбреЗрд▓ рдЖрдгрд┐ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЬрджреНрд╡рд╛рд░реЗ. рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдкрджреНрдзрддреАрдордзреНрдпреЗ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧрдЪрд╛ рд╡реЗрдЧ рдЦреВрдкрдЪ рдХрдореА рдЕрд╕рддреЛ. рдорд╛рдЭрд╛ рд▓реЕрдкрдЯреЙрдк рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж рд╕реБрдорд╛рд░реЗ рдПрдХ рдЙрддреНрдкрд╛рджрди рддрдпрд╛рд░ рдХрд░рдд рд╣реЛрддрд╛. рдпрд╛ рдирд┐рд░рдВрддрд░рддреЗрдордзреНрдпреЗ, рдореА рдЙрддреНрдкрд╛рджрди рдЖрдпрд╛рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкрд░реНрдпрд╛рдпреА рдорд╛рд░реНрдЧ рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрддреЛ - рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдереЗрдЯ рдкреНрд░рд╡реЗрд╢ рдХрд░реВрди, рдорд╛рдирдХ Magento 2 рдпрдВрддреНрд░рдгрд╛ (рдореЙрдбреЗрд▓, рдХрд╛рд░рдЦрд╛рдиреЗ, рднрд╛рдВрдбрд╛рд░) рдмрд╛рдпрдкрд╛рд╕ рдХрд░реВрди. рдЙрддреНрдкрд╛рджрдиреЗ рдЖрдпрд╛рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЪрд░рдгрд╛рдВрдЪрд╛ рдХреНрд░рдо MySQL рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрдгрд╛рд▒реНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖реЗрдд рд╕реНрд╡реАрдХрд╛рд░рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ.

рдЬрдмрд╛рдмрджрд╛рд░реА рдирд╛рдХрд╛рд░рдгреЗ: Magento рд╕рд╛рдареА рддрдпрд╛рд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЖрд╣реЗ рдбреЗрдЯрд╛ рдЖрдпрд╛рдд рдЖрдгрд┐, рдмрд╣реБрдзрд╛, рддреЗ рдЖрдкрд▓реНрдпрд╛рд╕рд╛рдареА рдкреБрд░реЗрд╕реЗ рдЕрд╕реЗрд▓. рддрдерд╛рдкрд┐, рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЬреЗ рдХрд╛рд╣реА рдЖрд╣реЗ рддреНрдпрд╛рд╕рд╛рдареА CSV рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдкреБрд░рддреЗ рдорд░реНрдпрд╛рджрд┐рдд рди рд░рд╛рд╣рддрд╛, рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдпрд╛рдд рдкреНрд░рдХреНрд░рд┐рдпреЗрд╡рд░ рдЕрдзрд┐рдХ рд╕рдВрдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рд╣рд╡реЗ рдЕрд╕рд▓реНрдпрд╛рд╕, cat рдордзреНрдпреЗ рддреБрдордЪреЗ рд╕реНрд╡рд╛рдЧрдд рдЖрд╣реЗ.

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

рдЖрдпрд╛рддреАрдЪреНрдпрд╛ рдореБрдЦреНрдп рдЯрдкреНрдкреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди

  • рдЙрддреНрдкрд╛рджрдирд╛рдЪреАрдЪ рдиреЛрдВрджрдгреА
  • рдЙрддреНрдкрд╛рджрди рдЖрдгрд┐ рд╡реЗрдмрд╕рд╛рдЗрдЯ рджрд░рдореНрдпрд╛рди рдХрдиреЗрдХреНрд╢рди
  • рдореВрд│ рдЙрддреНрдкрд╛рджрди рдЧреБрдгрдзрд░реНрдо (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 - рдЬрд░ рдЖрдореНрд╣реА рддреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдирд╛рд╣реА, рддрд░ 'рд╕рд┐рдВрдкрд▓' рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдИрд▓

рдбреЗрдЯрд╛рдмреЗрд╕рд╡рд░ рдереЗрдЯ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА, рдореА Magento рдЪреЗ DB рдЕрдбреЕрдкреНрдЯрд░ рд╡рд╛рдкрд░рддреЛ:

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 рддреЗ ре▓рдбрдорд┐рди рдкреЕрдиреЗрд▓рдордзреНрдпреЗ, рдЙрддреНрдкрд╛рджрди рдЧреНрд░рд┐рдбрдордзреНрдпреЗ рджреГрд╢реНрдпрдорд╛рди рд╣реЛрддреЗ (рдХреЕрдЯрд▓реЙрдЧ/рдЙрддреНрдкрд╛рджрдиреЗ).

Magento 2: рдереЗрдЯ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдЙрддреНрдкрд╛рджрдиреЗ рдЖрдпрд╛рдд рдХрд░рд╛

рдЙрддреНрдкрд╛рджрди рдЖрдгрд┐ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдпрд╛рдВрдЪреНрдпрд╛рддреАрд▓ рд╕рдВрдмрдВрдз

рд╕рд╛рдЗрдЯрд╕рд╣ рдЙрддреНрдкрд╛рджрдирд╛рдЪреА рдЬреЛрдбрдгреА рд╣реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рдХреА рдЙрддреНрдкрд╛рджрди рдХреЛрдгрддреНрдпрд╛ рд╕реНрдЯреЛрдЕрд░рдордзреНрдпреЗ рдЖрдгрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рддреЗ рд╕рдореЛрд░ рдЙрдкрд▓рдмреНрдз рдЕрд╕реЗрд▓.

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

рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛрдб рд╡рд╛рдкрд░реВрди, рдЖрдореНрд╣реА рддреНрдпрд╛рдЪрд╛ рдЖрдпрдбреА рдЖрдгрд┐ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЛ (datetime, decimal, int, text, varchar), рдирдВрддрд░ рдкреНрд░рд╢рд╛рд╕рдХреАрдп рд╡рд┐рдВрдбреЛрд╕рд╛рдареА рдбреЗрдЯрд╛ рдпреЛрдЧреНрдп рдЯреЗрдмрд▓рдордзреНрдпреЗ рд▓рд┐рд╣рд╛ (store_id = 0).

рдЙрддреНрдкрд╛рджрдирд╛рдордзреНрдпреЗ рд╡рд░реАрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд▓реНрдпрд╛рдирдВрддрд░, рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдЪрд┐рддреНрд░ рдкреНрд░рд╢рд╛рд╕рди рдкреЕрдиреЗрд▓рдордзреНрдпреЗ рдорд┐рд│реЗрд▓:

Magento 2: рдереЗрдЯ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдЙрддреНрдкрд╛рджрдиреЗ рдЖрдпрд╛рдд рдХрд░рд╛

рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдбреЗрдЯрд╛

Magento рдордзреАрд▓ рдЖрд╡реГрддреНрддреА 2.3 рдкрд╛рд╕реВрди рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрди, рд╕рд╛рд░рдгреАрдЪреЗ рджреЛрди рд╕рдорд╛рдВрддрд░ рд╕рдВрдЪ рдЖрд╣реЗрдд рдЬреЗ рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдорд╛рд╣рд┐рддреА (рдЙрддреНрдкрд╛рджрди рдкреНрд░рдорд╛рдг) рд╕рдВрдЪрдпрд┐рдд рдХрд░рддрд╛рдд:

  • cataloginventory_*: рдЬреБрдиреА рд░рдЪрдирд╛;
  • inventory_*: рдирд╡реАрди рд░рдЪрдирд╛ (MSI - рдорд▓реНрдЯреА рд╕реЛрд░реНрд╕ рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА);

рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рджреЛрдиреНрд╣реА рд╕рдВрд░рдЪрдирд╛рдВрдордзреНрдпреЗ рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдбреЗрдЯрд╛ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ, рдХрд╛рд░рдг рдирд╡реАрди рд░рдЪрдирд╛ рдЕрджреНрдпрд╛рдк рдЬреБрдиреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдкреВрд░реНрдгрдкрдгреЗ рд╕реНрд╡рддрдВрддреНрд░ рдирд╛рд╣реА (рддреНрдпрд╛рд╕рд╛рдареА рдмрд╣реБрдзрд╛ default рдирд╡реАрди рд╕рдВрд░рдЪрдиреЗрдд рд╡реЗрдЕрд░рд╣рд╛рдКрд╕рдордзреНрдпреЗ рдПрдХ рдЯреЗрдмрд▓ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ cataloginventory_stock_status рдореНрд╣рдгреВрди inventory_stock_1).

cataloginventory_

рдореЕрдЧреНрдиреЗрдЯреЛ 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) рдЖрдгрд┐ рддреЗ рдкреНрд░рд╢рд╛рд╕рдХреАрдп рд╡реЗрдмрд╕рд╛рдЗрдЯрд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ рдЖрд╣реЗ. ре▓рдбрдорд┐рди рдкреЕрдирд▓рджреНрд╡рд╛рд░реЗ рдирд╡реАрди рдЬреЛрдбрдд рдЖрд╣реЗ 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);
}

рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА_

рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдбреЗрдЯрд╛ рд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рдВрд░рдЪрдиреЗрдд 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|

рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░рдиреБрд╕рд╛рд░, рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░рдЪреЗ рд╡рд┐рдХреНрд░реА рдЪреЕрдиреЗрд▓ рдЧреГрд╣рд┐рдд рдзрд░рд▓реЗ рдЬрд╛рддрд╛рдд, рдкрд░рдВрддреБ рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рдлрдХреНрдд рдХрдиреЗрдХреНрд╢рди "рд╢реЗрдЕрд░-рд╡реЗрдмрд╕рд╛рдЗрдЯ"(рд╡реЗрдмрд╕рд╛рдЗрдЯрдЪреА рд▓рд┐рдВрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЛрдбрдЪреЗ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ - base).

рдПрдХ "рдХреЛрдард╛рд░"рдЕрдиреЗрдХрд╛рдВрд╢реА рдЬреЛрдбрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ"рд╕реНрддреНрд░реЛрдд"рдЖрдгрд┐ рдПрдХ "рд╕реНрддреНрд░реЛрдд"- рдЕрдиреЗрдХ"рдЧреЛрджрд╛рдореЗ"(рдЕрдиреЗрдХ-рддреЗ-рдЕрдиреЗрдХ рд╕рдВрдмрдВрдз). рдЕрдкрд╡рд╛рдж рдбреАрдлреЙрд▓реНрдЯ рдЖрд╣реЗрдд "рд╕реНрддреНрд░реЛрдд"рдЖрдгрд┐"рдХреЛрдард╛рд░" рддреЗ рдЗрддрд░ рдШрдЯрдХрд╛рдВрд╢реА рдкреБрдиреНрд╣рд╛ рдЬреЛрдбрд▓реЗрд▓реЗ рдирд╛рд╣реАрдд (рдХреЛрдб рд╕реНрддрд░рд╛рд╡рд░реАрд▓ рдорд░реНрдпрд╛рджрд╛ - рддреНрд░реБрдЯреА тАЬрдбреАрдлреЙрд▓реНрдЯ рд╕реНрддреНрд░реЛрдд рдХрд┐рдВрд╡рд╛ рдбреАрдлреЙрд▓реНрдЯ рд╕реНрдЯреЙрдХрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ рд╕реЗрд╡реНрд╣ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА"). Magento 2 рдордзреАрд▓ MSI рд╕рдВрд░рдЪрдиреЗрдмрджреНрджрд▓ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓ рд▓реЗрдЦрд╛рдд рдЖрдврд│реВ рд╢рдХрддрд╛рдд.CQRS рдЖрдгрд┐ рдЗрд╡реНрд╣реЗрдВрдЯ рд╕реЛрд░реНрд╕рд┐рдВрдЧ рд╡рд╛рдкрд░реВрди рд╡реЗрдЕрд░рд╣рд╛рдКрд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдкреНрд░рдгрд╛рд▓реА. рд░рдЪрдирд╛".

рдореА рдбреАрдлреЙрд▓реНрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд╛рдкрд░реЗрди рдЖрдгрд┐ рд╕рд░реНрд╡ рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдорд╛рд╣рд┐рддреА рд╕реНрддреНрд░реЛрддрд╛рдордзреНрдпреЗ рдЬреЛрдбреЗрди default, рдЬреЗ рдХреЛрдбрд╕рд╣ рд╡реЗрдмрд╕рд╛рдЗрдЯрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдХреНрд░реА рдЪреЕрдиреЗрд▓рдордзреНрдпреЗ рд╕рд╛рдореАрд▓ рдЖрд╣реЗ 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: рдХреЗрд╡рд│ рдЙрддреНрдкрд╛рджрдирд╛рдВрд╢реА рдореАрдбрд┐рдпрд╛ рд▓рд┐рдВрдХ рдХрд░рдгреЗ (рдЙрддреНрдкрд╛рджрдирд╛рд╕рд╛рдареА рдмрд╣реБрдзрд╛ рдбреАрдлреЙрд▓реНрдЯ рдореАрдбрд┐рдпрд╛ рд╕рд╛рдордЧреНрд░реА);
  • 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;
}

рдиреЛрдВрджрдгреАрдХреГрдд рдЭрд╛рд▓реНрдпрд╛рд╡рд░, рдирд╡реАрди рдореАрдбрд┐рдпрд╛ рдлрд╛рдЗрд▓рд▓рд╛ рдЕрднрд┐рдЬреНрдЮрд╛рдкрдХ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.

рдЖрдореНрд╣реА рдбреАрдлреЙрд▓реНрдЯ рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯрд╕рд╛рдареА рд╕рдВрдмрдВрдзрд┐рдд рдЙрддреНрдкрд╛рджрдирд╛рд╕рд╣ рдиреЛрдВрджрдгреАрдХреГрдд рдореАрдбрд┐рдпрд╛ рдлрд╛рдЗрд▓ рд╕рдВрдмрджреНрдз рдХрд░рддреЛ:

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

рдореАрдбрд┐рдпрд╛ рдлрд╛рдЗрд▓ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рднреВрдорд┐рдХрд╛рдВрд╕рд╣ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ (рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛрдб рдХрдВрд╕рд╛рдд рджрд░реНрд╢рд╡рд┐рд▓рд╛ рдЖрд╣реЗ):

  • рдкрд╛рдпрд╛(image)
  • рд▓рд╣рд╛рди рдкреНрд░рддрд┐рдорд╛ (small_image)
  • рд▓рдШреБрдкреНрд░рддрд┐рдорд╛ (thumbnail)
  • рд╕реНрд╡реЕрдЪ рдкреНрд░рддрд┐рдорд╛ (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 рдХреЕрдЯрд▓реЙрдЧрдЪреЗ рдореВрд│ рдЖрд╣реЗ рдЖрдгрд┐ рдкреНрд░рд╢рд╛рд╕рдХ рдкреЕрдиреЗрд▓рдордзреНрдпреЗ рдХрд┐рдВрд╡рд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдкреГрд╖реНрдард╛рд╡рд░ рдЙрдкрд▓рдмреНрдз рдирд╛рд╣реА. рдЖрдпрдбреА = 2 (рд╕рд╣ рд╢реНрд░реЗрдгреАрдбреАрдлреЙрд▓реНрдЯ рд╢реНрд░реЗрдгреА) рд╣реА рдореБрдЦреНрдп рд╕рд╛рдЗрдЯрдЪреНрдпрд╛ рдореБрдЦреНрдп рд╕реНрдЯреЛрдЕрд░рд╕рд╛рдареА рдореВрд│ рд╢реНрд░реЗрдгреА рдЖрд╣реЗ (рдореБрдЦреНрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реНрдЯреЛрдЕрд░) рдЬреЗрд╡реНрд╣рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддреИрдирд╛рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рддреЗрд╡реНрд╣рд╛ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ (рдкрд╣рд╛. рдкреНрд░рд╢рд╛рд╕рди / рд╕реНрдЯреЛрдЕрд░реНрд╕ / рд╕рд░реНрд╡ рд╕реНрдЯреЛрдЕрд░реНрд╕). рд╢рд┐рд╡рд╛рдп, рд╕реНрдЯреЛрдЕрд░рдЪреА рдореВрд│ рд╢реНрд░реЗрдгреА рджреЗрдЦреАрд▓ рд╕рдореЛрд░ рдЙрдкрд▓рдмреНрдз рдирд╛рд╣реА, рдлрдХреНрдд рддреНрдпрд╛рдЪреНрдпрд╛ рдЙрдкрд╢реНрд░реЗрдгреА рдЖрд╣реЗрдд.

рдпрд╛ рд▓реЗрдЦрд╛рдЪрд╛ рд╡рд┐рд╖рдп рдЕрджреНрдпрд╛рдк рдЙрддреНрдкрд╛рджрдирд╛рдВрд╡рд░реАрд▓ рдбреЗрдЯрд╛ рдЖрдпрд╛рдд рдХрд░рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдореА рд╢реНрд░реЗрдгреНрдпрд╛ рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдереЗрдЯ рдкреНрд░рд╡реЗрд╢ рд╡рд╛рдкрд░рдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ Magento рджреНрд╡рд╛рд░реЗ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗрд▓реЗ рд╡рд░реНрдЧ рд╡рд╛рдкрд░реЗрди (рдореЙрдбреЗрд▓ рдЖрдгрд┐ рднрд╛рдВрдбрд╛рд░). рдбреЗрдЯрд╛рдмреЗрд╕рдордзреАрд▓ рдереЗрдЯ рдПрдВрдЯреНрд░реАрдЪрд╛ рд╡рд╛рдкрд░ рдХреЗрд╡рд│ рдЖрдпрд╛рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЙрддреНрдкрд╛рджрдирд╛рд╕ рд╢реНрд░реЗрдгреАрд╢реА рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА рдХреЗрд▓рд╛ рдЬрд╛рддреЛ (рд╢реНрд░реЗрдгреА рддреНрдпрд╛рдЪреНрдпрд╛ рдирд╛рд╡рд╛рдиреЗ рдЬреБрд│рд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рдЬреБрд│рдгреА рджрд░рдореНрдпрд╛рди рд╢реНрд░реЗрдгреА рдЖрдпрдбреА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реА рдЬрд╛рддреЗ):

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 (рдореЙрдбреЗрд▓ рдЖрдгрд┐ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЬ) рджреНрд╡рд╛рд░реЗ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рд╛рдзрдирд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЖрд╣реЗ (рдореА рдпрд╛рд╡рд░ рдЬреЛрд░ рджреЗрддреЛ - рдЬрд╛рд╕реНрдд!) рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕рд╛рд╕ рдЧрддреА рджреНрдпрд╛, рдкрд░рдВрддреБ рддреНрдпрд╛рдЪ рд╡реЗрд│реА рд▓рдХреНрд╖рдгреАрдп (рдореА рдЬреЛрд░ рджреЗрддреЛ - рдЬрд╛рд╕реНрдд!) рдбрд╛рдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдпреЗрдгрд╛рд░рд╛ рд╡реЗрдЧ рдХрдореА рдХрд░рд╛.

рдкрд░рд┐рдгрд╛рдореА, рдкрд╛рдгреА рдУрд▓реЗ рдирд┐рдШрд╛рд▓реЗ рдЖрдгрд┐ рд╣реЗ рдкреНрд░рдХрдЯреАрдХрд░рдг рдирд╛рд╣реА. рддрдерд╛рдкрд┐, рдЖрддрд╛ рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдЦреЗрд│рдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрдб рдЖрд╣реЗ рдЖрдгрд┐ рдХрджрд╛рдЪрд┐рдд рдЖрдгрдЦреА рдХрд╛рд╣реА рдордиреЛрд░рдВрдЬрдХ рдирд┐рд╖реНрдХрд░реНрд╖рд╛рдВрд╡рд░ рдпрд╛.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛