Π
isikhanyeli: IMagento inemisebenzi esele yenziwe
Ikhowudi ephuma ekubhaleni omabini amanqaku inokujongwa kwimodyuli yeMagento "
- 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).
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);
}
Iimpawu zemveliso ezisisiseko
Imveliso entsha ebhalisiweyo ayikabi nalo igama okanye inkcazo. Konke oku kwenziwa nge
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:
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 "
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:
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.
ikhathalogu_product_entity_media_gallery
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.
ikhathalogu_product_entity_media_gallery_value
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);
}
ikhathalogu_product_entity_media_gallery_value_to_entity
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:
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:
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:
nangaphambili:
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