Magento 2: Мэдээллийн сан руу бүтээгдэхүүнийг шууд импортлох

В өмнөх нийтлэл Би Magento 2-д бүтээгдэхүүн импортлох үйл явцыг ердийн аргаар - загвар, хадгалах газраар дүрсэлсэн. Ердийн арга нь өгөгдөл боловсруулах маш бага хурдтай байдаг. Миний зөөврийн компьютер секундэд нэг бүтээгдэхүүн үйлдвэрлэдэг байсан. Энэхүү үргэлжлэлд би Magento 2 стандарт механизмыг (загвар, үйлдвэр, хадгалах газар) алгасаж мэдээллийн санд шууд оруулах замаар бүтээгдэхүүн импортлох өөр аргыг авч үзэх болно. Бүтээгдэхүүн импортлох алхамуудын дарааллыг MySQL-тэй ажиллах боломжтой програмчлалын хэлэнд тохируулж болно.

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

Атрибут кодыг ашиглан бид түүний id болон өгөгдлийн төрлийг тодорхойлно (datetime, decimal, int, text, varchar), дараа нь захиргааны цонхны өгөгдлийг зохих хүснэгтэд бичнэ үү (store_id = 0).

Дээрх шинж чанаруудыг бүтээгдэхүүнд нэмсний дараа та админ самбарт энэ зургийг авах болно.

Magento 2: Мэдээллийн сан руу бүтээгдэхүүнийг шууд импортлох

Бараа материалын мэдээлэл

Magento-ийн 2.3 хувилбараас эхлэн бараа материалын мэдээллийг (бүтээгдэхүүний тоо хэмжээ) хадгалах боломжийг олгодог хоёр зэрэгцээ хүснэгтүүд байдаг.

  • cataloginventory_*: хуучин бүтэц;
  • inventory_*: шинэ бүтэц (MSI - Олон эх сурвалжийн бараа материал);

Та хоёр бүтцэд бараа материалын өгөгдлийг нэмэх хэрэгтэй, учир нь Шинэ бүтэц нь хуучнаасаа бүрэн хараат бус байгаа (энэ нь маш их магадлалтай 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

каталогийн бараа материалын_хувьцааны_зүйл

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

каталогийн бараа материалын_хувьцааны_төлөв

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 болон Event Sourcing ашиглан агуулахын удирдлагын систем. Дизайн".

Би анхдагч тохиргоог ашиглаж, бүх бараа материалын мэдээллийг эх сурвалжид нэмнэ 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);
}

каталог_бүтээгдэхүүний_аж ахуйн нэгж_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-ийн өөрөө өгсөн ангиудыг (загвар ба хадгалах газар) ашиглах болно. Мэдээллийн санд шууд оруулах нь зөвхөн импортын бүтээгдэхүүнийг ангилалтай холбоход ашиглагддаг (ангиллыг нэрээр нь тааруулж, тохирох үед ангиллын 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" ангилалд бүтээгдэхүүний холбоосыг нэмсний дараа админ самбар дээрх бүтээгдэхүүний дэлгэрэнгүй мэдээлэл дараах байдалтай харагдана.

Magento 2: Мэдээллийн сан руу бүтээгдэхүүнийг шууд импортлох

Нэмэлт үйлдлүүд

Мэдээллийг импорт хийж дууссаны дараа та дараах нэмэлт алхмуудыг хийх шаардлагатай.

  • Өгөгдлийн индексжүүлэлт: консол руу залгана уу ./bin/magento indexer:reindex;
  • Бүтээгдэхүүн/категорийн URL-уудыг сэргээх: та өргөтгөлийг ашиглаж болно.elgentos/regenerate-catalog-urls«

Нэмэлт үйлдлүүдийг хийсний дараа админ самбар дээрх бүтээгдэхүүнүүд:

Magento 2: Мэдээллийн сан руу бүтээгдэхүүнийг шууд импортлох

мөн урд талд:

Magento 2: Мэдээллийн сан руу бүтээгдэхүүнийг шууд импортлох

Хураангуй

Өмнөх нийтлэлд дурдсантай ижил багц бүтээгдэхүүнийг (10 ширхэг) хамгийн багадаа илүү хурдан импортолдог (1 секундын эсрэг 10). Хурдыг илүү нарийвчлалтай тооцоолохын тулд танд илүү олон тооны бүтээгдэхүүн хэрэгтэй - хэдэн зуун, эсвэл илүү сайн мянга. Гэсэн хэдий ч ийм жижиг хэмжээтэй оролтын өгөгдлүүдтэй байсан ч гэсэн бид Magento-ийн өгсөн хэрэгслүүдийг (загвар ба хадгалах газар) ашиглах нь чухал ач холбогдолтой гэж дүгнэж болно (би онцолж байна - их!) шаардлагатай функцийг хөгжүүлэх ажлыг хурдасгах, гэхдээ нэгэн зэрэг мэдэгдэхүйц (би онцолж байна - их!) мэдээллийн санд өгөгдөл орох хурдыг багасгах.

Үүний үр дүнд ус нойтон болсон бөгөөд энэ нь илчлэлт биш юм. Гэсэн хэдий ч одоо надад тоглох код байгаа бөгөөд магадгүй илүү сонирхолтой дүгнэлтэд хүрэх болно.

Эх сурвалж: www.habr.com