Mae Magento yn ddatrysiad e-fasnach, h.y. wedi'i anelu'n fwy at werthu cynhyrchion nag at warysau, logisteg neu gyfrifon ariannol sy'n cyd-fynd â gwerthiannau. Mae cymwysiadau eraill (er enghraifft, systemau ERP) yn fwy addas ar gyfer ceisiadau cysylltiedig. Felly, yn aml iawn yn yr arfer o ddefnyddio Magento mae'r dasg o integreiddio storfa gyda'r systemau eraill hyn (er enghraifft, 1C) yn codi.
Ar y cyfan, gellir lleihau integreiddio i atgynhyrchu data trwy:
- catalog (cynhyrchion, categorïau);
- data rhestr eiddo (cydbwysedd cynnyrch mewn warysau a phrisiau);
- cleientiaid;
- gorchmynion;
Mae Magento yn cynnig dosbarth ar wahân o wrthrychau ar gyfer trin data yn y gronfa ddata -
Mae cwsmeriaid ac archebion fel arfer yn cael eu hailadrodd i'r cyfeiriad arall - o Magento i systemau ERP allanol. Felly, mae'n symlach gyda nhw, ar ochr Magento does ond angen i chi ddewis y data priodol, ac yna “hedfanodd bwledi allan o'n hochr".
Egwyddorion cofnodi data i gronfa ddata
Ar hyn o bryd, mae creu gwrthrychau sydd wedi'u cadw yn y gronfa ddata yn rhaglennol yn Magento yn cael ei wneud
function __construct (MagentoCmsModelBlockFactory $blockFactory) {
$this->blockFactory = $blockFactory;
}
/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();
ac ysgrifennu i'r gronfa ddata yn cael ei wneud drwy
function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
$this->blockRepo = $blockRepo;
}
$this->blockRepo->save($block);
Gellir defnyddio'r dull "Factory" a "Repository" ar gyfer pob model mawr ym mharth Magento 2.
Gwybodaeth Cynnyrch Sylfaenol
Rwy'n edrych ar strwythur data sy'n cyd-fynd â fersiwn Magento 2.3. Mae'r wybodaeth fwyaf sylfaenol am y cynnyrch yn y tabl catalog_product_entity
(cofrestrfa cynnyrch):
entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at
Rwy'n gyfyngedig i un math o gynnyrch (type_id='simple'
), set o briodoleddau diofyn (attribute_set_id=4
) ac anwybyddu priodoleddau has_options
и required_options
. Ers y priodoleddau entity_id
, created_at
и updated_at
yn cael eu cynhyrchu'n awtomatig, yna, mewn gwirionedd, i ychwanegu cynnyrch newydd, mae angen i ni osod sku
. Rwy'n gwneud hyn:
/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);
ac rwy'n cael eithriad:
The "Product Name" attribute value is empty. Set the attribute and try again.
Rwy'n ychwanegu enw'r cynnyrch at y cais ac yn cael neges bod y priodoledd ar goll Price
. Ar ôl ychwanegu'r pris, caiff y cynnyrch ei ychwanegu at y gronfa ddata:
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);
Mae enw'r cynnyrch yn cael ei storio yn y tabl priodoledd varchar cynnyrch (catalog_product_entity_varchar
), pris - yn y tabl catalog_product_entity_decimal
. Cyn ychwanegu cynnyrch, fe'ch cynghorir i nodi'n benodol ein bod yn defnyddio'r blaen siop weinyddol i fewnforio data:
/** @var MagentoStoreModelStoreManagerInterface $manStore */
$manStore->setCurrentStore(0);
Rhinweddau Ychwanegol
Mae prosesu priodoleddau cynnyrch ychwanegol gan ddefnyddio Magento yn bleser. Model data EAV ar gyfer y prif endidau (gweler y tabl eav_entity_type
) yw un o nodweddion allweddol y platfform hwn. Yn syml, rydym yn ychwanegu'r priodoleddau priodol i'r model cynnyrch:
$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// или
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);
ac wrth arbed y model trwy'r gwrthrych repo:
$repoProd->save($prod);
bydd priodoleddau ychwanegol hefyd yn cael eu storio yn y tablau cronfa ddata cyfatebol.
Data rhestr
Yn syml - faint o gynnyrch mewn stoc. Yn Magento 2.3, mae strwythurau yn y gronfa ddata sy'n disgrifio'r fformat ar gyfer storio data rhestr eiddo
/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
'is_in_stock' => true,
'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);
Cyfryngau
Fel rheol, mae cefnogaeth y cyfryngau ar gyfer cynnyrch i gleient mewn siop (e-fasnach) yn wahanol i gefnogaeth y cyfryngau ar gyfer yr un cynnyrch i weithiwr mewn system gyfrifo fewnol (ERP). Yn yr achos cyntaf, fe'ch cynghorir i ddangos y cynnyrch wyneb yn wyneb; yn yr ail, mae'n ddigon i roi syniad cyffredinol o'r cynnyrch. Fodd bynnag, mae trosglwyddo delwedd sylfaenol cynnyrch o leiaf yn eithaf cyffredin. case
wrth fewnforio data.
Wrth ychwanegu delwedd trwy'r panel gweinyddol, mae'r ddelwedd yn cael ei chadw gyntaf mewn cyfeiriadur dros dro (./pub/media/tmp/catalog/product
) a dim ond pan fydd arbed y cynnyrch yn cael ei symud i'r cyfeiriadur cyfryngau (./pub/media/catalog/product
). Hefyd, pan gaiff ei ychwanegu trwy'r panel gweinyddol, mae'r ddelwedd yn cael ei thagio image
, small_image
, thumbnail
, swatch_image
.
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogModelProductGalleryCreateHandler $hndlGalleryCreate */
/* $imagePath = '/path/to/file.png'; $imagePathRelative = '/f/i/file.png' */
$imagePathRelative = $this->imagePlaceToTmpMedia($imagePath);
/* reload product with gallery data */
$product = $repoProd->get($sku);
/* add image to product's gallery */
$gallery['images'][] = [
'file' => $imagePathRelative,
'media_type' => 'image'
'label' => ''
];
$product->setData('media_gallery', $gallery);
/* set usage areas */
$product->setData('image', $imagePathRelative);
$product->setData('small_image', $imagePathRelative);
$product->setData('thumbnail', $imagePathRelative);
$product->setData('swatch_image', $imagePathRelative);
/* create product's gallery */
$hndlGalleryCreate->execute($product);
Am ryw reswm, dim ond ar ôl arbed y cynnyrch yn gyntaf a'i adfer o'r ystorfa eto y caiff y cyfryngau eu cysylltu. Ac mae angen i chi nodi'r priodoledd label
wrth ychwanegu cofnod i'r oriel cyfryngau cynnyrch (fel arall cawn eithriad Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516
).
Категории
Yn aml, gall strwythur categori'r siop a'r cymhwysiad backend neu leoliad cynhyrchion ynddynt amrywio'n sylweddol. Mae strategaethau ar gyfer mudo data am gategorïau a chynhyrchion sydd ynddynt yn dibynnu ar lawer o ffactorau. Yn yr enghraifft hon rwy'n cadw at y canlynol:
- mae categorïau backend a storfa yn cael eu cymharu yn ôl enw;
- os mewnforir categori nad yw yn y storfa, yna caiff ei greu o dan y categori gwraidd (
Default Category
) a thybir ei leoliad pellach yng nghatalog y storfa â llaw; - mae cynnyrch yn cael ei neilltuo i gategori dim ond pan gaiff ei greu yn y storfa (mewnforio cyntaf);
Mae gwybodaeth sylfaenol am y categori yn y tabl catalog_category_entity
(catalog o gategorïau). Creu categori yn Magento:
/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);
Mae cysylltu cynnyrch â chategori yn cael ei wneud gan ddefnyddio ID y categori a SKU cynnyrch:
/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);
Yn gyfan gwbl
Mae ysgrifennu cod i ychwanegu cynnyrch yn rhaglennol at Magento 2 yn eithaf hawdd. Rwyf wedi cyfuno popeth a nodir uchod mewn modiwl demo “fl32:import:prod
, sy'n mewnforio'r cynhyrchion a ddisgrifir yn y ffeil JSON "
[
{
"sku": "...",
"name": "...",
"desc": "...",
"desc_short": "...",
"price": ...,
"qty": ...,
"categories": ["..."],
"image_path": "..."
}
]
Mae lluniau i'w mewnforio yn y catalog ./etc/data/img
.
Yr amser i fewnforio 10 cynnyrch gan ddefnyddio'r dull hwn yw tua 10 eiliad ar fy ngliniadur. Os byddwn yn datblygu'r syniad hwn ymhellach, mae'n hawdd dod i'r casgliad y gellir mewnforio tua 3600 o gynhyrchion yr awr, a gall gymryd tua 100 awr i fewnforio cynhyrchion 30K. Mae gosod gweinydd yn lle gliniadur yn caniatáu ichi lyfnhau rhywfaint ar y sefyllfa. Efallai hyd yn oed sawl gwaith. Ond nid trwy orchmynion maint. Efallai mai'r cyflymder a'r arafwch hwn i ryw raddau yw un o'r rhesymau dros ymddangosiad y prosiect
Gallai datrysiad radical i gynyddu cyflymder mewnforio fod yn fynediad uniongyrchol i'r gronfa ddata, ond yn yr achos hwn mae'r holl “nwyddau” ynghylch estynadwyedd Magento yn cael eu colli - bydd yn rhaid i chi wneud popeth “uwch” eich hun. Fodd bynnag, mae'n werth chweil. Os bydd yn gweithio allan, byddaf yn ystyried y dull gydag ysgrifennu uniongyrchol i'r gronfa ddata yn yr erthygl nesaf.
Ffynhonnell: hab.com