Magento 2: táirgí a allmhairiú go díreach isteach sa bhunachar sonraí

В alt roimhe seo Rinne mé cur síos ar an bpróiseas maidir le táirgí a allmhairiú isteach i Magento 2 ar an ngnáthbhealach - trí mhúnlaí agus stórtha. Tá luas próiseála sonraí an-íseal ag an modh is gnách. Bhí mo ríomhaire glúine ag táirgeadh thart ar tháirge amháin in aghaidh an tsoicind. Sa leanúint seo, breithním ar bhealach eile chun táirge a allmhairiú - trí iontráil dhíreach a dhéanamh sa bhunachar sonraí, ag seachaint meicníochtaí caighdeánacha Magento 2 (samhlacha, monarchana, stórtha). Is féidir seicheamh na gcéimeanna chun táirgí a allmhairiú a oiriúnú d’aon teanga ríomhchlárúcháin ar féidir oibriú le MySQL.

Séanadh: Tá feidhmiúlacht réidh-déanta ag Magento le haghaidh allmhairiú sonraí agus, is dócha, beidh sé go leor duit. Mar sin féin, má tá smacht níos iomláine ag teastáil uait ar an bpróiseas allmhairithe, gan a bheith teoranta do chomhad CSV a ullmhú don mhéid atá agat, fáilte romhat chuig cat.

Magento 2: táirgí a allmhairiú go díreach isteach sa bhunachar sonraí

Is féidir an cód a tháinig as an dá alt a scríobh a fheiceáil sa mhodúl Magento "flancer32/mage2_ext_demo_import“. Seo roinnt srianta a lean mé chun cód an mhodúil taispeána a shimpliú:

  • Ní chruthaítear táirgí ach amháin, ní nuashonraítear iad.
  • Stóras amháin
  • Ní allmhairítear ach ainmneacha catagóir, gan a struchtúr
  • Comhlíonann struchtúir sonraí leagan 2.3

JSON chun táirge amháin a iompórtáil:

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

Forbhreathnú ar na príomhchéimeanna allmhairithe

  • clárú an táirge féin
  • nasc idir an táirge agus an suíomh Gréasáin
  • tréithe bunúsacha an táirge (EAV)
  • sonraí fardail (cainníocht an táirge sa stoc)
  • meáin (pictiúir)
  • nasc le catagóirí catalóg

Clárú Táirge

Is féidir faisnéis bhunúsach táirge a fháil i 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 é an t-íosmhéid faisnéise a theastaíonn chun iontráil a chruthú sa chlár táirgí:

  • attribute_set_id
  • sku

breise:

  • type_id — mura sonraímid é, bainfear úsáid as 'simplí'

Chun scríobh go díreach chuig an mbunachar sonraí, úsáidim an cuibheoir DB de Magento fé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;
}

Tar éis an táirge a chlárú le catalog_product_entity bíonn sé le feiceáil sa phainéal riaracháin, sa ghreille táirge (Catalóg/Táirgí).

Magento 2: táirgí a allmhairiú go díreach isteach sa bhunachar sonraí

Gaol idir an táirge agus an suíomh Gréasáin

Cinneann comhlachas an táirge leis an láithreán cé na stórais agus na taispeántais a bheidh an táirge ar fáil ag an tosach.

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: táirgí a allmhairiú go díreach isteach sa bhunachar sonraí

Buntréithe táirge

Níl ainm ná tuairisc ar an táirge nuachláraithe fós. Déantar é seo go léir tríd tréithe EAV. Seo liosta de bhuntréithe an táirge a theastaíonn chun an táirge a thaispeáint i gceart ar an tosach:

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

Cuirtear aitreabúid ar leith le táirge mar seo (fágtar ar lár na sonraí maidir le haitheantóir agus cineál na haise a fháil óna chód):

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

Agus an cód aitreabúide á úsáid againn, cinnimid a aitheantas agus a chineál sonraí (datetime, decimal, int, text, varchar), ansin scríobh na sonraí don fhuinneog riaracháin isteach sa tábla cuí (store_id = 0).

Tar éis duit na tréithe thuas a chur leis an táirge, gheobhaidh tú an pictiúr seo sa phainéal riaracháin:

Magento 2: táirgí a allmhairiú go díreach isteach sa bhunachar sonraí

Sonraí fardail

Ag tosú ó leagan 2.3 i Magento, tá dhá thacar comhthreomhara táblaí a sholáthraíonn faisnéis fardail a stóráil (cainníocht an táirge):

  • cataloginventory_*: seanstruchtúr;
  • inventory_*: struchtúr nua (MSI - Fardal Ilfhoinsí);

Ní mór duit sonraí fardail a chur leis an dá struchtúr, mar gheall ar níl an struchtúr nua go hiomlán neamhspleách ar an seancheann fós (is beag seans go mbeidh do default stóras sa struchtúr nua tá tábla i gceist cataloginventory_stock_status mar inventory_stock_1).

liosta chatalóg_

Nuair a bhíonn Magneto 2.3 á imscaradh tá 2 iontráil isteach againn ar dtús store_website, a fhreagraíonn do dhá shuíomh - riaracháin agus príomhchliant:

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

Tábla cataloginventory_stock níl ach iontráil amháin againn:

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

Is é sin, inár sean-struchtúr níl ach “stóras” amháin (stock) agus tá sé nasctha leis an suíomh Gréasáin riaracháin. Cinn nua a chur leis tríd an bpainéal riaracháin sources/stocks in MSI (struchtúr nua) ní bhíonn iontrálacha nua i cataloginventory_stock.

Déantar sonraí fardail faoi tháirgí sa seanstruchtúr a thaifeadadh ar dtús i dtáblaí:

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

fardal_

Ar dtús, tá 1 " sa struchtúr nua chun sonraí fardail a stóráilfhoinse'(inventory_source):

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

agus ceann"stóras'(inventory_stock):

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

«Foinse» seasann sé don stóráil fhisiciúil do tháirgí (tá comhordanáidí fisiceacha agus seoladh poist sa taifead). "Trádstóras"Is aontas loighciúil de roinnt "foinsí" (inventory_source_stock_link)

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

ag an leibhéal ag a dtarlaíonn an nasc leis an gcainéal díolacháin (inventory_stock_sales_channel)

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

Agus an struchtúr sonraí á mheas, glactar leis na cineálacha éagsúla bealaí díolacháin, ach de réir réamhshocraithe amháin an nasc “stoc"-"láithreán gréasáin"(leanann an nasc chuig an suíomh Gréasáin cód an tsuímh Ghréasáin - base).

a haon"stóras"is féidir é a nascadh le roinnt"le foinsí"agus ceann"fhoinse" - go roinnt"stórais“(gaol go leor le go leor). Tá na heisceachtaí réamhshocraithe "fhoinse"Agus"stóras“. Níl siad athnasctha le haonáin eile (teorainn ar leibhéal an chóid - an earráid “Ní féidir nasc a bhaineann le Foinse Réamhshocraithe nó Stoc Réamhshocraithe a shábháil"). Tá tuilleadh sonraí faoin struchtúr MSI i Magento 2 le fáil san alt “Córas bainistíochta stórais ag baint úsáide as CQRS agus Foinsiú Imeachtaí. Dearadh".

Úsáidfidh mé an chumraíocht réamhshocraithe agus cuirfidh mé an fhaisnéis fardail go léir leis an bhfoinse default, a bhfuil baint acu leis an gcainéal díolacháin a bhaineann leis an láithreán gréasáin leis an gcód base (a fhreagraíonn do cheann tosaigh an siopa - féach 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);
}

Tar éis duit sonraí fardail a chur leis an táirge sa phainéal riaracháin, gheobhaidh tú an pictiúr seo:

Magento 2: táirgí a allmhairiú go díreach isteach sa bhunachar sonraí

Meáin

Nuair a chuirtear íomhá “de láimh” le táirge tríd an bpainéal riaracháin, scríobhtar síos an fhaisnéis ábhartha sna táblaí seo a leanas:

  • catalog_product_entity_media_gallery: clárlann na meán (íomhánna agus comhaid físe);
  • catalog_product_entity_media_gallery_value: na meáin a nascadh le táirgí agus taispeántais (logánú);
  • catalog_product_entity_media_gallery_value_to_entity: meáin a nascadh le táirgí amháin (ábhar meán réamhshocraithe don táirge is dócha);
  • catalog_product_entity_varchar: Stóráiltear na róil ina n-úsáidtear an íomhá anseo;

agus déantar na híomhánna féin a shábháil ar an eolaire ./pub/media/catalog/product/x/y/I gcás ina x и y — an chéad litir agus an dara litir d'ainm an chomhaid íomhá. Mar shampla, comhad image.png chóir a shábháil mar ./pub/media/catalog/product/i/m/image.png, ionas gur féidir leis an ardán é a úsáid mar íomhá agus é ag cur síos ar tháirgí ón gcatalóg.

Clár postáilte i ./pub/media/catalog/product/ comhad meán (ní phléitear an próiseas chun an comhad féin a chur san alt 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 chláraítear é, sanntar aitheantóir do chomhad meán nua.

Déanaimid an comhad meán cláraithe a nascadh leis an táirge comhfhreagrach don aghaidh siopa réamhshocraithe:

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

Déanaimid an comhad meán cláraithe a nascadh leis an táirge comhfhreagrach gan a bheith ceangailte le haon aghaidh siopa. Níl sé soiléir cén áit go díreach a úsáidtear na sonraí seo agus cén fáth go bhfuil sé dodhéanta rochtain a fháil ar na sonraí ón tábla roimhe seo, ach tá an tábla seo ann agus scríobhtar na sonraí chuige nuair a chuirtear pictiúr leis an táirge. Mar sin, sin é.

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

Is féidir comhad meán a úsáid le róil éagsúla (tá an cód aitreabúide comhfhreagrach le fios i lúibíní):

  • bonn(image)
  • Íomhá Bheag (small_image)
  • Mionsamhail (thumbnail)
  • Íomhá Swatch (swatch_image)

Is éard a tharlaíonn i róil a nascadh le comhad meán catalog_product_entity_varchar. Tá an cód ceangailteach cosúil leis an gcód sa "Buntréithe táirge".

Tar éis íomhá a chur leis an táirge sa phainéal riaracháin tá an chuma air seo:

Magento 2: táirgí a allmhairiú go díreach isteach sa bhunachar sonraí

Категории

Príomhtháblaí ina bhfuil sonraí de réir catagóire:

  • catalog_category_entity: clár na gcatagóirí;
  • catalog_category_product: nasc idir táirgí agus catagóirí;
  • catalog_category_entity_*: luachanna aitreabúide EAV;

Ar dtús, in iarratas Magento folamh, tá 2 chatagóir i gclárlann na gcatagóirí (ghiorraigh mé ainmneacha na gcolún: 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 í an chatagóir le id=1 fréamh chatalóg iomlán Magento agus níl sé ar fáil sa phainéal riaracháin ná ar an leathanach tosaigh. Catagóir le haitheantas=2 (Catagóir Réamhshocraithe) an bunchatagóir do phríomhstóras an phríomhshuímh (Príomh-siopa Gréasáin) a cruthaíodh nuair a bhíonn an feidhmchlár imlonnaithe (féach. Riarachán / Stórais / Gach Store). Thairis sin, níl bunchatagóir an stórais féin ar fáil freisin ag an tosaigh, ach a chuid fochatagóirí.

Ós rud é go bhfuil ábhar an ailt seo fós ag iompórtáil sonraí ar tháirgí, ní úsáidfidh mé iontráil dhíreach sa bhunachar sonraí agus catagóirí á gcruthú agam, ach úsáidfidh mé na ranganna a sholáthraíonn Magento féin (samhlacha agus stórtha). Ní úsáidtear iontráil dhíreach isteach sa bhunachar sonraí ach amháin chun an táirge iompórtáilte a chomhcheangal le catagóir (déantar an chatagóir a mheaitseáil lena hainm, agus faightear aitheantas na catagóire le linn meaitseála):

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

Tar éis nasc táirge a chur leis na catagóirí “Catagóir 1” agus “Catagóir 2”, tá cuma mar seo ar shonraí an táirge sa phainéal riaracháin:

Magento 2: táirgí a allmhairiú go díreach isteach sa bhunachar sonraí

Gníomhartha breise

Nuair a bheidh an allmhairiú sonraí críochnaithe, ní mór duit na céimeanna breise seo a leanas a chur i gcrích:

  • innéacsú sonraí: glaoch isteach sa chonsól ./bin/magento indexer:reindex;
  • ag athghiniúint URLanna le haghaidh táirgí/catagóirí: is féidir leat an síneadh a úsáid “elgentos/regenerate-catalog-urls«

Táirgí sa phainéal riaracháin tar éis gníomhartha breise a dhéanamh:

Magento 2: táirgí a allmhairiú go díreach isteach sa bhunachar sonraí

agus ag tosach:

Magento 2: táirgí a allmhairiú go díreach isteach sa bhunachar sonraí

Achoimre

Déantar an tsraith táirgí céanna (10 bpíosa) agus a bhí san alt roimhe seo a allmhairiú ar a laghad ord méide níos tapúla (1 soicind in aghaidh 10). Chun an luas a mheas níos cruinne, is gá duit líon níos mó táirgí - na céadta, nó níos fearr fós na mílte. Mar sin féin, fiú le méid chomh beag sonraí ionchuir, is féidir linn a thabhairt i gcrích go bhfuil úsáid na n-uirlisí a sholáthraíonn Magento (samhlacha agus stórtha) suntasach (cuirim béim ar - i bhfad níos!) dlús a chur le forbairt na feidhmiúlachta atá ag teastáil, ach ag an am céanna go suntasach (béim ar - i bhfad níos!) an luas a théann sonraí isteach sa bhunachar sonraí a laghdú.

Mar thoradh air sin, d'éirigh an t-uisce amach a bheith fliuch agus ní nochtadh é seo. Mar sin féin, anois tá an cód agam le himirt leis agus b'fhéidir teacht ar roinnt conclúidí níos suimiúla.

Foinse: will.com

Add a comment