I-Magento 2: ukungenisa iimveliso ngqo kwisiseko sedatha

Π’ inqaku elidlulileyo Ndachaza inkqubo yokungenisa iimveliso kwi-Magento 2 ngendlela eqhelekileyo - ngeemodeli kunye neendawo zokugcina. Indlela yesiqhelo inesantya esisezantsi kakhulu sokucwangcisa idatha. Ilaptop yam yayivelisa malunga nemveliso enye ngomzuzwana. Kule nkqubela, ndiqwalasela enye indlela yokungenisa imveliso - ngokungena ngokuthe ngqo kwi-database, ngokudlula iindlela eziqhelekileyo ze-Magento 2 (iimodeli, iifektri, iindawo zokugcina). Ukulandelelana kwamanyathelo okungenisa iimveliso kunokulungelelaniswa naluphi na ulwimi lwenkqubo olunokusebenza kunye ne-MySQL.

isikhanyeli: IMagento inemisebenzi esele yenziwe ukungenisa idatha kwaye, kunokwenzeka, kuya kukwanela. Nangona kunjalo, ukuba ufuna ulawulo olupheleleyo ngaphezulu kwenkqubo yokungenisa, engaphelelanga ekulungiseleleni ifayile ye-CSV yale nto unayo, wamkelekile kwikati.

I-Magento 2: ukungenisa iimveliso ngqo kwisiseko sedatha

Ikhowudi ephuma ekubhaleni omabini amanqaku inokujongwa kwimodyuli yeMagento "flancer32/mage2_ext_demo_import". Nazi ezinye izithintelo endizilandelayo ukwenza lula ikhowudi yemodyuli yedemo:

  • Iimveliso zenziwe kuphela, azihlaziywa.
  • Uvimba omnye
  • Amagama amacandelo kuphela angeniswa ngaphandle, ngaphandle kolwakhiwo lwawo
  • Ulwakhiwo lwedatha luthobela uguqulelo 2.3

I-JSON yokungenisa imveliso enye:

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

Isishwankathelo sezigaba eziphambili zokungenisa elizweni

  • ukubhaliswa kwemveliso ngokwayo
  • unxibelelwano phakathi kwemveliso kunye newebhusayithi
  • iimpawu zemveliso ezisisiseko (EAV)
  • idatha ye-inventri (ubungakanani bemveliso ekhoyo)
  • imidiya (imifanekiso)
  • unxibelelwano neendidi zekhathalogu

Ukubhaliswa kweMveliso

Ulwazi olusisiseko lwemveliso lunokufumaneka kwi 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`)
)

Olona lwazi luncinci lufunekayo ukwenza ingeniso kwirejistri yemveliso yile:

  • attribute_set_id
  • sku

ezongezelelweyo:

  • type_id β€” ukuba asiyichazi, kuya kusetyenziswa 'ilula'

Ukubhala ngokuthe ngqo kwisiseko sedatha, ndisebenzisa i-adapter yeDB yeMagento 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;
}

Emva kokubhalisa imveliso nge catalog_product_entity iyabonakala kwiqela lenjongo yolawulo, kwigridi yemveliso (Ikhathalogu/Iimveliso).

I-Magento 2: ukungenisa iimveliso ngqo kwisiseko sedatha

Ubudlelwane phakathi kwemveliso kunye newebhusayithi

Ukudityaniswa kwemveliso kunye nesiza kumisela ukuba zeziphi iivenkile kunye nokubonisa imveliso eya kufumaneka 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: ukungenisa iimveliso ngqo kwisiseko sedatha

Iimpawu zemveliso ezisisiseko

Imveliso entsha ebhalisiweyo ayikabi nalo igama okanye inkcazo. Konke oku kwenziwa nge Iimpawu ze-EAV. Nalu uluhlu lweempawu zemveliso ezisisiseko ezifunekayo ukuze imveliso iboniswe ngokuchanekileyo ngaphambili:

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

Uphawu loyelelwano olwahlukileyo longezwa kwimveliso efana nale (iinkcukacha zokufumana isiphawuli kunye nodidi lophawu loyelelwano olusuka kwikhowudi yalo azifakwanga):

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

Ukusebenzisa ikhowudi yophawu, simisela id yayo kunye nodidi lwedatha (datetime, decimal, int, text, varchar), ngoko bhala idata yefestile yolawulo kwitafile efanelekileyo (store_id = 0).

Emva kokongeza ezi mpawu zingasentla kwimveliso, ufumana lo mfanekiso kwiqela lolawulo:

I-Magento 2: ukungenisa iimveliso ngqo kwisiseko sedatha

Idatha yoluhlu

Ukuqala kwinguqulo ye-2.3 kwi-Magento, kukho iiseti ezimbini ezifanayo zeetheyibhile ezibonelela ngokugcinwa kolwazi lwe-inventory (ubuninzi bemveliso):

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

Kufuneka ungeze idatha ye-inventri kuzo zombini izakhiwo, kuba ulwakhiwo esitsha alukaxhomekeki ngokupheleleyo kwesi sidala (kunokwenzeka kakhulu ukuba default Isitora kwisakhiwo esitsha itafile ibandakanyeka cataloginventory_stock_status Njengoko inventory_stock_1).

uluhlu lwezinto_

Xa kuthunyelwa iMagneto 2.3 siqale sibe namangeno ama-2 store_website, ehambelana neziza ezimbini - ulawulo kunye nomxhasi oyintloko:

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

Itheyibhile cataloginventory_stock sinongeno olunye kuphela:

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

Oko kukuthi, kwisakhiwo sethu esidala kukho "indawo yokugcina" enye kuphela (stock) kwaye idityaniswe newebhusayithi yolawulo. Yongeza ezintsha ngendawo yolawulo sources/stocks kwi-MSI (isakhiwo esitsha) asibangeli amangeniso amatsha cataloginventory_stock.

Idatha yoluhlu malunga neemveliso kwisakhiwo esidala irekhodwa kuqala kwiitheyibhile:

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

uluhlu_

Ekuqaleni, isakhiwo esitsha sokugcina idatha ye-inventory iqulethe i-1 "umthombo"(inventory_source):

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

kwaye enye"igumbi lokugcina izinto"(inventory_stock):

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

Β«UmthomboΒ» imele ukugcinwa kwezinto eziphathekayo (irekhodi liqulethe ulungelelwaniso olubonakalayo kunye nedilesi yokuposa). "Indawo yokugcina"lumanyano olunengqiqo lwe "sources" ezininzi (inventory_source_stock_link)

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

kwinqanaba apho uqhagamshelo lomjelo wentengiso lwenzeka khona (inventory_stock_sales_channel)

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

Ngokujonga ubume bedatha, iintlobo ezahlukeneyo zamajelo okuthengisa acingelwa, kodwa ngokungagqibekanga kuphela unxibelelwano "impahlaΒ«-Β»website"(ikhonkco kwiwebhusayithi ilandela ikhowudi yewebhusayithi - base).

Nye "igumbi lokugcina izinto"inokudityaniswa ezininzi"imithombo"kunye enye"umthombo"- ukuya ezininzi"iindawo zokugcina iimpahla"(ubudlelwane obuninzi ukuya kwabaninzi). Izinto ezingaphandle azigqibekanga "umthombo"Kwaye"igumbi lokugcina izinto". Abadityaniswanga kwakhona kwamanye amaziko (umlinganiselo kwinqanaba lekhowudi - impazamo "Ayinakugcina ilinki enxulumene noMthombo oMiselweyo okanye isitokhwe esiMiselweyo"). Iinkcukacha ezingakumbi malunga nesakhiwo se-MSI kwiMagento 2 inokufumaneka kwinqaku "Inkqubo yolawulo lwe-Warehouse isebenzisa i-CQRS kunye nokuFumana uMnyhadala. YilaΒ«.

Ndiza kusebenzisa uqwalaselo olungagqibekanga kwaye ndongeze lonke ulwazi lwe-inventri kumthombo default, ebandakanyeka kumjelo wokuthengisa ohambelana newebhusayithi kunye nekhowudi base (ihambelana nesiphelo sangaphambili sevenkile - 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);
}

Emva kokongeza idatha yoluhlu kwimveliso kwiphaneli yolawulo, ufumana lo mfanekiso:

I-Magento 2: ukungenisa iimveliso ngqo kwisiseko sedatha

Imidiya

Xa "ngesandla" isongeza umfanekiso kwimveliso ngokusebenzisa ipaneli yolawulo, ulwazi olufanelekileyo lubhalwa phantsi kwezi tafile zilandelayo:

  • catalog_product_entity_media_gallery: irejista yemidiya (imifanekiso kunye neefayile zevidiyo);
  • catalog_product_entity_media_gallery_value: ukudibanisa imidiya kwiimveliso kunye nemiboniso (indawo yokuhlala);
  • catalog_product_entity_media_gallery_value_to_entity: ukudibanisa imidiya kwiimveliso kuphela (ekusenokwenzeka ukuba umxholo wemidiya ongagqibekanga wemveliso);
  • catalog_product_entity_varchar: Iindima apho umfanekiso usetyenziswe khona zigcinwe apha;

kwaye imifanekiso ngokwayo igcinwa kulawulo ./pub/media/catalog/product/x/y/phi x ΠΈ y β€” unobumba wokuqala nowesibini wegama lefayile yomfanekiso. Umzekelo, ifayile image.png kufuneka zigcinwe njenge ./pub/media/catalog/product/i/m/image.png, ukwenzela ukuba iqonga lingayisebenzisa njengomfanekiso xa lichaza iimveliso ezivela kwikhathalogu.

Bhalisa kufakwe ./pub/media/catalog/product/ ifayile yemidiya (inkqubo yokubeka ifayile ngokwayo ayixoxwanga kweli nqaku):

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

Xa ubhalisiwe, ifayile entsha yeendaba inikwa isichongi.

Sinxulumanisa ifayile yemidiya ebhalisiweyo kunye nemveliso ehambelanayo yevenkile ehlala ikhona:

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

Sinxulumanisa ifayile yeendaba ebhalisiweyo kunye nemveliso ehambelanayo ngaphandle kokubotshelelwa kuyo nayiphi na ivenkile yangaphambili. Akucaci apho le datha isetyenziswe khona kwaye kutheni kungenakwenzeka ukufikelela kwidatha kwitheyibhile yangaphambili, kodwa le tafile ikhona kwaye idatha ibhaliwe kuyo xa umfanekiso wongezwa kwimveliso. Ngoko yiloo nto.

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

ikhathalogu_product_entity_varchar

Ifayile yemidiya ingasetyenziswa ngeendima ezahlukeneyo (ikhowudi yophawu oluhambelanayo ibonisiwe kwizibiyeli):

  • Isiseko (image)
  • Umfanekiso omncinci (small_image)
  • I-Thumbnail (thumbnail)
  • Jonga umfanekiso (swatch_image)

Ukudibanisa iindima kwifayile yemidiya yinto eyenzekayo kanye catalog_product_entity_varchar. Ikhowudi yokubopha iyafana nekhowudi ekwi "Iimpawu zemveliso ezisisisekoΒ«.

Emva kokongeza umfanekiso kwimveliso kwiphaneli yolawulo ibonakala ngolu hlobo:

I-Magento 2: ukungenisa iimveliso ngqo kwisiseko sedatha

Izigaba

Iitheyibhile eziphambili eziqulathe idatha ngokodidi:

  • catalog_category_entity: irejista yeendidi;
  • catalog_category_product: unxibelelwano phakathi kweemveliso kunye neendidi;
  • catalog_category_entity_*: Amaxabiso ophawu lwe-EAV;

Ekuqaleni, kwisicelo esingenanto seMagento, uluhlu lobhaliso luqulathe iindidi ezi-2 (ndifinyeze amagama ekholamu: 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|

Udidi olune-id=1 yingcambu yayo yonke ikhathalogu yeMagento kwaye ayifumaneki nokuba kwiqela lenjongo yolawulo okanye kwiphepha elingaphambili. Udidi olune id=2 (Uluhlu oluhlala lukhona) luluhlu lweengcambu zevenkile engundoqo yesiza (IVenkile yeWebhusayithi engundoqo) yenziwe xa isicelo sisetyenziswa (bona. Ulawulo / iiVenkile / zonke iiVenkile). Ngaphezu koko, udidi lweengcambu zevenkile ngokwalo alufumaneki ngaphambili, kuphela ii-subcategories zalo.

Ekubeni isihloko seli nqaku sisangenisa idatha kwiimveliso, andiyi kusebenzisa ukungena ngokuthe ngqo kwisiseko sedatha xa udala iindidi, kodwa uya kusebenzisa iiklasi ezinikezwa nguMagento ngokwawo (iimodeli kunye neendawo zokugcina). Ukungena ngokuthe ngqo kwisiseko sedatha kusetyenziswa kuphela ukudibanisa imveliso engenisiweyo kunye nodidi (udidi ludityaniswa negama lalo, kwaye i-id yodidi ifunyenwe ngexesha lokutshatisa):

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

Emva kokongeza ikhonkco lemveliso kumacandelo "uDidi 1" kunye "noDidi 2", iinkcukacha zemveliso kwiphaneli yolawulo zijongeka ngolu hlobo:

I-Magento 2: ukungenisa iimveliso ngqo kwisiseko sedatha

Izenzo ezongeziweyo

Nje ukuba ukuthathwa kwedatha kugqityiwe, kufuneka ugcwalise la manyathelo ongezelelweyo alandelayo:

  • data indexing: call kwi console ./bin/magento indexer:reindex;
  • ukuhlaziya ii-URL zeemveliso/amacandelo: ungasebenzisa ulwandiso β€œelgentos/regenerate-catalog-urlsΒ«

Iimveliso kwiphaneli yolawulo emva kokwenza izenzo ezongezelelweyo:

I-Magento 2: ukungenisa iimveliso ngqo kwisiseko sedatha

nangaphambili:

I-Magento 2: ukungenisa iimveliso ngqo kwisiseko sedatha

Isishwankathelo

Isethi efanayo yeemveliso (iziqwenga ezili-10) njengoko kwinqaku langaphambili lingeniswa ubuncinci umyalelo wobukhulu ngokukhawuleza (i-1 yesibini ngokubhekiselele kwi-10). Ukuqikelela ngokuchanekileyo isantya, udinga inani elikhulu leemveliso - amakhulu aliqela, okanye angcono amawaka. Nangona kunjalo, nangona ubungakanani obuncinci bedatha yokufaka, sinokugqiba ukuba ukusetyenziswa kwezixhobo ezibonelelwa nguMagento (iimodeli kunye neendawo zokugcina) kubalulekile (ndiyagxininisa - kakhulu!) khawulezisa uphuhliso lomsebenzi ofunekayo, kodwa kwangaxeshanye kakhulu (ndiyagxininisa - kakhulu!) ukunciphisa isantya apho idatha ingena khona kwisiseko sedatha.

Ngenxa yoko, amanzi ajika abemanzi kwaye oku akusiyo isityhilelo. Nangona kunjalo, ngoku ndinekhowudi yokudlala kwaye mhlawumbi ndize kwizigqibo ezinomdla ngakumbi.

umthombo: www.habr.com