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 కేటలాగ్‌కు మూలం మరియు అడ్మిన్ ప్యానెల్‌లో లేదా మొదటి పేజీలో అందుబాటులో ఉండదు. 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-urlలు«

అదనపు చర్యలను చేసిన తర్వాత అడ్మిన్ ప్యానెల్‌లోని ఉత్పత్తులు:

Magento 2: ఉత్పత్తులను నేరుగా డేటాబేస్‌లోకి దిగుమతి చేయండి

మరియు ముందు:

Magento 2: ఉత్పత్తులను నేరుగా డేటాబేస్‌లోకి దిగుమతి చేయండి

సారాంశం

మునుపటి కథనంలో ఉన్న అదే ఉత్పత్తుల సెట్ (10 ముక్కలు) కనీసం మాగ్నిట్యూడ్ క్రమాన్ని వేగంగా దిగుమతి చేస్తుంది (1 సెకను వర్సెస్ 10). వేగాన్ని మరింత ఖచ్చితంగా అంచనా వేయడానికి, మీకు పెద్ద సంఖ్యలో ఉత్పత్తులు అవసరం - అనేక వందల, లేదా ఇంకా వేల. అయినప్పటికీ, ఇంత చిన్న పరిమాణంలో ఇన్‌పుట్ డేటా ఉన్నప్పటికీ, Magento (నమూనాలు మరియు రిపోజిటరీలు) అందించిన సాధనాల ఉపయోగం ముఖ్యమైనదని మేము నిర్ధారించగలము (నేను నొక్కిచెబుతున్నాను - చాలా!) అవసరమైన కార్యాచరణ అభివృద్ధిని వేగవంతం చేస్తుంది, కానీ అదే సమయంలో గణనీయంగా (నేను నొక్కిచెప్పాను - చాలా!) డేటాబేస్‌లోకి డేటా వచ్చే వేగాన్ని తగ్గించండి.

ఫలితంగా, నీరు తడిగా మారింది మరియు ఇది ద్యోతకం కాదు. అయితే, ఇప్పుడు నేను ఆడటానికి కోడ్‌ని కలిగి ఉన్నాను మరియు బహుశా మరికొన్ని ఆసక్తికరమైన ముగింపులకు రావచ్చు.

మూలం: www.habr.com