Magento 2: pinza zvigadzirwa zvakananga mudhatabhesi

Π’ nyaya yapfuura Ini ndakatsanangura maitiro ekupinza zvigadzirwa muMagento 2 nenzira yakajairwa - kuburikidza nemamodheru uye repositori. Iyo yakajairika nzira ine yakaderera kwazvo data processing kasi. Laptop yangu yaive ichigadzira chinenge chigadzirwa pasekondi. Mukuenderera mberi uku, ini ndinofunga imwe nzira yekupinza chigadzirwa - nekupinda zvakananga mudhatabhesi, nekupfuura yakajairwa Magento 2 maitirwo (modhi, mafekitori, marepositori). Kutevedzana kwematanho ekupinza zvigadzirwa kunogona kuchinjirwa kune chero mutauro wechirongwa unogona kushanda neMySQL.

Disclaimer: Magento ine yakagadzirira-yakagadzirwa mashandiro e data import uye, zvichida, zvichava zvakakwana kwauri. Nekudaro, kana iwe uchida kudzora kwakazara pamusoro pemaitiro ekutumira, kwete kugumira pakugadzirira CSV faira pane zvaunazvo, unogamuchirwa kukati.

Magento 2: pinza zvigadzirwa zvakananga mudhatabhesi

Iyo kodhi inokonzerwa nekunyora zvese zvinyorwa inogona kutariswa muMagento module "flancer32/mage2_ext_demo_import". Heano zvimwe zvirambidzo zvandakatevera kuti kurerutsa demo module kodhi:

  • Zvigadzirwa zvinogadzirwa chete, kwete kuvandudzwa.
  • Imwe imba yekuchengetera zvinhu
  • Mazita echikwata chete anounzwa kunze kwenyika, pasina chimiro chawo
  • Zvimiro zvedata zvinoenderana neshanduro 2.3

JSON yekuunza kunze chigadzirwa chimwe chete:

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

Hwirudzuro yematanho makuru ekuunza kunze

  • kunyoreswa kwechigadzirwa pachacho
  • kubatana pakati pechigadzirwa uye webhusaiti
  • basic product attributes (EAV)
  • Inventory data (huwandu hwechigadzirwa chiri mustock)
  • midhiya (mifananidzo)
  • kubatana nekatalogi zvikamu

Product Registration

Ruzivo rwechigadzirwa rwekutanga runogona kuwanikwa mukati 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`)
)

Iwo mashoma ruzivo anodiwa kugadzira yekupinda mune yechigadzirwa registry ndeiyi:

  • attribute_set_id
  • sku

kuwedzera:

  • type_id - kana tikasazvitsanangura, ipapo 'nyore' ichashandiswa

Kunyora zvakananga kune dhatabhesi, ini ndinoshandisa iyo DB adapta yeMagento pachayo:

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

Mushure mekunyoresa chigadzirwa ne catalog_product_entity inova inoonekwa mune admin panel, mune chigadzirwa grid (Catalog/Zvigadzirwa).

Magento 2: pinza zvigadzirwa zvakananga mudhatabhesi

Hukama pakati pechigadzirwa uye webhusaiti

Iko kushamwaridzana kwechigadzirwa nesaiti inosarudza kuti ndezvipi zvitoro uye zvinoratidzira chigadzirwa chichave chiripo kumberi.

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: pinza zvigadzirwa zvakananga mudhatabhesi

Basic chigadzirwa hunhu

Chigadzirwa chitsva ichi hachisati chave nezita kana tsananguro. Zvose izvi zvinoitwa kuburikidza EAV hunhu. Heino rondedzero yezvakakosha zvigadzirwa hunhu hunodiwa kuti chigadzirwa chiratidzike nenzira kwayo kumberi:

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

Humwe hunhu hwakapatsanurwa hunowedzerwa kune chigadzirwa chakaita seichi (ruzivo rwekutora chiziviso uye rudzi rwechimiro kubva kukodhi yacho zvakasiiwa):

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

Tichishandisa iyo hunhu kodhi, isu tinosarudza id yayo uye data rudzi (datetime, decimal, int, text, varchar), wobva wanyora iyo data yehwindo rekutonga mutafura yakakodzera (store_id = 0).

Mushure mekuwedzera hunhu huri pamusoro pachigadzirwa, unowana iyi pikicha mune admin panhizha:

Magento 2: pinza zvigadzirwa zvakananga mudhatabhesi

Inventory data

Kutanga kubva kuvhezheni 2.3 muMagento, kune maviri anoenderana seti ematafura anopa chengetedzo yeruzivo rwezvinyorwa (huwandu hwechigadzirwa):

  • cataloginventory_*: chimiro chekare;
  • inventory_*: chimiro chitsva (MSI - Multi Source Inventory);

Iwe unofanirwa kuwedzera data yezvinyorwa kune zvese zvimiro, nekuti chimiro chitsva hachisati chakazvimirira zvachose pane chekare (zvingangoitika kuti zve default warehouse muchimiro chitsva tafura inobatanidzwa cataloginventory_stock_status sezvo inventory_stock_1).

bhuku remabhuku_

Kana tichiendesa Magneto 2.3 isu pakutanga tine 2 ekupinda mukati store_website, iyo inoenderana nenzvimbo mbiri - administrative uye main client:

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

Tafura cataloginventory_stock isu tinongopinda imwe chete:

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

Kureva, muchimiro chedu chekare pane imwe chete "dura" (stock) uye yakabatana kune webhusaiti webhusaiti. Kuwedzera zvitsva kuburikidza ne admin panel sources/stocks muMSI (chimiro chitsva) hachikonzeri manyorerwo matsva mukati cataloginventory_stock.

Inventory data nezve zvigadzirwa muchimiro chekare chinotanga kunyorwa mumatafura:

  • 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_

Pakutanga, chimiro chitsva chekuchengeta data rezvinyorwa chine 1 "tsime"(inventory_source):

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

uye mumwe"imba yekuchengetera"(inventory_stock):

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

Β«ChinhuΒ» inomiririra kuchengetwa kwenyama yezvigadzirwa (rekodhi rine maratidziro emuviri uye kero yekutumira). "Imba yekuchengetera"mubatanidzwa une musoro we "zvitubu" zvakawanda (inventory_source_stock_link)

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

pamwero wekubatanidza kuchiteshi chekutengesa kunoitika (inventory_stock_sales_channel)

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

Tichitarisa nechimiro chedata, mhando dzakasiyana dzekutengesa nzira dzinofungidzirwa, asi nekusarudzika chete kubatana "unganidza"-"Website"(chinongedzo chewebhusaiti chinotevera kodhi webhusaiti - base).

Poshi "imba yekuchengetera"inogona kubatanidzwa kune dzakawanda"zvinyorwa"uye mumwe"tsime"- kune dzakawanda"matura"(vakawanda-kune-vakawanda hukama). Izvo zvinosiya ndezve default "tsime"Uye"imba yekuchengetera". Izvo hazvina kubatanidzwazve kune mamwe masangano (kugumira padanho rekodhi - kukanganisa "Haikwanise kuchengetedza chinongedzo chine chekuita neDefault Source kana Default Stock"). Mamwe ruzivo nezve MSI chimiro muMagento 2 inogona kuwanikwa muchinyorwa "Warehouse management system uchishandisa CQRS uye Chiitiko Sourcing. Design".

Ini ndichashandisa iyo yekumisikidza yekumisikidza uye nekuwedzera ruzivo rwese rwezvinyorwa kune sosi default, iyo inobatanidzwa muchiteshi chekutengesa chakabatana newebsite ine code base (inoenderana nechekumberi kwechitoro - ona 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);
}

Mushure mekuwedzera data rekuverenga kune chigadzirwa mune admin panel, unowana uyu mufananidzo:

Magento 2: pinza zvigadzirwa zvakananga mudhatabhesi

Media

Kana "nemaoko" uchiwedzera mufananidzo kune chigadzirwa kuburikidza nepaneru ye admin, ruzivo rwakakodzera rwunonyorwa pasi mumatafura anotevera:

  • catalog_product_entity_media_gallery: media registry (mifananidzo uye vhidhiyo mafaera);
  • catalog_product_entity_media_gallery_value: kubatanidza midhiya kune zvigadzirwa uye showcases (localization);
  • catalog_product_entity_media_gallery_value_to_entity: kubatanidza midhiya kune zvigadzirwa chete (zvichida default midhiya zvemukati zvechigadzirwa);
  • catalog_product_entity_varchar: Mabasa ayo mufananidzo unoshandiswa akachengetwa pano;

uye iyo mifananidzo pachayo inochengetwa kune dhairekitori ./pub/media/catalog/product/x/y/kupi x ΠΈ y - mabhii ekutanga neechipiri ezita refaira remufananidzo. Somuenzaniso, faira image.png inofanira kuponeswa se ./pub/media/catalog/product/i/m/image.png, kuitira kuti puratifomu inogona kuishandisa semufananidzo kana ichitsanangura zvigadzirwa kubva kukhathalogi.

Register yakatumirwa mukati ./pub/media/catalog/product/ media faira (maitiro ekuisa iyo faira pachayo haana kukurukurwa munyaya ino):

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

Kana yakanyoreswa, faira idzva remidhiya rinopihwa chiziviso.

Isu tinosanganisa iyo yakanyoreswa midhiya faira nechigadzirwa chinoenderana cheyekutanga chitoro chepamberi:

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

Isu tinosanganisa iyo yakanyoreswa midhiya faira nechigadzirwa chinoenderana pasina kusungirirwa kune chero kumberi kwechitoro. Hazvisi pachena kuti ndeipi chaiyo data iyi inoshandiswa uye nei zvisingabviri kuwana data kubva patafura yapfuura, asi tafura iyi iripo uye data inonyorerwa iyo kana mufananidzo wakawedzerwa kune chigadzirwa. Saka ndizvozvo.

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

Midhiya faira inogona kushandiswa nemabasa akasiyana (iyo inoenderana hunhu kodhi inoratidzwa mumaparentheses):

  • Base (image)
  • Mufananidzo mudiki (small_image)
  • Thumbnail (thumbnail)
  • Swatch Mufananidzo (swatch_image)

Kubatanidza mabasa kune media faira ndizvo chaizvo zvinoitika mukati catalog_product_entity_varchar. Kodhi yekusungirira yakafanana nekodhi iri mu "Basic chigadzirwa hunhu".

Mushure mekuwedzera mufananidzo kune chigadzirwa mune admin panel inoita seizvi:

Magento 2: pinza zvigadzirwa zvakananga mudhatabhesi

Zvikwata

Matafura makuru ane data nechikamu:

  • catalog_category_entity: rejista yezvikamu;
  • catalog_category_product: kubatana pakati pezvigadzirwa nemapoka;
  • catalog_category_entity_*: EAV hunhu hutsika;

Pakutanga, mune isina chinhu Magento application, iyo chikamu registry ine 2 zvikamu (Ndakapfupisa mazita emakoramu: 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|

Chikamu chine id = 1 ndiwo mudzi weMagento katalogi yese uye haiwanikwe mupaneru ye admin kana papeji yekutanga. Chikamu chine id=2 (Default Category) ndiyo midzi yemudzi wechitoro chikuru chesaiti (Main Website Store) yakagadzirwa kana application yaiswa (ona. Admin / Zvitoro / Zvese Zvitoro) Uyezve, iyo midzi yechitoro pachayo haiwanikwe kumberi, chete zvikamu zvayo.

Sezvo musoro wechinyorwa ichi uchiri kupinza dhata pane zvigadzirwa, ini handisi kuzoshandisa zvakananga kupinda mudhatabhesi pakugadzira zvikamu, asi ndichashandisa makirasi akapihwa naMagento pachayo (mienzaniso uye repositori). Kupinda kwakananga mudhatabhesi kunoshandiswa chete kubatanidza chigadzirwa chinotengeswa kunze kwenyika nechikamu (chikamu chinofananidzwa nezita rayo, uye chikamu id chinotorwa panguva yekufananidza):

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

Mushure mekuwedzera chinongedzo chechigadzirwa kumapoka "Chikamu 1" uye "Chikamu 2", zvinyorwa zvechigadzirwa mupaneru ye admin zvinotaridzika seizvi:

Magento 2: pinza zvigadzirwa zvakananga mudhatabhesi

Zvimwe Zviitiko

Kana kupinza data kwapera, unofanirwa kupedzisa anotevera matanho ekuwedzera:

  • data indexing: kufona mukoni ./bin/magento indexer:reindex;
  • kuvandudza maURL ezvigadzirwa / mapoka: unogona kushandisa kuwedzera "elgentos/regenerate-catalog-urlsΒ«

Zvigadzirwa mupaneru ye admin mushure mekuita zvimwe zviito:

Magento 2: pinza zvigadzirwa zvakananga mudhatabhesi

uye mberi:

Magento 2: pinza zvigadzirwa zvakananga mudhatabhesi

Summary

Iyo imwechete seti yezvigadzirwa (10 zvimedu) sezviri muchinyorwa chakapfuura zvinotengeswa kunze kwenyika kanenge kurongeka kwehukuru nekukurumidza (1 sekondi maringe negumi). Kuti unyatso kufungidzira kumhanya, unoda huwandu hukuru hwezvigadzirwa - mazana akati wandei, kana zviri nani asi zviuru. Nekudaro, kunyangwe neiyo diki saizi yedata rekuisa, tinogona kugumisa kuti kushandiswa kwezvishandiso zvakapihwa naMagento (mienzaniso uye repositori) kwakakosha (ini ndinosimbisa - zvikuru!) kukurumidzira kukura kwekushanda kunodiwa, asi panguva imwechete zvakanyanya (ini ndinosimbisa - zvikuru!) kuderedza kukurumidza iyo data inopinda mu database.

Nekuda kweizvozvo, mvura yakashanduka kuve yakanyorova uye ichi hachisi chizaruro. Nekudaro, ikozvino ndine kodhi yekutamba nayo uye pamwe ndiuye kune dzimwe dzinonakidza mhedziso.

Source: www.habr.com