Magento 2: import products directe in database

Π’ articulus priorem Processum importandi productos in Magento 2 de more solito per exempla et repositoria descripsi. Usitatius processus notitiae nimis humilis celeritatem habet. My laptop was produceing about one product per second. In hac continuatione, joco modo considero ad importare productum - per directum ingressum in datorum, praeterendo vexillum Magento 2 machinationes (exempla, officinas, repositoria). Ordo graduum ad fructus importare potest accommodari cuilibet linguae programmationis quae cum MySQL operari potest.

Disclaimer: Magento pro parata functionality habet notitia import et fere, satis erit tibi. Attamen, si plenius imperium in processum importare debes, non limitatum ad limam CSV parandam quae habes, grata cat.

Magento 2: import products directe in database

Codex ex scriptura utriusque articuli in Magento modulo spectari potest.flancer32/mage2_ext_demo_importΒ». Hic restrictiones aliquas secutus sum ut moduli codicem demo moduli simpliciorem redderet:

  • Producta tantum creata sunt, non renovata.
  • Unum CELLA
  • Tantum categoriae nomina importantur, sine structura
  • Data structurae parere cum versione 2.3

JSON importat unum productum:

{
  "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"
}

Maecenas praecipua momenta import

  • adnotatione productum ipsum
  • nexum inter productum et website
  • basic productum attributa (EAV)
  • inventarium data (copia producti In Stock)
  • media (imaginibus)
  • nexum cum catalogo genera

Product Registration

Basic productum notitia potest inveniri in 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`)
)

Minima notitia requiritur ad ingressum creare in subcriptio producti est:

  • attribute_set_id
  • sku

addito:

  • type_id - si id non definimus, "simplex" adhibebitur

Scribere directe ad datorum, DB ipso Magento adaptatore utor;

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

Postquam perscriptum est productum est catalog_product_entity apparet in admin panel, in producto eget (Catalogue/Products).

Magento 2: import products directe in database

Relatione inter productum et website

Societas producti cum situ determinat in quo thesauris et productum ostendit in fronte praesto erunt.

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: import products directe in database

Basic productum attributa

Productus recens descriptus nondum nomen aut descriptionem habet. Hoc totum fit EAV attributa. Hic est index productorum fundamentalium quae opus sunt ut producti recte in fronte exponantur:

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

Singula attributa huic producto adduntur (singulae obtinendae identifier et species attributi e codice suo omittuntur) ;

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

Codice utendo attributo, eius id genus et notitias determinamus (datetime, decimal, int, text, varchar) tunc scribe datam pro fenestra administrativa in mensa convenienti (store_id = 0).

His additis supra attributis productum, hanc imaginem in tabula admin accipias:

Magento 2: import products directe in database

Inventarium notitia

Ex versione 2.3 in Magento proficiscentes, duae sunt tabulae parallelae quae reponunt informationem inventarii (producti quantitatis);

  • cataloginventory_*: vetus structura;
  • inventory_*: nova structura (MSI - Multi Source Inventory);

Indicium inventarium utriusque structurae addere debes, quia nova structura nondum a veteri prorsus absoluta est (verisimile est enim default CELLA in nova structura mensam involvit cataloginventory_stock_status quod inventory_stock_1).

cataloginventory_

Cum explicatis Magneto 2.3 initio habemus 2 entries in store_websitequae respondet duobus sitibus administrativo et principali cliente;

website_id|code |name        |sort_order|default_group_id|is_default|
----------|-----|------------|----------|----------------|----------|
         0|admin|Admin       |         0|               0|         0|
         1|base |Main Website|         0|               1|         1|

Mensa cataloginventory_stock unum tantum ingressum:

stock_id|website_id|stock_name|
--------|----------|----------|
       1|         0|Default   |

Hoc est, in nostra vetere structura unum tantum "CELLA" (.stock) et coniungitur cum website administrativo. Novas addit per admin panel sources/stocks in MSI (nova structura) non sequitur in novis entries in cataloginventory_stock.

Inventarium notitia de fructibus in antiqua structura initio in tabulis memoratur;

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

inventory_

Initio, nova structura ad inventarium reponendas notitias continet 1"fons"(inventory_source):

source_code|name          |enabled|description   |latitude|longitude|country_id|...|
-----------|--------------|-------|--------------|--------|---------|----------|...|
default    |Default Source|      1|Default Source|0.000000| 0.000000|US        |...|

et unus "store"(inventory_stock):

stock_id|name         |
--------|-------------|
       1|Default Stock|

Β«fonsΒ» Repositiones physicae repraesentet pro productis (conscriptio corporis coordinatas et inscriptio electronica continet). "CELLA"est unio logica plurium fontium" (inventory_source_stock_link)

link_id|stock_id|source_code|priority|
-------|--------|-----------|--------|
      1|       1|default    |       1|

in plano quo nexus ad venditionesque alveum occurrit (inventory_stock_sales_channel)

type   |code|stock_id|
-------|----|--------|
website|base|       1|

Ex structuris notitiis diiudicandis, variae rationes venarum venditionum assumuntur, sed per defaltam tantum nexum "genus"-"website"(Nexus ad locum paginae sequitur in codice website - base).

Unus "storepluribus coniungi potest "fontibus" et unus "fons" - pluribus "apothecae"(multis-ad-multa relatione). Exceptiones defaltae sunt ".fons"Et"storeΒ». Non re-iunguntur aliis entibus (limitatio in codice gradu - errori "Non potest salvum facere nexum ad Default Source vel Default Stock"). Plura de structura MSI in Magento 2 in articulo inveniuntur "CELLA administratione ratio utendi CQRS et Event Sourcing. Design".

Ego configuratione defaltam utar et omnem informationem inventarii adiciam ad fontem default, quod involvitur in canali venditio cum pagina coniungitur cum codice base (Convenit ante finem copia - see 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);
}

Post inventarium additis notitias producti in tabula admin, hanc imaginem accipis:

Magento 2: import products directe in database

media

Cum "manually" imaginem rei per tabulam admin addito, notitiae in sequentibus tabulis scriptae sunt:

  • catalog_product_entity_media_gallery: subcriptio instrumentorum (imaginum et imaginum video);
  • catalog_product_entity_media_gallery_value: conjunctio instrumentorum ad products et showcases (localization);
  • catalog_product_entity_media_gallery_value_to_entityConiunctio instrumentorum ad res productas tantum (scilicet defaltam instrumentorum contentorum pro facto);
  • catalog_product_entity_varcharMunera quibus imago adhibetur, hic reponuntur;

et imagines ipsae in indicem servatae sunt ./pub/media/catalog/product/x/y/quibus x ΠΈ y β€” prima et secunda litterae imaginis nomen. Exempli gratia, file image.png ut salvus ./pub/media/catalog/product/i/m/image.pngita ut suggestum eo uti possit pro imagine, ex catalogo res gestas describens.

Mandare missae in ./pub/media/catalog/product/ fasciculus instrumentorum (processus ponendi ipsum fasciculum in hoc articulo non tractatum);

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

Cum relatus est, novus fasciculus instrumentorum identifier adscriptus est.

Coniungimus genealogia instrumentorum communicationis socialis cum correspondente productum pro defectu storefront:

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

Negotiorum instrumentorum tabellam coniungimus cum productum respondente sine aliquo storefront ligatum. Ubi prorsus haec notitia adhibetur, non liquet et cur ex antecedente tabula accedere non potest, sed haec tabula exstat et notitia ad eam scripta est, cum imago operis additur. Ut id est.

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

Fasciculus instrumentorum communicationis socialis adhiberi potest cum diversis muneribus (codice attributo respondente in parenthesi notatur);

  • Basis (image)
  • Parva imago (small_image)
  • Thumbnail (thumbnail)
  • Swatch Imago (swatch_image)

Scapus instrumentorum communicationis socialis est prorsus id quod accidit in catalog_product_entity_varchar. Codex ligaminis similis est in codice "Basic productum attributa".

Post imaginem addito producto in tabula admin hoc spectat:

Magento 2: import products directe in database

genus

Tabulae principales continentur notitia ex categoria:

  • catalog_category_entity: Register of categories;
  • catalog_category_product: nexum inter genera et genera;
  • catalog_category_entity_*: EAV tribuunt valores;

Primo, in applicatione vacua Magento, subcriptio praedicamenti continet 2 categorias (Collumna nomina abbreviata; 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|

Categoria cum id=1 radice est catalogi totius Magento nec in tabula admin vel in pagina anteriori praesto est. Genus cum id = 2 (Default Categoria) Radix est genus principalis situs est copia principalis (Main Website Store) creatus est cum applicatio explicatur (cf. Admin / Stores / All Stores). Praeterea genus copiae ipsius radix etiam in fronte praesto non est, solum eius subcategoriae.

Cum thema huius articuli adhuc notitias de productis importat, in datorum categoriis creandis directum ingressum non adhibebo, sed generibus ab ipso Magento instructis (exempla et repositoria adhibebo). Directum ingressum in database adhibetur solum ad importatum productum cum categoria coniungendum (genus suo nomine aequatur, et id genus per adaptationem retinetur);

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

His additis nexus producti ad praedicamenta "Categoria 1" et "Categoria II", singula producta in tabula admin spectant aliquid simile:

Magento 2: import products directe in database

Additional actiones

Cum notitia importatio integra est, necesse est ut sequentes gradus adiectis compleantur:

  • notitia indexing: voca in consolatorium ./bin/magento indexer:reindex;
  • delata regenerare pro products/genera: extensio uti potes "elgentos/regenerare-catalog-urlsΒ«

Products in admin panel post actiones faciendo additional:

Magento 2: import products directe in database

et in fronte;

Magento 2: import products directe in database

summary

Eadem copia productorum (10 frusta) ut in superiore articulo importatur saltem ordo magnitudinis velocior (1 secundi versus 10). Ut celerius accuratius aestimes, maior vis productorum opus est, pluribus centum, vel adhuc millibus amplius. Tamen, etiam cum tam parva notitiarum inputationis magnitudine, concludere possumus usum instrumentorum a Magento (exempla et repositoria) significantes esse (inculco -. tantum! tantum!) reducere celeritatem in qua notitia datorum ingreditur.

Quam ob rem aqua rigare contigit, et haec revelatio non est. Nunc tamen codicem habeo ludere et fortasse ad nonnullas conclusiones magis iucundas venio.

Source: www.habr.com