Magento 2: cuir a-steach toraidhean gu dìreach a-steach don stòr-dàta

В artaigil roimhe Thug mi cunntas air a’ phròiseas airson toraidhean a thoirt a-steach gu Magento 2 san dòigh àbhaisteach - tro mhodalan agus stòran. Tha astar giollachd dàta glè ìosal aig an dòigh àbhaisteach. Bha an laptop agam a’ dèanamh timcheall air aon toradh gach diog. San leantainn seo, bidh mi a’ beachdachadh air dòigh eile air toradh a thoirt a-steach - le bhith a’ dol a-steach gu dìreach don stòr-dàta, a’ dol seachad air na h-innealan àbhaisteach Magento 2 (modalan, factaraidhean, stòran). Faodar an t-sreath de cheumannan gus toraidhean a thoirt a-steach atharrachadh gu cànan prògramadh sam bith as urrainn obrachadh le MySQL.

Àicheadh: Tha comas-gnìomh deiseil aig Magento airson toirt a-steach dàta agus, mar as coltaiche, bidh e gu leòr dhut. Ach, ma tha feum agad air smachd nas coileanta air a’ phròiseas in-mhalairt, gun a bhith cuibhrichte ri bhith ag ullachadh faidhle CSV airson na tha agad, fàilte gu cat.

Magento 2: cuir a-steach toraidhean gu dìreach a-steach don stòr-dàta

Faodar an còd a thàinig bho bhith a’ sgrìobhadh an dà artaigil fhaicinn ann am modal Magento "flancer32/mage2_ext_demo_import". Seo cuid de chuingealachaidhean a lean mi gus còd modal demo a dhèanamh nas sìmplidhe:

  • Tha toraidhean air an cruthachadh a-mhàin, gun ùrachadh.
  • Aon taigh-bathair
  • Chan eil ach ainmean roinnean air an toirt a-steach, às aonais an structar aca
  • Tha structaran dàta a’ cumail ri dreach 2.3

JSON airson aon toradh a thoirt a-steach:

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

Sealladh farsaing air na prìomh ìrean de in-mhalairt

  • clàradh an toraidh fhèin
  • ceangal eadar toradh agus làrach-lìn
  • feartan toraidh bunaiteach (EAV)
  • dàta clàr-seilbhe (meud toraidh ann an stoc)
  • meadhanan (dealbhan)
  • ceangal ri roinnean catalog

Clàradh Bathar

Gheibhear fiosrachadh bunaiteach mu thoraidhean ann an 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`)
)

Is e am fiosrachadh as lugha a dh’ fheumar gus inntrigeadh a chruthachadh sa chlàr toraidh:

  • attribute_set_id
  • sku

a bharrachd:

  • type_id - mura sònraich sinn e, thèid 'sìmplidh' a chleachdadh

Gus sgrìobhadh gu dìreach chun stòr-dàta, bidh mi a’ cleachdadh an adapter DB de Magento fhèin:

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

Às deidh dhut an toradh a chlàradh le catalog_product_entity bidh e ri fhaicinn anns a’ phannal rianachd, anns a’ ghriod toraidh (Catalog/Bathar).

Magento 2: cuir a-steach toraidhean gu dìreach a-steach don stòr-dàta

An dàimh eadar toradh agus làrach-lìn

Bidh ceangal an toraidh leis an làrach a’ dearbhadh dè na stòran agus na taisbeanaidhean a bhios an toradh ri fhaighinn aig an aghaidh.

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: cuir a-steach toraidhean gu dìreach a-steach don stòr-dàta

Feartan toraidh bunaiteach

Chan eil ainm no tuairisgeul air an toradh ùr fhathast. Tha seo uile air a dhèanamh troimhe Feartan EAV. Seo liosta de na feartan toraidh bunaiteach a tha a dhìth airson an toradh a thaisbeanadh gu ceart air an aghaidh:

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

Tha feart air leth air a chur ri toradh mar seo (tha mion-fhiosrachadh mu bhith a’ faighinn an aithnichear agus an seòrsa feart bhon chòd aige air fhàgail air falbh):

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

A’ cleachdadh a’ chòd feart, bidh sinn a’ dearbhadh a id agus an seòrsa dàta (datetime, decimal, int, text, varchar), an uairsin sgrìobh an dàta airson an uinneag rianachd a-steach don chlàr iomchaidh (store_id = 0).

Às deidh dhut na buadhan gu h-àrd a chuir ris an toradh, gheibh thu an dealbh seo anns a’ phannal rianachd:

Magento 2: cuir a-steach toraidhean gu dìreach a-steach don stòr-dàta

Dàta clàr-stuthan

A’ tòiseachadh bho dhreach 2.3 ann am Magento, tha dà sheata de chlàran co-shìnte ann a bheir seachad stòradh fiosrachaidh tasgaidh (meud toraidh):

  • cataloginventory_*: seann structar;
  • inventory_*: structar ùr (MSI - Clàr Ioma-thùs);

Feumaidh tu dàta clàr-seilbhe a chur ris an dà structar, oir chan eil an structar ùr fhathast gu tur neo-eisimeileach bhon t-seann fhear (tha e glè choltach gur ann airson default taigh-bathair anns an structar ùr tha bòrd an sàs cataloginventory_stock_status mar inventory_stock_1).

clàr-stuthan_

Nuair a bhios sinn a’ cleachdadh Magneto 2.3 tha 2 inntrigeadh againn an toiseach store_website, a fhreagras ri dà làrach - rianachd agus prìomh neach-dèiligidh:

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

Clàr cataloginventory_stock chan eil againn ach aon inntrigeadh:

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

Is e sin, anns an t-seann structar againn chan eil ann ach aon “taigh-bathair” (stock) agus tha e ceangailte ris an làrach-lìn rianachd. A’ cur feadhainn ùra ris tron ​​phannal rianachd sources/stocks ann an MSI (structar ùr) chan eil sin a’ leantainn gu inntrigidhean ùra a-steach cataloginventory_stock.

Tha dàta clàr-stuthan mu thoraidhean san t-seann structar air a chlàradh an toiseach ann an clàran:

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

clàr-stuthan_

An toiseach, tha 1 "anns an structar ùr airson dàta tasgaidh a stòradh.stòr"(inventory_source):

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

agus aon"taigh-bathair"(inventory_stock):

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

«Stòr» a’ riochdachadh stòradh corporra airson toraidhean (tha co-chomharran fiosaigeach agus seòladh puist sa chlàr). "Taigh-bathair"na aonadh loidsigeach de ghrunn "stòran" (inventory_source_stock_link)

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

aig an ìre aig a bheil an ceangal ris an t-sianal reic a’ tachairt (inventory_stock_sales_channel)

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

A rèir structar an dàta, thathas a’ gabhail ri diofar sheòrsaichean de shianalan reic, ach gu bunaiteach dìreach an ceangal “stoc"-"Bidh“(tha an ceangal chun làrach-lìn a’ leantainn còd na làraich-lìn - base).

Aon "taigh-bathair"faodar a cheangal ri grunn"stòran"agus aon"stòr" - gu grunn"taighean-bathair"(càirdeas iomadach ri mòran). Tha na h-eisgeadan bunaiteach"stòr"Agus"taigh-bathair". Chan eil iad air an ath-cheangal ri buidhnean eile (cuingealachadh aig ìre còd - am mearachd "Cha b' urrainn dhuinn ceangal co-cheangailte ri Stòr bunaiteach no Stoc bunaiteach a shàbhaladh"). Gheibhear tuilleadh fiosrachaidh mu structar MSI ann am Magento 2 san artaigil “Siostam riaghlaidh taigh-bathair a’ cleachdadh CQRS agus Stòradh Tachartas. Dealbhadh".

Cleachdaidh mi an rèiteachadh bunaiteach agus cuiridh mi a h-uile fiosrachadh tasgaidh ris an stòr default, a tha an sàs anns an t-sianal reic co-cheangailte ris an làrach-lìn leis a 'chòd base (a 'freagairt ri ceann aghaidh a' bhùth - faic 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);
}

Às deidh dhut dàta tasgaidh a chuir ris an toradh sa phannal rianachd, gheibh thu an dealbh seo:

Magento 2: cuir a-steach toraidhean gu dìreach a-steach don stòr-dàta

Meadhanan

Nuair a chuireas tu “le làimh” ìomhaigh ri toradh tron ​​​​phannal rianachd, tha am fiosrachadh buntainneach sgrìobhte sìos anns na clàran a leanas:

  • catalog_product_entity_media_gallery: clàradh mheadhanan (ìomhaighean agus faidhlichean bhidio);
  • catalog_product_entity_media_gallery_value: a' ceangal mheadhanan ri bathar agus taisbeanaidhean (ionadail);
  • catalog_product_entity_media_gallery_value_to_entity: a’ ceangal mheadhanan ri bathar a-mhàin (a rèir coltais susbaint mheadhanan bunaiteach airson an toraidh);
  • catalog_product_entity_varchar: Tha na dreuchdan anns a bheil an ìomhaigh air a chleachdadh air a stòradh an seo;

agus tha na dealbhan fhèin air an sàbhaladh don chlàr ./pub/media/catalog/product/x/y/càite x и y - a’ chiad agus an dàrna litir de ainm faidhle ìomhaigh. Mar eisimpleir, file image.png bu chòir a shàbhaladh mar ./pub/media/catalog/product/i/m/image.png, gus an urrainn don àrd-ùrlar a chleachdadh mar ìomhaigh nuair a bhios e a’ toirt cunntas air toraidhean bhon chatalog.

Clàr air a phostadh a-steach ./pub/media/catalog/product/ faidhle mheadhanan (chan eilear a’ beachdachadh air a’ phròiseas airson am faidhle fhèin a chuir san artaigil seo):

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

Nuair a thèid a chlàradh, thèid aithnichear a thoirt do fhaidhle meadhanan ùr.

Bidh sinn a’ ceangal am faidhle meadhanan clàraichte leis an toradh co-fhreagarrach airson an aghaidh stòr bunaiteach:

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

Bidh sinn a’ ceangal am faidhle meadhanan clàraichte leis an toradh fhreagarrach gun a bhith ceangailte ri aghaidh stòr sam bith. Chan eil e soilleir càite dìreach a bheil an dàta seo air a chleachdadh agus carson a tha e do-dhèanta faighinn chun dàta bhon chlàr roimhe, ach tha an clàr seo ann agus tha an dàta air a sgrìobhadh thuige nuair a thèid dealbh a chuir ris an toradh. Mar sin sin e.

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

Faodar faidhle meadhanan a chleachdadh le diofar dhleastanasan (tha an còd feart co-fhreagarrach air a chomharrachadh ann am brathan):

  • Bun (image)
  • Ìomhaigh bheag (small_image)
  • Mion-dhealbh (thumbnail)
  • Ìomhaigh Swatch (swatch_image)

Is e a bhith a’ ceangal dhleastanasan ri faidhle meadhanan dìreach na thachras ann catalog_product_entity_varchar. Tha an còd ceangail coltach ris a' chòd anns an "Feartan toraidh bunaiteach".

Às deidh dha ìomhaigh a chuir ris an toradh anns a ’phannal rianachd tha e a’ coimhead mar seo:

Magento 2: cuir a-steach toraidhean gu dìreach a-steach don stòr-dàta

Roinnean

Prìomh chlàran anns a bheil dàta a rèir gnè:

  • catalog_category_entity: clàr nan roinnean;
  • catalog_category_product: ceangal eadar bathar agus roinnean;
  • catalog_category_entity_*: luachan feart EAV;

An toiseach, ann an tagradh Magento falamh, tha 2 roinn ann an clàr nan roinnean (ghiorraich mi ainmean nan colbhan: 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|

Is e an roinn le id=1 freumh a’ chatalog Magento gu lèir agus chan eil e ri fhaighinn an dàrna cuid sa phannal rianachd no air an duilleag aghaidh. Roinn le id=2 (Roinn bunaiteach) an roinn bhunaiteach airson prìomh stòr na làraich (Prìomh bhùth làrach-lìn) air a chruthachadh nuair a thèid an tagradh a chleachdadh (faic. Rianachd / Stòr / A h-uile stòr). A bharrachd air an sin, chan eil roinn freumh na stòr fhèin ri fhaighinn aig an aghaidh, dìreach na fo-roinnean aige.

Leis gu bheil cuspair an artaigil seo fhathast a ’toirt a-steach dàta mu thoraidhean, cha chleachd mi inntrigeadh dìreach a-steach don stòr-dàta nuair a bhios mi a’ cruthachadh roinnean, ach cleachdaidh mi na clasaichean a thug Magento fhèin seachad (modalan agus stòran). Chan eilear a’ cleachdadh inntrigeadh dìreach a-steach don stòr-dàta ach airson an toradh a chaidh a thoirt a-steach a cheangal ri roinn (tha an roinn air a mhaidseadh leis an ainm, agus gheibhear id na roinne nuair a thathar a’ maidseadh):

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

Às deidh ceangal toraidh a chuir ris na roinnean “Ro-seòrsa 1” agus “Roinn 2”, tha mion-fhiosrachadh an toraidh anns a’ phannal rianachd a ’coimhead rudeigin mar seo:

Magento 2: cuir a-steach toraidhean gu dìreach a-steach don stòr-dàta

Gnìomhan a bharrachd

Aon uair ‘s gu bheil an in-mhalairt dàta deiseil, feumaidh tu na ceumannan a bharrachd a leanas a choileanadh:

  • clàr-amais dàta: cuir fios a-steach don consol ./bin/magento indexer:reindex;
  • ag ath-nuadhachadh URLan airson toraidhean / roinnean: faodaidh tu an leudachadh a chleachdadh “elgentos/regenerate-catalog-urls«

Bathar anns a 'phannal rianachd an dèidh gnìomhan a bharrachd a dhèanamh:

Magento 2: cuir a-steach toraidhean gu dìreach a-steach don stòr-dàta

agus air an aghaidh :

Magento 2: cuir a-steach toraidhean gu dìreach a-steach don stòr-dàta

Geàrr-chunntas

Tha an aon sheata de thoraidhean (10 pìosan) mar a bha san artaigil roimhe air a thoirt a-steach co-dhiù òrdugh meudachd nas luaithe (1 diog an aghaidh 10). Gus tuairmse nas mionaidiche a dhèanamh air an astar, feumaidh tu àireamh nas motha de thoraidhean - grunn cheudan, no nas fheàrr fhathast mìltean. Ach, eadhon le meud cho beag de dhàta cuir a-steach, faodaidh sinn a cho-dhùnadh gu bheil cleachdadh nan innealan a thug Magento seachad (modalan agus stòran) cudromach (tha mi a’ daingneachadh - mòr!) luathaich leasachadh na gnìomhachd a tha a dhìth, ach aig an aon àm gu mòr (tha mi a’ cur cuideam air - mòr!) lughdaich an astar aig an tèid dàta a-steach don stòr-dàta.

Mar thoradh air an sin, thionndaidh an t-uisge gu bhith fliuch agus chan e foillseachadh a tha seo. Ach, a-nis tha an còd agam airson cluich leis agus is dòcha tighinn gu co-dhùnaidhean nas inntinniche.

Source: www.habr.com