Magento 2: kenya lihlahisoa ka kotloloho ho database

В sehlooho se fetileng Ke hlalositse ts'ebetso ea ho kenya lihlahisoa ho Magento 2 ka mokhoa o tloaelehileng - ka mehlala le polokelo. Mokhoa o tloaelehileng o na le lebelo le tlase haholo la ts'ebetso ea data. Laptop ea ka e ne e hlahisa sehlahisoa se le seng ka motsotsoana. Ts'ebetsong ena, ke nahana ka mokhoa o mong oa ho kenya sehlahisoa - ka ho kena ka kotloloho ho database, ho feta mekhoa e tloaelehileng ea Magento 2 (mehlala, lifeme, polokelo ea polokelo). Tatelano ea mehato ea ho kenya lihlahisoa e ka fetoloa ho puo leha e le efe ea lenaneo e ka sebetsang le MySQL.

ikgololo: Magento e na le ts'ebetso e lokiselitsoeng bakeng sa ho kenya data 'me, ho ka etsahala hore ebe, ho tla lekana bakeng sa hau. Leha ho le joalo, haeba u hloka taolo e felletseng holim'a ts'ebetso ea ho reka kantle ho naha, eseng feela ho lokisa faele ea CSV bakeng sa seo u nang le sona, amohela katse.

Magento 2: kenya lihlahisoa ka kotloloho ho database

Khoutu e hlahisoang ke ho ngola lingoliloeng ka bobeli e ka bonoa ho module ea Magento "flancer32/mage2_ext_demo_import". Mona ke lithibelo tseo ke li latileng ho nolofatsa khoutu ea mojule oa demo:

  • Lihlahisoa li etsoa feela, ha li ntlafatsoe.
  • Sebaka se le seng sa polokelo
  • Ke mabitso a lihlopha feela a romelloang kantle ho naha, ntle le sebopeho sa ona
  • Mehaho ea data e lumellana le mofuta oa 2.3

JSON bakeng sa ho kenya sehlahisoa se le seng:

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

Kakaretso ea mekhahlelo e meholo ea ho kenya

  • ngodiso ya sehlahiswa ka bosona
  • khokahano lipakeng tsa sehlahisoa le webosaete
  • lintlha tsa mantlha tsa sehlahisoa (EAV)
  • Lintlha tsa thepa (bongata ba sehlahisoa se setokong)
  • media (litšoantšo)
  • khokahano le lihlopha tsa lethathamo

Ngoliso ea Lihlahisoa

Lintlha tsa mantlha tsa sehlahisoa li ka fumanoa ho 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`)
)

Boitsebiso bo fokolang bo hlokehang ho etsa keno ho registry ea lihlahisoa ke:

  • attribute_set_id
  • sku

tlatsetso:

  • type_id - haeba re sa e hlakise, ho tla sebelisoa 'bonolo'

Ho ngola ka kotloloho ho database, ke sebelisa adaptara ea DB ea Magento ka boeona:

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

Ka mor'a ho ngolisa sehlahisoa ka catalog_product_entity e bonahala ho phanele ea admin, ho grid ea sehlahisoa (Catalog/Lihlahisoa).

Magento 2: kenya lihlahisoa ka kotloloho ho database

Kamano lipakeng tsa sehlahisoa le webosaete

Kamano ea sehlahisoa le sebaka sa marang-rang e etsa qeto ea hore na ke mabenkele afe le lipontšo tseo sehlahisoa se tla fumaneha ka pele.

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: kenya lihlahisoa ka kotloloho ho database

Litšobotsi tsa mantlha tsa sehlahisoa

Sehlahisoa se sa tsoa ngolisoa ha se na lebitso kapa tlhaloso. Sena sohle se etsoa ka letsoho Litšobotsi tsa EAV. Mona ke lethathamo la litšoaneleho tsa mantlha tsa sehlahisoa tse hlokahalang e le hore sehlahisoa se ka hlahisoa ka nepo ka pele:

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

Sehlahisoa se kang sena se eketsoa tšobotsi e fapaneng (lintlha tsa ho fumana sekhetho le mofuta oa semelo ho tsoa ho khoutu ea sona li siiloe):

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

Re sebelisa khoutu ea semelo, re khetha id le mofuta oa data (datetime, decimal, int, text, varchar), ebe u ngola lintlha tsa fensetere ea tsamaiso tafoleng e nepahetseng (store_id = 0).

Kamora ho kenyelletsa litšoaneleho tse kaholimo ho sehlahisoa, o fumana setšoantšo sena phanele ea admin:

Magento 2: kenya lihlahisoa ka kotloloho ho database

Lintlha tsa thepa

Ho tloha ho mofuta oa 2.3 ho Magento, ho na le litafole tse peli tse tšoanang tse fanang ka polokelo ea tlhaiso-leseling ea thepa (palo ea sehlahisoa):

  • cataloginventory_*: sebopeho sa khale;
  • inventory_*: sebopeho se secha (MSI - Multi Source Inventory);

U hloka ho eketsa lintlha tsa thepa ho mehaho ka bobeli, hobane sebopeho se secha ha se e-so ikemele ka ho feletseng ho sa khale (ho ka etsahala hore bakeng sa default setsing sa polokelo mohahong o mocha tafole e ameha cataloginventory_stock_status joalo ka inventory_stock_1).

lethathamo la thepa_

Ha re tsamaisa Magneto 2.3 qalong re na le likenyelletso tse 2 ho store_website, e tsamaellanang le libaka tse peli - tsamaiso le moreki ea ka sehloohong:

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

Tafole cataloginventory_stock re na le keno e le 'ngoe feela:

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

Ke hore, mohahong oa rona oa khale ho na le "sebaka sa polokelo" se le seng feela (stock) mme e hokahane le webosaete ea tsamaiso. Ho eketsa tse ncha ka phanele ea admin sources/stocks ho MSI (sebopeho se secha) ha se hlahise likhakanyo tse ncha cataloginventory_stock.

Lintlha tsa thepa mabapi le lihlahisoa tsa sebopeho sa khale li qala ho rekotoa litafoleng:

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

Qalong, sebopeho se secha sa ho boloka boitsebiso ba thepa se na le 1 ".mohloli"(inventory_source):

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

le e mong"ntlo ea polokelo"(inventory_stock):

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

«Mohloli»e emela polokelo ea lihlahisoa tsa lihlahisoa (rekoto e na le likhokahano tsa 'mele le aterese ea poso). "Ntlo ea polokelo"ke kopano e utloahalang ea" mehloli e 'maloa (inventory_source_stock_link)

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

boemong boo khokahanyo ea kanale ea thekiso e etsahalang (inventory_stock_sales_channel)

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

Ho latela sebopeho sa data, ho nahanoa mefuta e fapaneng ea liteishene tsa thekiso, empa ka boiketsetso ke khokahano feela "Stock"-"websaeteng"( sehokelo sa sebaka sa Marang-rang se latela khoutu ea sebaka sa Marang-rang - base).

One"ntlo ea polokelo"e ka amahanngoa le tse 'maloa"mehloli"mme e mong"mohloli"- ho tse 'maloa"matlo a polokelo"(kamano ea ba bangata ho ea ho ba bangata). Mekhelo ke ea kamehla "mohloli"Le"ntlo ea polokelo". Ha li hokahane hape le mekhatlo e meng (moeli boemong ba khoutu - phoso "Ha e khone ho boloka sehokelo se amanang le Mohloli oa Kamehla kapa Setoko sa Kamehla"). Lintlha tse ling mabapi le sebopeho sa MSI ho Magento 2 li ka fumanoa sehloohong "Sistimi ea taolo ea polokelo ea thepa e sebelisang CQRS le Event Sourcing. Moralo".

Ke tla sebelisa tlhophiso ea kamehla mme ke kenye lintlha tsohle tsa lethathamo mohloling default, e amehang mocha oa thekiso o amanang le sebaka sa marang-rang se nang le khoutu base (e tsamaellana le pheletso e ka pele ea lebenkele - bona 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);
}

Kamora ho eketsa lintlha tsa thepa ho sehlahisoa ho phanele ea admin, o fumana setšoantšo sena:

Magento 2: kenya lihlahisoa ka kotloloho ho database

Litaba

Ha "ka letsoho" o kenya setšoantšo ho sehlahisoa ka phanele ea tsamaiso, lintlha tse amehang li ngoloa ka har'a litafole tse latelang:

  • catalog_product_entity_media_gallery: ngoliso ea mecha ea litaba (litšoantšo le lifaele tsa video);
  • catalog_product_entity_media_gallery_value: ho hokahanya mecha ea litaba le lihlahisoa le li-showcases (localization);
  • catalog_product_entity_media_gallery_value_to_entity: ho hokahanya mecha ea litaba le lihlahisoa feela (ho ka etsahala hore ebe litaba tsa media tse sa fetoheng bakeng sa sehlahisoa);
  • catalog_product_entity_varchar: Mesebetsi eo setšoantšo se sebelisoang ho eona e bolokiloe mona;

'me litšoantšo ka botsona li bolokiloe bukeng ./pub/media/catalog/product/x/y/kae x и y — tlhaku ea pele le ea bobeli ea lebitso la faele ea setšoantšo. Ka mohlala, file image.png e lokela ho bolokoa joalo ka ./pub/media/catalog/product/i/m/image.png, e le hore sethala se ka se sebelisa e le setšoantšo ha se hlalosa lihlahisoa tse tsoang lethathamong la libuka.

Ngoliso e kentsoeng ho ./pub/media/catalog/product/ media file (mokhoa oa ho beha faele ka boeona ha o buuoe sehloohong sena):

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

Ha e ngolisitsoe, faele e ncha ea mecha ea litaba e abeloa sekhetho.

Re amahanya faele ea media e ngolisitsoeng le sehlahisoa se tsamaisanang le sebaka sa pele sa lebenkele:

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

Re amahanya faele ea media e ngolisitsoeng le sehlahisoa se tsamaisanang le eona ntle le ho tlamelloa lebenkeleng lefe kapa lefe. Ha ho hlake hore na hantle-ntle data ena e sebelisoa hokae le hore na ke hobane'ng ha ho ke ke ha khoneha ho fumana boitsebiso bo tsoang tafoleng e fetileng, empa tafole ena e teng 'me data e ngotsoe ho eona ha setšoantšo se eketsoa sehlahisoa. Ho joalo.

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

Faele ea media e ka sebelisoa ka likarolo tse fapaneng (khoutu ea tšobotsi e lumellanang e bonts'itsoe ka masakaneng):

  • Motheo (image)
  • Setšoantšo se senyenyane (small_image)
  • Setšoantšo se senyenyane (thumbnail)
  • Swatch Setšoantšo (swatch_image)

Ho hokahanya likarolo ho faele ea media ke sona hantle se etsahalang ho catalog_product_entity_varchar. Khoutu e tlamang e tšoana le khoutu e ho "Litšobotsi tsa mantlha tsa sehlahisoa".

Kamora ho eketsa setšoantšo ho sehlahisoa ho phanele ea admin e shebahala tjena:

Magento 2: kenya lihlahisoa ka kotloloho ho database

Lihlopha

Litafole tse kholo tse nang le lintlha ka lihlopha:

  • catalog_category_entity: rejisetara ea lihlopha;
  • catalog_category_product: kamano pakeng tsa lihlahisoa le lihlopha;
  • catalog_category_entity_*: Litšobotsi tsa boleng ba EAV;

Qalong, ts'ebelisong e se nang letho ea Magento, ngoliso ea sehlopha e na le mekhahlelo e 2 (ke khutsufalitse mabitso a kholomo: 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|

Sehlopha se nang le id=1 ke motso oa lethathamo lohle la Magento mme ha se fumanehe ka har'a phanele ea tsamaiso kapa leqepheng le ka pele. Sehlopha se nang le id=2 (Sehlopha sa kamehla) ke karolo ea motso bakeng sa lebenkele la mantlha la sebaka (Lebenkele le ka Sehloohong la Webosaete) e entsoeng ha kopo e sebelisoa (bona. Tsamaiso / Mabenkele / Mabenkele Tsohle). Ho feta moo, sehlopha sa motso oa lebenkele ka boeona le sona ha se fumanehe ka pele, ke likaroloana tsa sona feela.

Kaha sehlooho sa sehlooho sena se ntse se kenya lintlha ka lihlahisoa, nke ke ka sebelisa ho kena ka ho toba ho database ha ke theha lihlopha, empa ke tla sebelisa lihlopha tse fanoeng ke Magento ka boeona (mehlala le li-repositories). Ho kena ka kotloloho sebakeng sa polokelo ea litaba ho sebelisoa feela ho amahanya sehlahisoa se tsoang kantle ho naha le sehlopha (sehlopha se tsamaisana le lebitso la sona, 'me id ea sehlopha e khutlisoa nakong ea ho bapisa):

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

Kamora ho kenyelletsa sehokelo sa sehlahisoa ho mekhahlelo ea "Sehlopha sa 1" le "Sehlopha sa 2", lintlha tsa sehlahisoa phanele ea tsamaiso li shebahala tjena:

Magento 2: kenya lihlahisoa ka kotloloho ho database

Liketso tse ling

Hang ha tlhahiso ea data e phethiloe, u lokela ho tlatsa mehato e latelang:

  • data indexing: letsetsa ho console ./bin/magento indexer:reindex;
  • li-URL tse nchafatsang bakeng sa lihlahisoa / lihlopha: o ka sebelisa katoloso "elgentos/regenerate-catalog-urls«

Lihlahisoa ho phanele ea admin kamora ho etsa liketso tse ling:

Magento 2: kenya lihlahisoa ka kotloloho ho database

le ka pele:

Magento 2: kenya lihlahisoa ka kotloloho ho database

Kakaretso

Sehlopha se tšoanang sa lihlahisoa (likotoana tse 10) joalo ka sehloohong se fetileng se romelloa bonyane taelo ea boholo ka potlako (1 motsotsoana ho ea ho 10). Ho lekanya lebelo ka nepo, o hloka palo e kholoanyane ea lihlahisoa - makholo a 'maloa, kapa ho feta likete tse molemo. Leha ho le joalo, leha re na le lintlha tse nyane joalo tsa tlhahiso, re ka fihlela qeto ea hore ts'ebeliso ea lisebelisoa tse fanoeng ke Magento (mehlala le polokelo) ke ea bohlokoa (ke hatisa - haholo!) potlakisa nts'etsopele ea ts'ebetso e hlokahalang, empa ka nako e ts'oanang haholo (ke hatisa - haholo!) fokotsa lebelo leo data e kenang ho database.

Ka lebaka leo, metsi a ile a fetoha metsi 'me sena ha se tšenolo. Leha ho le joalo, joale ke na le khoutu eo nka bapalang ka eona mme mohlomong ke fihlele liqeto tse ling tse khahlisang.

Source: www.habr.com