Π
Disclaimer: I-Magento inomsebenzi osewenzelwe
Ikhodi ewumphumela wokubhala zombili izindatshana ingabonwa kumojula ye-Magento "
- 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).
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);
}
Izibaluli zomkhiqizo eziyisisekelo
Umkhiqizo osanda kubhaliswa awukabi nalo igama noma incazelo. Konke lokhu kwenziwa
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:
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 "
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:
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.
ikhathalogi_product_entity_media_gallery
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.
catalog_product_entity_media_gallery_value
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);
}
ikhathalogi_product_entity_media_gallery_value_to_entity
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:
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:
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:
futhi ngaphambili:
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