Magento 2: ืึทืจื™ื™ึทื ืคื™ืจ ืคึผืจืึธื“ื•ืงื˜ืŸ ื’ืœื™ื™ึทืš ืื™ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก

ะ’ ืคึฟืจื™ึดืขืจื“ื™ืงืข ืึทืจื˜ื™ืงืœ ืื™ืš ื“ื™ืกืงืจื™ื™ื‘ื“ ื“ืขื ืคึผืจืึธืฆืขืก ืคื•ืŸ ื™ืžืคึผืึธืจื˜ื™ื ื’ ืคึผืจืึธื“ื•ืงื˜ืŸ ืื™ืŸ Magento 2 ืื•ื™ืฃ ื“ื™ ื’ืขื•ื•ื™ื™ื ื˜ืœืขืš ื•ื•ืขื’ - ื“ื•ืจืš ืžืึธื“ืขืœืก ืื•ืŸ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ื–. ื“ื™ ื’ืขื•ื•ื™ื™ื ื˜ืœืขืš ืื•ืคึฟืŸ ื”ืื˜ ืึท ื–ื™ื™ืขืจ ื ื™ื“ืขืจื™ืง ื“ืึทื˜ืŸ ืคึผืจืึทืกืขืกื™ื ื’ ื’ื™ื›ืงื™ื™ึทื˜. ืžื™ื™ึทืŸ ืœืึทืคึผื˜ืึทืคึผ ืื™ื– ื’ืขื•ื•ืขืŸ ืคึผืจืึทื“ื•ืกื™ื ื’ ื•ื•ืขื’ืŸ ืื™ื™ืŸ ืคึผืจืึธื“ื•ืงื˜ ืคึผืขืจ ืกืขืงื•ื ื“ืข. ืื™ืŸ ื“ืขื ืงืึทื ื˜ื™ื ื™ื•ื™ื™ืฉืึทืŸ, ืื™ืš ื‘ืึทื˜ืจืึทื›ื˜ืŸ ืึทืŸ ืึธืœื˜ืขืจื ืึทื˜ื™ื•ื• ื•ื•ืขื’ ืฆื• ืึทืจื™ื™ึทื ืคื™ืจ ืึท ืคึผืจืึธื“ื•ืงื˜ - ื“ื•ืจืš ื“ื™ืจืขืงื˜ ืคึผืึธื–ื™ืฆื™ืข ืื™ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก, ื‘ื™ื™ืคึผืึทืกื™ื ื’ ื“ื™ ื ืึธืจืžืึทืœ ืžืึทื’ืขื ื˜ืึธ 2 ืžืขืงืึทื ื™ื–ืึทืžื– (ืžืึธื“ืขืœืก, ืคืื‘ืจื™ืงืŸ, ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ื–). ื“ื™ ืกื™ืงื•ื•ืึทื ืก ืคื•ืŸ ืกื˜ืขืคึผืก ืฆื• ืึทืจื™ื™ึทื ืคื™ืจ ืคึผืจืึธื“ื•ืงื˜ืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืฆื•ื’ืขืคืืกื˜ ืฆื• ืงื™ื™ืŸ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืฉืคึผืจืึทืš ื•ื•ืึธืก ืงืขื ืขืŸ ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ MySQL.

ืึธืคึผืœื™ื™ืงืขื ื•ื ื’: Magento ื”ืื˜ ืคืึทืจื˜ื™ืง ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ืคึฟืึทืจ ื“ืึทื˜ืŸ ืึทืจื™ื™ึทื ืคื™ืจ ืื•ืŸ, ืจื•ื‘ึฟ ืžืกืชึผืžื, ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื ื•ื’ ืคึฟืึทืจ ืื™ืจ. ืึธื‘ืขืจ, ืื•ื™ื‘ ืื™ืจ ื“ืึทืจืคึฟืŸ ืžืขืจ ืคื•ืœืฉื˜ืขื ื“ื™ืง ืงืึธื ื˜ืจืึธืœ ืื™ื‘ืขืจ ื“ืขื ืึทืจื™ื™ึทื ืคื™ืจ ืคึผืจืึธืฆืขืก, ื ื™ื˜ ืœื™ืžื™ื˜ืขื“ ืฆื• ืคึผืจื™ืคึผืขืจื™ื ื’ ืึท ืงืกื•ื• ื˜ืขืงืข ืคึฟืึทืจ ื•ื•ืึธืก ืื™ืจ ื”ืึธื˜, ื‘ืจื•ื›ื™ื ื”ื‘ืื™ื ืฆื• ืงืึทืฅ.

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 ื–ื™ืš:

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: ืึทืจื™ื™ึทื ืคื™ืจ ืคึผืจืึธื“ื•ืงื˜ืŸ ื’ืœื™ื™ึทืš ืื™ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก

ื™ื ื•ื•ืึทื ื˜ืึธืจื™ ื“ืึทื˜ืŸ

ืกื˜ืึทืจื˜ื™ื ื’ ืคื•ืŸ ื•ื•ืขืจืกื™ืข 2.3 ืื™ืŸ Magento, ืขืก ื–ืขื ืขืŸ ืฆื•ื•ื™ื™ ืคึผืึทืจืึทืœืขืœ ืฉื˜ืขืœื˜ ืคื•ืŸ ื˜ื™ืฉืŸ ื•ื•ืึธืก ืฆื•ืฉื˜ืขืœืŸ ืกื˜ืึธืจื™ื“ื–ืฉ ืคื•ืŸ ื™ื ื•ื•ืึทื ื˜ืึธืจื™ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข (ืคึผืจืึธื“ื•ืงื˜ ืงื•ื•ืึทื ื˜ื™ื˜ื™):

  • cataloginventory_*: ืึทืœื˜ ืกื˜ืจื•ืงื˜ื•ืจ;
  • inventory_*: ื ื™ื™ึท ืกื˜ืจื•ืงื˜ื•ืจ (ืžืกื™ - ืžื•ืœื˜ื™ ืžืงื•ืจ ื™ื ื•ื•ืขื ื˜ืึธืจื™);

ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืœื™ื™ื’ืŸ ื™ื ื•ื•ืึทื ื˜ืึธืจื™ ื“ืึทื˜ืŸ ืฆื• ื‘ื™ื™ื“ืข ืกื˜ืจืึทืงื˜ืฉืขืจื–, ื•ื•ื™ื™ึทืœ ื“ื™ ื ื™ื™ึทืข ืกื˜ืจื•ืงื˜ื•ืจ ืื™ื– ื ืึธืš ื ื™ืฉื˜ ื’ืึธืจ ืคืจื™ื™ึท ืคื•ืŸ ื“ื™ ืึทืœื˜ (ืขืก ืื™ื– ื–ื™ื™ืขืจ ืžืกืชึผืžื ืึทื– ืคึฟืึทืจ default ื•ื•ืขืจื›ืึทื•ืก ืื™ืŸ ื“ื™ ื ื™ื™ึท ืกื˜ืจื•ืงื˜ื•ืจ ืึท ื˜ื™ืฉ ืื™ื– ื™ื ื•ื•ืึทืœื•ื•ื“ cataloginventory_stock_status ื•ื•ื™ inventory_stock_1).

ืงืึทื˜ืึทืœืึธื’-ืื™ื ื•ื•ืขื ื˜ืึธืจื™_

ื•ื•ืขืŸ ื“ื™ืคึผืœื•ื™ื™ื ื’ 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) ืื•ืŸ ืขืก ืื™ื– ืœื™ื ื’ืงื˜ ืฆื• ื“ื™ ืึทื“ืžื™ื ื™ืกื˜ืจืึทื˜ื™ื•ื•ืข ื•ื•ืขื‘ื–ื™ื™ื˜ืœ. ืึทื“ื™ื ื’ ื ื™ื™ึท ืึธื ืขืก ื“ื•ืจืš ื“ื™ ืึทื“ืžื™ืŸ ื˜ืึทืคืœื™ืข 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).

ืื™ื™ืŸ"ื•ื•ืึทืจืขื”ืึธื•ืกืข"ืงืขื ืขืŸ ื–ื™ื™ืŸ ืœื™ื ื’ืงื˜ ืฆื• ืขื˜ืœืขื›ืข"ืงื•ื•ืืœืŸ"ืื•ืŸ ืื™ื™ื ืขืจ"ืžืึธืงืขืจ"- ืฆื• ืขื˜ืœืขื›ืข"ื•ื•ืขืจื›ืึทื•ื–ื™ื–"(ืคื™ืœืข-ืฆื•-ืคื™ืœืข ืฉื™ื™ื›ื•ืช). ื“ื™ ืื•ื™ืกื ืขืžืขืŸ ื–ืขื ืขืŸ ืคืขืœื™ืงื™ื™ึทื˜ "ืžืึธืงืขืจ"ืื•ืŸ"ื•ื•ืึทืจืขื”ืึธื•ืกืข". ื–ื™ื™ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืฉื™ื™ึทืขืš-ืœื™ื ื’ืงื˜ ืฆื• ืื ื“ืขืจืข ืขื ื˜ื™ื˜ื™ื– (ื‘ืื’ืจืขื ืขืฆืŸ ืื™ืŸ ื“ื™ ืงืึธื“ ืžื“ืจื’ื” - ื“ืขืจ ื˜ืขื•ืช "ืงืขื ืขืŸ ื ื™ื˜ ืจืึทื˜ืขื•ื•ืขืŸ ื“ื™ ืœื™ื ืง ืฉื™ื™ึทื›ื•ืช ืฆื• ื“ื™ืคืึธืœื˜ ืžืงื•ืจ ืึธื“ืขืจ ื“ื™ืคืึธืœื˜ ืœืึทื’ืขืจ"). ืžืขืจ ื“ืขื˜ืึทื™ืœืก ื•ื•ืขื’ืŸ ื“ื™ MSI ืกื˜ืจื•ืงื˜ื•ืจ ืื™ืŸ Magento 2 ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ "ื•ื•ืึทืจืขื”ืึธื•ืกืข ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’ ืกื™ืกื˜ืขื ื ื™ืฆืŸ 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 ืงืึทื˜ืึทืœืึธื’ ืื•ืŸ ืื™ื– ื ื™ื˜ ื‘ื ื™ืžืฆื ืื™ืŸ ื“ื™ ืึทื“ืžื™ืŸ ื˜ืึทืคืœื™ืข ืึธื“ืขืจ ืื•ื™ืฃ ื“ื™ ืคืจืึธื ื˜ ื‘ืœืึทื˜. ืงืึทื˜ืขื’ืึธืจื™ืข ืžื™ื˜ ID = 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