میګینټو 2: محصولات مستقیم ډیټابیس ته وارد کړئ

В پخوانۍ مقاله ما په معمول ډول میګینټو 2 کې د محصولاتو واردولو پروسه تشریح کړه - د ماډلونو او ذخیره کولو له لارې. معمول میتود د ډیټا پروسس کولو خورا ټیټ سرعت لري. زما لپ ټاپ په هره ثانیه کې شاوخوا یو محصول تولیدوي. پدې دوام کې ، زه د محصول واردولو لپاره بدیل لاره په پام کې نیسم - ډیټابیس ته د مستقیم ننوتلو له لارې ، د معیاري میګینټو 2 میکانیزمونو (موډلونو ، فابریکو ، ذخیره کولو) په واسطه. د محصولاتو واردولو لپاره د ګامونو ترتیب د هرې برنامې ژبې سره تطابق کیدی شي چې کولی شي د MySQL سره کار وکړي.

دادعا: میګینټو لپاره چمتو شوي فعالیت لري د معلوماتو واردول او، ډیری احتمال، دا به ستاسو لپاره کافي وي. په هرصورت، که تاسو د وارداتو پروسې بشپړ کنټرول ته اړتیا لرئ، د هغه څه لپاره چې تاسو یې لرئ د CSV فایل چمتو کولو پورې محدود نه وي، بلی ته ښه راغلاست.

میګینټو 2: محصولات مستقیم ډیټابیس ته وارد کړئ

کوډ چې د دواړو مقالو لیکلو پایله ده د میګینټو ماډل کې لیدل کیدی شي "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 - که موږ دا مشخص نه کړو، نو 'ساده' به وکارول شي

ډیټابیس ته مستقیم لیکلو لپاره ، زه پخپله د میګینټو 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 دا په اډمین پینل کې ښکاره کیږي، د محصول په شبکه کې (کتلاګ/محصولات).

میګینټو 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);
}

میګینټو 2: محصولات مستقیم ډیټابیس ته وارد کړئ

د محصول بنسټیز ځانګړتیاوې

نوی راجستر شوی محصول لاهم نوم یا توضیحات نلري. دا ټول له لارې ترسره کیږي د EAV ځانګړتیاوې. دلته د لومړني محصول ځانګړتیاو لیست دی چې د دې لپاره اړین دي چې محصول په سمه توګه په مخ کې ښکاره شي:

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

یو جلا خاصیت د دې په څیر محصول ته اضافه کیږي (د دې کوډ څخه د پیژندونکي او ځانګړتیاو ډول ترلاسه کولو توضیحات پریښودل شوي):

public function create($prodId, $attrCode, $attrValue)
{
    $attrId = /* get attribute ID by attribute code */
    $attrType = /* get attribute type [datetime|decimal|int|text|varchar]) by attribute code */
    if ($attrId) {
        /** @var MagentoFrameworkAppResourceConnection $this->resource */
        /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
        $conn = $this->resource->getConnection();
        $tblName = 'catalog_product_entity_' . $attrType;
        $table = $this->resource->getTableName($tblName);
        $bind = [
            'attribute_id' => $attrId,
            'entity_id' => $prodId,
            /* put all attributes to default store view with id=0 (admin) */
            'store_id' => 0,
            'value' => $attrValue
        ];
        $conn->insert($table, $bind);
    }
}

د خاصیت کوډ په کارولو سره، موږ د دې ID او ډیټا ډول وټاکو (datetime, decimal, int, text, varchar)، بیا د اداري کړکۍ لپاره ډاټا په مناسب جدول کې ولیکئ (store_id = 0).

محصول ته د پورته ځانګړتیاو اضافه کولو وروسته ، تاسو دا عکس په اډمین پینل کې ترلاسه کوئ:

میګینټو 2: محصولات مستقیم ډیټابیس ته وارد کړئ

د انوینٹری ډاټا

په میګینټو کې د 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).

یو "ګودام"د څو سره تړل کیدی شي"سرچینې"او یو "سرچینه"- څو ته"ګودامونه"(له ډیرو څخه ډیری اړیکې). استثناوې ډیفالټ دي "سرچینه"او"ګودام". دوی د نورو ادارو سره بیا تړلي ندي (د کوډ په کچه محدودیت - تېروتنه "د ډیفالټ سرچینې یا ډیفالټ سټاک پورې اړوند لینک نشي خوندي کولی"). په میګینټو 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);
}

په اډمین پینل کې محصول ته د موجوداتو ډیټا اضافه کولو وروسته ، تاسو دا عکس ترلاسه کوئ:

میګینټو 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. د پابند کوډ د کوډ سره ورته دی "د محصول بنسټیز ځانګړتیاوې".

په اډمین پینل کې محصول ته د عکس اضافه کولو وروسته دا داسې ښکاري:

میګینټو 2: محصولات مستقیم ډیټابیس ته وارد کړئ

کټګوري

اصلي جدولونه چې د کټګورۍ له مخې ډاټا لري:

  • catalog_category_entity: د کټګوریو راجستر
  • catalog_category_productد محصولاتو او کټګوریو ترمنځ اړیکه؛
  • catalog_category_entity_*: د EAV خاصیت ارزښتونه

په پیل کې، په خالي میګینټو غوښتنلیک کې، د کټګورۍ راجستر 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 سره کټګورۍ د میګینټو ټول کتلاګ ریښه ده او نه په اډمین پینل یا په لومړي مخ کې شتون لري. کټګوري د ID = 2 سره (ډیفالټ کټګوري) د اصلي سایټ اصلي پلورنځي لپاره د ریښې کټګورۍ ده (د اصلي ویب پاڼې پلورنځي) رامینځته کیږي کله چې غوښتنلیک ځای په ځای شي (وګورئ. اډمین / پلورنځي / ټول پلورنځي). سربیره پردې ، پخپله د پلورنځي ریښې کټګورۍ هم په مخ کې شتون نلري ، یوازې د هغې فرعي کټګورۍ.

څنګه چې د دې مقالې موضوع لاهم د محصولاتو ډیټا واردول دي ، زه به د کټګوریو رامینځته کولو پرمهال ډیټابیس ته مستقیم ننوتل و نه کاروم ، مګر پخپله د میګینټو لخوا چمتو شوي ټولګي به وکاروم (موډلونه او ذخیره). ډیټابیس ته مستقیم ننوتل یوازې د کټګورۍ سره د وارد شوي محصول د شریکولو لپاره کارول کیږي (کټګورۍ د هغې نوم سره سمون لري، او د کټګورۍ ID د میچ کولو پرمهال ترلاسه کیږي):

function create($prodId, $catId)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_category_product');
    $bind = [
        'category_id' => $catId,
        'product_id' => $prodId,
    ];
    $conn->insert($table, $bind);
}

د "کټګورۍ 1" او "کټګورۍ 2" کټګوریو ته د محصول لینک اضافه کولو وروسته ، په اډمین پینل کې د محصول توضیحات داسې ښکاري:

میګینټو 2: محصولات مستقیم ډیټابیس ته وارد کړئ

اضافي کړنې

یوځل چې د معلوماتو واردات بشپړ شي ، تاسو اړتیا لرئ لاندې اضافي مرحلې بشپړ کړئ:

  • د معلوماتو لیست کول: په کنسول کې زنګ ووهئ ./bin/magento indexer:reindex;
  • د محصولاتو / کټګوریو لپاره د URLs بیا رامینځته کول: تاسو کولی شئ توسیع وکاروئ "elgentos/regenerate-catalog-urls«

د اضافي کړنو ترسره کولو وروسته په اډمین پینل کې محصولات:

میګینټو 2: محصولات مستقیم ډیټابیس ته وارد کړئ

او په مخ کې:

میګینټو 2: محصولات مستقیم ډیټابیس ته وارد کړئ

لنډیز

د محصولاتو ورته سیټ (10 ټوټې) لکه څنګه چې په تیر مقاله کې وارد شوي لږترلږه د شدت په ترتیب سره ګړندي (1 ثانیه د 10 په مقابل کې). د سرعت دقیق اندازې کولو لپاره، تاسو د محصولاتو لوی شمیر ته اړتیا لرئ - څو سوه، یا تر اوسه په زرګونو. په هرصورت، حتی د دومره کوچنۍ اندازې ان پټ ډاټا سره، موږ کولی شو دې پایلې ته ورسیږو چې د میګینټو (موډلونو او زیرمو) لخوا چمتو شوي وسیلو کارول مهم دي (زه ټینګار کوم - څومره!) د اړین فعالیت پراختیا ګړندی کړئ ، مګر په ورته وخت کې د پام وړ (زه ټینګار کوم - څومره!) سرعت کم کړئ په کوم کې چې ډاټا ډیټابیس ته راځي.

د پایلې په توګه، اوبه لوند شوې او دا وحی نه ده. په هرصورت، اوس زه د لوبې کولو لپاره کوډ لرم او شاید ځینې نور په زړه پورې پایلو ته ورسیږم.

سرچینه: www.habr.com