Magento 2: si toos ah alaabta u soo geli kaydka

Π’ maqaal hore Waxaan ku tilmaamay habka soo dejinta alaabooyinka Magento 2 sida caadiga ah - iyada oo loo marayo moodooyinka iyo kaydinta. Habka caadiga ah wuxuu leeyahay xawaare farsamaynta xogta oo aad u hooseeya. Laptop-kaygu wuxuu soo saarayay qiyaastii hal badeeco ilbiriqsikii. Sii wadidan, waxaan tixgelinayaa hab kale oo lagu soo dejiyo badeecad - iyadoo si toos ah loo galo xogta xogta, iyada oo laga gudbayo hababka caadiga ah ee Magento 2 ( moodooyinka, warshadaha, kaydka). Taxanaha tillaabooyinka soo dejinta badeecadaha waxaa lagu waafajin karaa luqad kasta oo barnaamij ah oo la shaqayn karta MySQL.

Afeef: Magento waxa uu leeyahay shaqayn diyaarsan oo loogu talagalay soo dejinta xogta iyo, waxay u badan tahay, inay kugu filnaan doonto. Si kastaba ha noqotee, haddii aad u baahan tahay xakameyn dhammaystiran oo ku saabsan habka soo dejinta, oo aan ku xaddidnayn diyaarinta faylka CSV waxa aad haysato, ku soo dhawoow bisad.

Magento 2: si toos ah alaabta u soo geli kaydka

Koodhka ka soo baxa qoritaanka labada maqaal waxaa laga eegi karaa moduleka Magento"flancer32/mage2_ext_demo_import" Waa kuwan qaar ka mid ah xayiraadaha aan raacay si aan u fududeeyo koodhka moduleka demo:

  • Alaabooyinka waa la abuuray oo kaliya, lama cusboonaysiiyo.
  • Hal bakhaar
  • Magacyada qaybta kaliya ayaa la soo dhoofiyaa, iyada oo aan la hayn qaabdhismeedkooda
  • Qaab dhismeedka xogta ayaa raacaya nooca 2.3

JSON soo dejinta hal badeeco:

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

Dulmarka marxaladaha ugu muhiimsan ee soo dejinta

  • diiwaangelinta alaabta lafteeda
  • xiriirka ka dhexeeya alaabta iyo website-ka
  • Sifooyinka alaabta aasaasiga ah (EAV)
  • xogta alaabada (tirada alaabta kaydka ah)
  • warbaahinta (sawiro)
  • isku xirka qaybaha buugaagta

Diiwaangelinta Alaabta

Macluumaadka alaabta aasaasiga ah waxaa laga heli karaa gudaha 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`)
)

Macluumaadka ugu yar ee loo baahan yahay si loo abuuro gelitaanka diiwaanka alaabta waa:

  • attribute_set_id
  • sku

dheeraad ah:

  • type_id - haddii aynaan cayimin, markaa 'fudud' ayaa la isticmaali doonaa

Si aad si toos ah ugu qorto kaydka xogta, waxaan isticmaalaa adabtarada DB ee Magento lafteeda:

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 dib markii la diiwaan geliyo alaabta leh catalog_product_entity waxay ka dhex muuqan doontaa guddiga maamulka, shabaqyada alaabta (Catalog/Alaabooyinka).

Magento 2: si toos ah alaabta u soo geli kaydka

Xiriirka ka dhexeeya badeecada iyo mareegaha

Xiriirka badeecada iyo goobta ayaa go'aamisa bakhaarrada iyo bandhigyada alaabta laga heli karo xagga hore.

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: si toos ah alaabta u soo geli kaydka

Tilmaamaha alaabta aasaasiga ah

Alaabta cusub ee la diwaan galiyay wali ma laha magac ama sharaxaad. Waxaas oo dhan waa la sameeyaa Tilmaamaha EAV. Waa kuwan liiska sifooyinka aasaasiga ah ee loo baahan yahay si alaabta si sax ah loogu muujiyo dhinaca hore:

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

Sifo gaar ah ayaa lagu daraa badeecad sidan oo kale ah (faahfaahinta helitaanka aqoonsiga iyo nooca sifada koodkeeda waa laga saaray):

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

Isticmaalka summada sifada, waxaan go'aaminnaa id iyo nooca xogta (datetime, decimal, int, text, varchar), ka dibna ku qor xogta daaqada maamulka miiska ku habboon (store_id = 0).

Kadib markaad ku darto sifooyinka kore ee alaabta, waxaad sawirkan ka heleysaa guddiga maamulka:

Magento 2: si toos ah alaabta u soo geli kaydka

Xogta alaabada

Laga bilaabo nooca 2.3 ee Magento, waxaa jira laba jaantus oo isbarbar socda oo bixiya kaydinta macluumaadka alaabada (tirada alaabta):

  • cataloginventory_*: qaab dhismeed hore;
  • inventory_*: qaab-dhismeed cusub (MSI - Multi Source Inventory);

Waxaad u baahan tahay inaad ku darto xogta alaabada labada qaab, sababtoo ah Qaab dhismeedka cusub ayaan weli si buuxda uga madaxbannaanayn kii hore (waxay u badan tahay in default bakhaar ku yaal qaab dhismeedka cusub miis ayaa ku lug leh cataloginventory_stock_status sida inventory_stock_1).

kataloginventory_

Marka la daabulayo Magneto 2.3 waxaan marka hore haysanaa 2 gelis store_website, taas oo u dhiganta laba goobood - maamulka iyo macmiilka ugu weyn:

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

Miis cataloginventory_stock Waxaan leenahay hal gal oo kaliya:

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

Taasi waa, qaab-dhismeedkayagii hore waxaa ku yaal hal "bakhaar" oo keliya (stock) waxayna ku xidhan tahay mareegaha maamulka. Ku darida kuwa cusub iyada oo loo marayo guddiga maamulka sources/stocks MSI (qaab-dhismeedka cusub) ma keenayso gelitaan cusub cataloginventory_stock.

Xogta alaabada ee ku saabsan alaabtii qaabdhismeedkii hore ayaa markii hore lagu diiwaan geliyay shaxanka:

  • cataloginventory_stock_item
  • cataloginventory_stock_status

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

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

alaab_

Markii hore, qaab dhismeedka cusub ee kaydinta xogta alaabada ayaa ka kooban 1 "ilaha"(inventory_source):

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

iyo mid"bakhaar"(inventory_stock):

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

Β«XigashoΒ» waxay ka dhigan tahay kaydinta jirka ee alaabta (diwaanku wuxuu ka kooban yahay iskudubarid jireed iyo ciwaanka boostada). "Bakhaar"waa urur macquul ah oo ka kooban dhowr "ilo" (inventory_source_stock_link)

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

heerka uu xidhiidhka kanaalka iibku dhacayo (inventory_stock_sales_channel)

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

Marka la eego qaab dhismeedka xogta, noocyada kala duwan ee kanaalada iibka ayaa loo maleynayaa, laakiin asal ahaan kaliya xiriirka "stock"-"website"(isku xirka website-ku wuxuu raacayaa lambarka shabakada - base).

Mid"bakhaar"waxaa lagu xiri karaa dhowr"ilo"iyo mid"ilaha"- dhowr"bakhaarrada"(xidhiidh badan-ilaa-badan). Ka-reebitaanka ayaa ah mid aan caadi ahayn'ilaha"Iyo"bakhaar" Dib looguma xidhin hay'ado kale (xaddidaad heerka koodhka - qaladka "Ma kaydin karo isku xirka la xidhiidha Isha ugu horaysa ama kaydka ugu tala galay"). Faahfaahin dheeraad ah oo ku saabsan qaabka MSI ee Magento 2 waxaa laga heli karaa maqaalka "Nidaamka maaraynta bakhaarka iyadoo la adeegsanayo CQRS iyo Isha Dhacdada. NaqshadeyntaΒ«.

Waxaan isticmaali doonaa qaabeynta caadiga ah waxaanan ku dari doonaa dhammaan macluumaadka alaabada isha default, kaas oo ku lug leh kanaalka iibka ee la xidhiidha bogga internetka ee koodhka base (waxay la mid tahay dhamaadka hore ee dukaanka - eeg 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);
}

Kadib markaad ku darto xogta alaabada alaabta ku jirta gudiga maamulka, waxaad helaysaa sawirkan:

Magento 2: si toos ah alaabta u soo geli kaydka

Warbaahinta

Marka "gacan" lagu daro sawirka alaabta iyada oo loo marayo guddiga maamulka, macluumaadka la xiriira waxaa lagu qoraa jaantusyada soo socda:

  • catalog_product_entity_media_gallery: diiwaanka warbaahinta (sawirrada iyo faylasha fiidiyowga);
  • catalog_product_entity_media_gallery_value: isku xirka warbaahinta alaabada iyo bandhigyada (meelaynta);
  • catalog_product_entity_media_gallery_value_to_entity: ku xidhidhiyaha warbaahinta alaabada oo kaliya (waxa loo malaynayaa in ay saxaafaddu ka kooban tahay badeecada);
  • catalog_product_entity_varchar: Doorarka sawirka loo adeegsaday halkan ayaa lagu kaydiyaa;

sawirada laftoodana waxaa lagu kaydiyaa hagaha ./pub/media/catalog/product/x/y/halkaas oo x ΠΈ y - xarfaha koowaad iyo labaad ee magaca faylka sawirka. Tusaale ahaan, fayl image.png waa in la badbaadiyo sida ./pub/media/catalog/product/i/m/image.png, si ay madalku u isticmaali karto sawir ahaan marka la tilmaamayo alaabada buug-yaraha.

Isku diwaan gelinta lagu dhejiyay ./pub/media/catalog/product/ faylka warbaahinta (habka meelaynta faylka laftiisa lagama hadlin qodobkan):

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

Marka la diiwaan geliyo, fayl cusub oo warbaahin ah ayaa loo qoondeeyaa aqoonsi.

Waxaanu ku xidhxidhay faylka warbaahinta diiwaangashan iyo badeecada u dhiganta ee hore dukaanka caadiga ah:

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

Waxaanu ku xidhxidhnaa faylka warbaahinta ee diiwaangashan badeecada u dhiganta iyadoon lagu xidhin wax bakhaar ah. Ma cadda halka saxda ah ee xogtan laga isticmaalo iyo sababta aanay suurtogal u ahayn in xogta laga helo shaxda hore, laakiin shaxdani waa jirtaa oo xogta ayaa loo qoraa marka sawirka lagu daro alaabta. Markaa waa taas.

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

Faylka warbaahinta waxaa loo isticmaali karaa doorar kala duwan (koodka sifada u dhigma ayaa lagu muujiyey jaantusyada):

  • Saldhig (image)
  • Sawir yar (small_image)
  • thumbnail (thumbnail)
  • Sawirka Sawirkaswatch_image)

Ku xidhida doorarka faylka warbaahinta ayaa ah waxa ku dhaca catalog_product_entity_varchar. Koodhka xidhidu wuxuu la mid yahay koodka ku jira "Tilmaamaha alaabta aasaasiga ahΒ«.

Ka dib marka lagu daro sawirka alaabta ku jira guddiga maamulka waxay u egtahay sidan:

Magento 2: si toos ah alaabta u soo geli kaydka

Qaybaha

Jadwalka ugu muhiimsan ee ka kooban xog qayb ahaan:

  • catalog_category_entitydiiwaanka qaybaha;
  • catalog_category_product: xidhiidhka ka dhexeeya alaabta iyo qaybaha;
  • catalog_category_entity_*Qiimaha sifada EAV;

Markii hore, codsiga Magento ee madhan, diiwaanka qaybta waxa uu ka kooban yahay 2 qaybood (waxaan soo gaabiyey magacyada tiirka: 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|

Qaybta leh id=1 waa xididka dhammaan buuga Magento oo aan laga heli karin guddiga maamulka ama bogga hore. Qaybta leh id=2 (Qaybta asalka ah) waa qaybta asalka u ah dukaanka weyn ee goobta (Dukaanka Mareegaha Weyn) la sameeyay marka codsiga la geeyo (eeg. Maamulka / Dukaamada / Dhammaan Bakhaarada). Waxaa intaa dheer, qaybta asalka ah ee dukaanka laftiisa sidoo kale lagama heli karo xagga hore, kaliya qaybaha hoose.

Maadaama mawduuca maqaalkani uu wali soo dejinayo xogta alaabta, ma isticmaali doono gelitaanka tooska ah ee xogta marka la abuurayo qaybaha, laakiin waxaan isticmaali doonaa fasalada ay bixiso Magento lafteeda (qaababka iyo kaydka). Gelida tooska ah ee xogta xogta waxa kaliya oo loo adeegsadaa in lagu xidho badeecada la soo dejiyay qayb (qaybtu waxa ay la mid tahay magaceeda, iyo aqoonsiga qaybta waxa la soo saaray marka la isbarbardhigayo):

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

Ka dib marka lagu daro isku xirka badeecada qaybaha "Qaybta 1" iyo "Qaybta 2", faahfaahinta alaabta ee guddida maamulka waxay u egtahay sidan:

Magento 2: si toos ah alaabta u soo geli kaydka

Falalka dheeriga ah

Marka xogta soo dejinta la dhammeeyo, waxaad u baahan tahay inaad dhammaystirto tillaabooyinka dheeraadka ah ee soo socda:

Alaabooyinka ku jira guddiga maamulka ka dib marka la sameeyo ficillo dheeraad ah:

Magento 2: si toos ah alaabta u soo geli kaydka

dhanka horena:

Magento 2: si toos ah alaabta u soo geli kaydka

Soo koobid

Qalabka isku midka ah (10 xabbo) sida maqaalkii hore ayaa la soo dhoofiyaa ugu yaraan amar xawli ah (1 ilbiriqsi oo ka soo horjeeda 10). Si aad si sax ah u qiyaasto xawaaraha, waxaad u baahan tahay tiro badan oo badeecooyin ah - dhowr boqol, ama kumanaan ka sii fiican. Si kastaba ha ahaatee, xitaa iyada oo cabbirka yar ee xogta gelinta, waxaan ku soo gabagabeyn karnaa in isticmaalka qalabka ay bixiso Magento (moodooyinka iyo kaydinta) ay muhiim tahay (waxaan xoogga saarayaa - badan!) dedejiso horumarinta shaqada loo baahan yahay, laakiin isla mar ahaantaana si weyn (waxaan xooga saarayaa - badan!) Yaree xawaaraha ay xogtu ku gasho kaydka xogta.

Natiijo ahaan, biyihii waxay noqdeen kuwo qoyan, tanina maaha wax muujin. Si kastaba ha noqotee, hadda waxaan haystaa koodka aan ku ciyaaro waxaana laga yaabaa inaan imaado gabagabo xiiso badan.

Source: www.habr.com