Magento 2: ಉತ್ಪನ್ನಗಳನ್ನು ನೇರವಾಗಿ ಡೇಟಾಬೇಸ್‌ಗೆ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ

В ಹಿಂದಿನ ಲೇಖನ Magento 2 ಗೆ ಉತ್ಪನ್ನಗಳನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳುವ ಪ್ರಕ್ರಿಯೆಯನ್ನು ನಾನು ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ವಿವರಿಸಿದ್ದೇನೆ - ಮಾದರಿಗಳು ಮತ್ತು ರೆಪೊಸಿಟರಿಗಳ ಮೂಲಕ. ಸಾಮಾನ್ಯ ವಿಧಾನವು ಅತ್ಯಂತ ಕಡಿಮೆ ಡೇಟಾ ಸಂಸ್ಕರಣಾ ವೇಗವನ್ನು ಹೊಂದಿದೆ. ನನ್ನ ಲ್ಯಾಪ್‌ಟಾಪ್ ಪ್ರತಿ ಸೆಕೆಂಡಿಗೆ ಒಂದು ಉತ್ಪನ್ನವನ್ನು ಉತ್ಪಾದಿಸುತ್ತಿದೆ. ಈ ಮುಂದುವರಿಕೆಯಲ್ಲಿ, ಉತ್ಪನ್ನವನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳಲು ಪರ್ಯಾಯ ಮಾರ್ಗವನ್ನು ನಾನು ಪರಿಗಣಿಸುತ್ತೇನೆ - ಡೇಟಾಬೇಸ್‌ಗೆ ನೇರ ಪ್ರವೇಶದ ಮೂಲಕ, ಪ್ರಮಾಣಿತ Magento 2 ಕಾರ್ಯವಿಧಾನಗಳನ್ನು (ಮಾದರಿಗಳು, ಕಾರ್ಖಾನೆಗಳು, ರೆಪೊಸಿಟರಿಗಳು) ಬೈಪಾಸ್ ಮಾಡುವುದು. ಉತ್ಪನ್ನಗಳನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳುವ ಹಂತಗಳ ಅನುಕ್ರಮವನ್ನು MySQL ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಬಹುದಾದ ಯಾವುದೇ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಭಾಷೆಗೆ ಅಳವಡಿಸಿಕೊಳ್ಳಬಹುದು.

ಹಕ್ಕುತ್ಯಾಗ: 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"
}

ಆಮದು ಮುಖ್ಯ ಹಂತಗಳ ಅವಲೋಕನ

  • ಉತ್ಪನ್ನದ ನೋಂದಣಿ ಸ್ವತಃ
  • ಉತ್ಪನ್ನ ಮತ್ತು ವೆಬ್‌ಸೈಟ್ ನಡುವಿನ ಸಂಪರ್ಕ
  • ಮೂಲ ಉತ್ಪನ್ನ ಗುಣಲಕ್ಷಣಗಳು (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).

ಕ್ಯಾಟಲಾಗ್ ಇನ್ವೆಂಟರಿ_

ಮ್ಯಾಗ್ನೆಟೋ 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-url«

ಹೆಚ್ಚುವರಿ ಕ್ರಿಯೆಗಳನ್ನು ಮಾಡಿದ ನಂತರ ನಿರ್ವಾಹಕ ಫಲಕದಲ್ಲಿರುವ ಉತ್ಪನ್ನಗಳು:

Magento 2: ಉತ್ಪನ್ನಗಳನ್ನು ನೇರವಾಗಿ ಡೇಟಾಬೇಸ್‌ಗೆ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ

ಮತ್ತು ಮುಂಭಾಗದಲ್ಲಿ:

Magento 2: ಉತ್ಪನ್ನಗಳನ್ನು ನೇರವಾಗಿ ಡೇಟಾಬೇಸ್‌ಗೆ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ

ಸಾರಾಂಶ

ಹಿಂದಿನ ಲೇಖನದಲ್ಲಿದ್ದಂತೆಯೇ ಅದೇ ಉತ್ಪನ್ನಗಳ ಸೆಟ್ (10 ತುಣುಕುಗಳು) ಕನಿಷ್ಠ ಪ್ರಮಾಣದ ಕ್ರಮವನ್ನು ವೇಗವಾಗಿ ಆಮದು ಮಾಡಿಕೊಳ್ಳಲಾಗುತ್ತದೆ (1 ಸೆಕೆಂಡ್ ವಿರುದ್ಧ 10). ವೇಗವನ್ನು ಹೆಚ್ಚು ನಿಖರವಾಗಿ ಅಂದಾಜು ಮಾಡಲು, ನಿಮಗೆ ಹೆಚ್ಚಿನ ಸಂಖ್ಯೆಯ ಉತ್ಪನ್ನಗಳ ಅಗತ್ಯವಿದೆ - ಹಲವಾರು ನೂರು, ಅಥವಾ ಇನ್ನೂ ಸಾವಿರಾರು. ಆದಾಗ್ಯೂ, ಅಂತಹ ಸಣ್ಣ ಗಾತ್ರದ ಇನ್‌ಪುಟ್ ಡೇಟಾದೊಂದಿಗೆ, Magento (ಮಾದರಿಗಳು ಮತ್ತು ರೆಪೊಸಿಟರಿಗಳು) ಒದಗಿಸಿದ ಪರಿಕರಗಳ ಬಳಕೆಯು ಗಮನಾರ್ಹವಾಗಿದೆ ಎಂದು ನಾವು ತೀರ್ಮಾನಿಸಬಹುದು (ನಾನು ಒತ್ತಿಹೇಳುತ್ತೇನೆ - ಹೆಚ್ಚು!) ಅಗತ್ಯವಿರುವ ಕ್ರಿಯಾತ್ಮಕತೆಯ ಅಭಿವೃದ್ಧಿಯನ್ನು ವೇಗಗೊಳಿಸುತ್ತದೆ, ಆದರೆ ಅದೇ ಸಮಯದಲ್ಲಿ ಗಮನಾರ್ಹವಾಗಿ (ನಾನು ಒತ್ತಿಹೇಳುತ್ತೇನೆ - ಹೆಚ್ಚು!) ಡೇಟಾಬೇಸ್‌ಗೆ ಡೇಟಾ ಪಡೆಯುವ ವೇಗವನ್ನು ಕಡಿಮೆ ಮಾಡಿ.

ಪರಿಣಾಮವಾಗಿ, ನೀರು ತೇವವಾಗಿ ಹೊರಹೊಮ್ಮಿತು ಮತ್ತು ಇದು ಬಹಿರಂಗವಲ್ಲ. ಆದಾಗ್ಯೂ, ಈಗ ನಾನು ಆಡಲು ಕೋಡ್ ಅನ್ನು ಹೊಂದಿದ್ದೇನೆ ಮತ್ತು ಬಹುಶಃ ಇನ್ನೂ ಕೆಲವು ಆಸಕ್ತಿದಾಯಕ ತೀರ್ಮಾನಗಳಿಗೆ ಬರಬಹುದು.

ಮೂಲ: www.habr.com