I-Magento 2: ngenisa imikhiqizo ngqo kusizindalwazi

Π’ isihloko esandulele Ngichaze inqubo yokungenisa imikhiqizo ku-Magento 2 ngendlela evamile - ngamamodeli namakhosombe. Indlela evamile inejubane eliphansi kakhulu lokucubungula idatha. I-laptop yami ibikhiqiza cishe umkhiqizo owodwa ngomzuzwana. Kulokhu kuqhubeka, ngibheka enye indlela yokungenisa umkhiqizo - ngokungena ngokuqondile ku-database, ngokudlula izindlela ezijwayelekile ze-Magento 2 (amamodeli, izimboni, izindawo zokugcina). Ukulandelana kwezinyathelo zokungenisa imikhiqizo kungashintshwa kunoma yiluphi ulimi lokuhlela olungasebenza ne-MySQL.

Disclaimer: I-Magento inomsebenzi osewenzelwe ukungenisa idatha futhi, cishe, kuzokwanela kuwe. Nokho, uma udinga ukulawula okuphelele phezu kwenqubo yokungenisa, okungagcini nje ngokulungiselela ifayela le-CSV lalokho onakho, wamukelekile ekati.

I-Magento 2: ngenisa imikhiqizo ngqo kusizindalwazi

Ikhodi ewumphumela wokubhala zombili izindatshana ingabonwa kumojula ye-Magento "flancer32/mage2_ext_demo_import". Nansi eminye imikhawulo engiyilandele ukwenza lula ikhodi yemojuli yedemo:

  • Imikhiqizo idalwe kuphela, ayibuyekeziwe.
  • I-warehouse eyodwa
  • Amagama ezigaba kuphela angenisiwe, ngaphandle kwesakhiwo sawo
  • Izakhiwo zedatha zihambisana nenguqulo 2.3

I-JSON yokungenisa umkhiqizo owodwa:

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

Uhlolojikelele lwezigaba eziyinhloko zokungenisa

  • ukubhaliswa komkhiqizo ngokwawo
  • ukuxhumana phakathi komkhiqizo newebhusayithi
  • izibaluli zomkhiqizo eziyisisekelo (EAV)
  • idatha yokusungula (inani lomkhiqizo osesitokweni)
  • imidiya (izithombe)
  • ukuxhumana nezigaba zekhathalogi

Ukubhaliswa Komkhiqizo

Ulwazi oluyisisekelo lomkhiqizo lungatholakala ku 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`)
)

Ulwazi oluncane oludingekayo ukuze udale okufakiwe kurejista yomkhiqizo yileli:

  • attribute_set_id
  • sku

okwengeziwe:

  • type_id - uma singakucacisi, kuzosetshenziswa 'okulula'

Ukubhala ngqo ku-database, ngisebenzisa i-adaptha ye-DB ye-Magento ngokwayo:

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

Ngemva kokubhalisa umkhiqizo nge catalog_product_entity ibonakala kuphaneli yomqondisi, kugridi yomkhiqizo (Ikhathalogi/Imikhiqizo).

I-Magento 2: ngenisa imikhiqizo ngqo kusizindalwazi

Ubudlelwano phakathi komkhiqizo newebhusayithi

Ukuhlotshaniswa komkhiqizo nesayithi kunquma ukuthi yiziphi izitolo kanye nokuboniswa komkhiqizo ozotholakala ngaphambili.

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

I-Magento 2: ngenisa imikhiqizo ngqo kusizindalwazi

Izibaluli zomkhiqizo eziyisisekelo

Umkhiqizo osanda kubhaliswa awukabi nalo igama noma incazelo. Konke lokhu kwenziwa Izici ze-EAV. Nalu uhlu lwezibaluli zomkhiqizo eziyisisekelo ezidingekayo ukuze umkhiqizo uboniswe kahle ngaphambili:

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

Isibaluli esihlukile siyengezwa kumkhiqizo ofana nalo (imininingwane yokuthola isihlonzi kanye nohlobo lwesibaluli esisuka kukhodi yaso ayifakiwe):

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

Ngokusebenzisa ikhodi yesibaluli, sinquma i-id yayo kanye nohlobo lwedatha (datetime, decimal, int, text, varchar), bese ubhala idatha yewindi lokuphatha kuthebula elifanele (store_id = 0).

Ngemva kokwengeza izibaluli ezingenhla emkhiqizweni, uthola lesi sithombe kuphaneli yomqondisi:

I-Magento 2: ngenisa imikhiqizo ngqo kusizindalwazi

Idatha yokusungula

Kusukela kunguqulo 2.3 ku-Magento, kukhona amasethi amabili ahambisanayo amathebula ahlinzeka ngokugcinwa kolwazi lwe-inventory (inani lomkhiqizo):

  • cataloginventory_*: isakhiwo esidala;
  • inventory_*: isakhiwo esisha (MSI - Multi Source Inventory);

Udinga ukungeza idatha yokusungula kuzo zombili izakhiwo, ngoba isakhiwo esisha asikazimele ngokuphelele kwesindala (kungenzeka ukuthi ngenxa default ishede esakhiweni esisha itafula liyabandakanyeka cataloginventory_stock_status njengoba inventory_stock_1).

uhlu lwezinto_

Lapho sisebenzisa i-Magneto 2.3 ekuqaleni sinokungenela okungu-2 store_website, ehambisana namasayithi amabili - iklayenti lokuphatha nelikhulu:

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

Ithebula cataloginventory_stock sinokufaka okukodwa kuphela:

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

Okusho ukuthi, esakhiweni sethu esidala kukhona β€œinqolobane” eyodwa kuphela (stock) futhi ixhunywe kuwebhusayithi yokuphatha. Yengeza ezintsha ngephaneli yomqondisi sources/stocks ku-MSI (isakhiwo esisha) asibangeli okufakiwe okusha cataloginventory_stock.

Idatha yokusungula mayelana nemikhiqizo esakhiweni esidala irekhodwa ekuqaleni kumathebula:

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

Ekuqaleni, isakhiwo esisha sokugcina idatha ye-inventory iqukethe 1 "umthombo"(inventory_source):

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

kanye noyedwa"igumbi lokugcina impahla"(inventory_stock):

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

Β«UmthomboΒ» imele indawo yokugcina impahla yemikhiqizo (irekhodi liqukethe izixhumanisi ezibonakalayo kanye nekheli lokuposa). "Indawo yokugcina impahla"inhlangano enengqondo "yemithombo" eminingana (inventory_source_stock_link)

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

ezingeni lapho uxhumano lwesiteshi sokuthengisa lwenzeka ngalo (inventory_stock_sales_channel)

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

Uma sibheka isakhiwo sedatha, izinhlobo ezahlukene zeziteshi zokuthengisa ziyacatshangelwa, kodwa ngokuzenzakalelayo kuphela uxhumano "isitokweΒ«-Β»iwebhusayithi"(isixhumanisi sewebhusayithi silandela ikhodi yewebhusayithi - base).

Omunye"igumbi lokugcina impahla"ingaxhunyaniswa nezimbalwa"imithombo"kanye"umthombo"- kuya eziningana"izindawo zokugcina izimpahla"(ubudlelwane obuningi kuya kwabaningi). Okuhlukile kungokwakhona "umthombo"Futhi"igumbi lokugcina impahla". Azixhunywanga kabusha kwezinye izinhlangano (umkhawulo ezingeni lekhodi - iphutha "Ayikwazi ukulondoloza isixhumanisi esihlobene Nomthombo Ozenzakalelayo noma Isitoko Esimisiwe"). Imininingwane eyengeziwe mayelana nesakhiwo se-MSI ku-Magento 2 ingatholakala esihlokweni esithi "Uhlelo lokuphatha i-warehouse esebenzisa i-CQRS kanye ne-Event Sourcing. Idizayini".

Ngizosebenzisa ukucushwa okuzenzakalelayo futhi ngengeze lonke ulwazi lwe-inventory emthonjeni default, ebandakanyeka esiteshini sokuthengisa esihlotshaniswa newebhusayithi enekhodi base (ihambisana nesiphetho esingaphambili sesitolo - bheka 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);
}

Ngemva kokungeza idatha yokusungula kumkhiqizo kuphaneli yomqondisi, uthola lesi sithombe:

I-Magento 2: ngenisa imikhiqizo ngqo kusizindalwazi

Abezindaba

Uma "ngesandla" wengeza isithombe emkhiqizweni ngephaneli yokulawula, ulwazi olufanele lubhalwa phansi kumathebula alandelayo:

  • catalog_product_entity_media_gallery: ukubhaliswa kwemidiya (izithombe namafayela wevidiyo);
  • catalog_product_entity_media_gallery_value: ukuxhumanisa imidiya nemikhiqizo nemibukiso (ukwenziwa kwendawo);
  • catalog_product_entity_media_gallery_value_to_entity: ukuxhumanisa imidiya nemikhiqizo kuphela (okuqukethwe kwemidiya okuzenzakalelayo komkhiqizo);
  • catalog_product_entity_varchar: Izindima lapho isithombe sisetshenziswa khona zigcinwa lapha;

futhi izithombe ngokwazo zigcinwa kuhlu lwemibhalo ./pub/media/catalog/product/x/y/kuphi x ΠΈ y β€” uhlamvu lokuqala nolwesibili lwegama lefayela lesithombe. Ngokwesibonelo, ifayela image.png kufanele igcinwe njenge ./pub/media/catalog/product/i/m/image.png, ukuze inkundla ikwazi ukuyisebenzisa njengesithombe lapho ichaza imikhiqizo evela kukhathalogi.

Irejista ifakwe ./pub/media/catalog/product/ ifayela lemidiya (inqubo yokubeka ifayela ngokwayo ayixoxwanga kulesi sihloko):

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

Uma ubhalisiwe, ifayela elisha lemidiya linikezwa isihlonzi.

Sihlobanisa ifayela lemidiya elibhalisiwe nomkhiqizo ohambisanayo wangaphambili kwesitolo esizenzakalelayo:

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

Sihlobanisa ifayela lemidiya elibhalisiwe nomkhiqizo ohambisanayo ngaphandle kokuboshelwa kunoma yisiphi isitolo sangaphambili. Akucaci ukuthi le datha isetshenziswa kuphi ngempela nokuthi kungani kungenakwenzeka ukufinyelela idatha kusuka kuthebula langaphambilini, kodwa leli thebula likhona futhi idatha ibhalwa kulo uma isithombe sengezwe kumkhiqizo. Ngakho-ke kunjalo.

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

ikhathalogi_product_entity_varchar

Ifayela lemidiya lingasetshenziswa ngezindima ezihlukene (ikhodi yesibaluli ehambisanayo ikhonjiswe kubakaki):

  • Isisekelo(image)
  • Isithombe Esincane (small_image)
  • Isithonjana (thumbnail)
  • Swatch Isithombe (swatch_image)

Ukuxhumanisa izindima kufayela lemidiya yilokho kanye okwenzeka kulo catalog_product_entity_varchar. Ikhodi yokubopha iyafana nekhodi eku-"Izibaluli zomkhiqizo eziyisisekelo".

Ngemva kokwengeza isithombe kumkhiqizo kuphaneli yomqondisi kubukeka kanje:

I-Magento 2: ngenisa imikhiqizo ngqo kusizindalwazi

Isigaba

Amathebula amakhulu aqukethe idatha ngesigaba:

  • catalog_category_entity: irejista yezigaba;
  • catalog_category_product: ukuxhumana phakathi kwemikhiqizo nezigaba;
  • catalog_category_entity_*: Amanani wesibaluli se-EAV;

Ekuqaleni, kuhlelo lokusebenza lwe-Magento olungenalutho, ukubhaliswa kwesigaba kuqukethe izigaba ezi-2 (Ngifinyeze amagama ekholomu: 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|

Isigaba esino-id=1 siyimpande yayo yonke ikhathalogi ye-Magento futhi asitholakali kuphaneli yokuphatha noma ekhasini elingaphambili. Isigaba esino-id=2 (Isigaba esizenzakalelayo) yisigaba esiyimpande sesitolo esikhulu sesayithi (Isitolo Sewebhusayithi Esikhulu) adalwe lapho uhlelo lusetshenziswa (bona. Umlawuli / Izitolo / Zonke Izitolo). Ngaphezu kwalokho, isigaba sempande yesitolo ngokwaso asitholakali ngaphambili, kuphela izigaba zayo ezingaphansi.

Njengoba isihloko salesi sihloko sisangenisa idatha emikhiqizweni, ngeke ngisebenzise ukungena okuqondile ku-database lapho ngidala izigaba, kodwa ngizosebenzisa amakilasi anikezwe i-Magento ngokwayo (amamodeli namakhosombe). Ukungena okuqondile kusizindalwazi kusetshenziswa kuphela ukuhlobanisa umkhiqizo ongenisiwe nesigaba (isigaba sifaniswa negama laso, futhi i-id yesigaba iyabuyiswa ngesikhathi sokufanisa):

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

Ngemva kokwengeza isixhumanisi somkhiqizo ezigabeni "Isigaba 1" kanye "Nesigaba 2", imininingwane yomkhiqizo kuphaneli yokulawula ibukeka kanjena:

I-Magento 2: ngenisa imikhiqizo ngqo kusizindalwazi

Izenzo ezengeziwe

Uma ukungeniswa kwedatha sekuqediwe, udinga ukuqedela izinyathelo ezengeziwe ezilandelayo:

  • idatha indexing: shayela ikhonsoli ./bin/magento indexer:reindex;
  • ukukhiqiza kabusha ama-URL emikhiqizo/izigaba: ungasebenzisa isandiso β€œelgentos/regenerate-catalog-urlsΒ«

Imikhiqizo kuphaneli yomqondisi ngemva kokwenza izenzo ezengeziwe:

I-Magento 2: ngenisa imikhiqizo ngqo kusizindalwazi

futhi ngaphambili:

I-Magento 2: ngenisa imikhiqizo ngqo kusizindalwazi

Isifingqo

Isethi efanayo yemikhiqizo (izingcezu eziyi-10) njengaku-athikili esandulele ingenisiwe okungenani i-oda lobukhulu ngokushesha (isekhondi eli-1 liqhathaniswa ne-10). Ukuze ulinganise ngokunembe kakhudlwana ijubane, udinga inombolo enkulu yemikhiqizo - amakhulu amaningana, noma izinkulungwane ezingcono kakhulu. Kodwa-ke, ngisho nosayizi omncane kangaka wedatha yokufaka, singaphetha ngokuthi ukusetshenziswa kwamathuluzi anikezwe i-Magento (amamodeli namakhosombe) kubalulekile (ngiyagcizelela - kakhulu!) sheshisa ukuthuthukiswa komsebenzi odingekayo, kodwa ngesikhathi esifanayo ngokuphawulekayo (ngigcizelela - kakhulu!) yehlisa isivinini idatha engena ngaso kusizindalwazi.

Ngenxa yalokho, amanzi aphenduka aba manzi futhi lokhu akusona isambulo. Kodwa-ke, manje nginekhodi engingadlala ngayo futhi mhlawumbe ngifinyelele eziphethweni ezithakazelisayo kakhulu.

Source: www.habr.com