Magento ir e-komercijas risinÄjums, t.i. ir vairÄk vÄrsta uz produktu pÄrdoÅ”anu, nevis uz noliktavu, loÄ£istiku vai pÄrdoÅ”anu pavadoÅ”o finanÅ”u uzskaiti. Citas lietojumprogrammas (piemÄram, ERP sistÄmas) ir labÄk piemÄrotas papildu lietojumprogrammÄm. TÄpÄc diezgan bieži Magento lietoÅ”anas praksÄ rodas uzdevums integrÄt veikalu ar Ŕīm citÄm sistÄmÄm (piemÄram, 1C).
KopumÄ integrÄciju var samazinÄt lÄ«dz datu replikÄcijai, veicot tÄlÄk norÄdÄ«tÄs darbÄ«bas.
- katalogs (produkti, kategorijas);
- krÄjumu dati (produktu atlikumi noliktavÄs un cenas);
- klientiem;
- pasūtījumi;
Magento piedÄvÄ atseviŔķu objektu klasi datu manipulÄÅ”anai datu bÄzÄ -
Klienti un pasÅ«tÄ«jumi parasti tiek replicÄti otrÄ virzienÄ ā no Magento uz ÄrÄjÄm ERP sistÄmÄm. TÄpÄc ar tiem ir vienkÄrÅ”Äk, Magento pusÄ jums vienkÄrÅ”i jÄizvÄlas atbilstoÅ”ie dati un pÄc tam "no mÅ«su puses izlidoja lodes".
Datu ierakstÄ«Å”anas datubÄzÄ principi
Å obrÄ«d datubÄzÄ saglabÄto objektu izveide programmatiski Magento tiek veikta
function __construct (MagentoCmsModelBlockFactory $blockFactory) {
$this->blockFactory = $blockFactory;
}
/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();
un rakstÄ«Å”ana datu bÄzÄ tiek veikta cauri
function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
$this->blockRepo = $blockRepo;
}
$this->blockRepo->save($block);
"RÅ«pnÄ«cas" un "Repozitorija" pieeju var izmantot visiem galvenajiem Magento 2 domÄna modeļiem.
PamatinformÄcija par produktu
Es skatos datu struktÅ«ru, kas atbilst Magento 2.3 versijai. VisvienkÄrÅ”ÄkÄ informÄcija par produktu ir atrodama tabulÄ catalog_product_entity
(produktu reģistrs):
entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at
Man ir tikai viena veida produkts (type_id='simple'
), noklusÄjuma atribÅ«tu kopa (attribute_set_id=4
) un ignorÄt atribÅ«tus has_options
Šø required_options
. TÄ kÄ atribÅ«ti entity_id
, created_at
Šø updated_at
tiek Ä£enerÄti automÄtiski, tad faktiski, lai pievienotu jaunu produktu, mums vienkÄrÅ”i jÄiestata sku
. Es daru tÄ:
/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);
un man ir izÅÄmums:
The "Product Name" attribute value is empty. Set the attribute and try again.
PieprasÄ«jumam pievienoju produkta nosaukumu un saÅemu ziÅojumu, ka trÅ«kst atribÅ«ta Price
. PÄc cenas pievienoÅ”anas prece tiek pievienota datu bÄzei:
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);
Produkta nosaukums tiek saglabÄts produkta varchar atribÅ«tu tabulÄ (catalog_product_entity_varchar
), cena - tabulÄ catalog_product_entity_decimal
. Pirms produkta pievienoÅ”anas ir ieteicams skaidri norÄdÄ«t, ka datu importÄÅ”anai izmantojam administratÄ«vo veikala mÄjaslapu:
/** @var MagentoStoreModelStoreManagerInterface $manStore */
$manStore->setCurrentStore(0);
Papildu atribūti
Papildu produkta atribÅ«tu apstrÄde, izmantojot Magento, ir prieks. EAV datu modelis galvenajÄm entÄ«tijÄm (sk. tabulu eav_entity_type
) ir viena no Ŕīs platformas galvenajÄm funkcijÄm. MÄs vienkÄrÅ”i pievienojam atbilstoÅ”os atribÅ«tus produkta modelim:
$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// ŠøŠ»Šø
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);
un saglabÄjot modeli, izmantojot repo objektu:
$repoProd->save($prod);
papildu atribÅ«ti tiks saglabÄti arÄ« attiecÄ«gajÄs datu bÄzes tabulÄs.
InventÄra dati
VienkÄrÅ”Ä izteiksmÄ - preces daudzums noliktavÄ. ProgrammÄ Magento 2.3 datu bÄzes struktÅ«ras, kas apraksta krÄjumu datu glabÄÅ”anas formÄtu, ir
/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
'is_in_stock' => true,
'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);
Mediju
Parasti mediju atbalsts produktam klientam veikalÄ (e-komercija) atŔķiras no mediju atbalsta tÄdam paÅ”am produktam darbiniekam iekÅ”ÄjÄ grÄmatvedÄ«bas sistÄmÄ (ERP). PirmajÄ gadÄ«jumÄ ir ieteicams produktu parÄdÄ«t aci pret aci, otrajÄ gadÄ«jumÄ pietiek ar vispÄrÄju priekÅ”statu par produktu. TomÄr vismaz produkta primÄrÄ attÄla pÄrsÅ«tÄ«Å”ana ir diezgan izplatÄ«ta parÄdÄ«ba. case
importÄjot datus.
Pievienojot attÄlu caur admin paneli, attÄls vispirms tiek saglabÄts pagaidu direktorijÄ (./pub/media/tmp/catalog/product
) un tikai tad, kad produkts tiek pÄrvietots uz multivides direktoriju (./pub/media/catalog/product
). TurklÄt, pievienojot, izmantojot administratora paneli, attÄls tiek atzÄ«mÄts 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);
KÄdu iemeslu dÄļ datu nesÄjs tiek piesaistÄ«ts tikai pÄc produkta saglabÄÅ”anas un atkÄrtotas izgÅ«Å”anas no krÄtuves. Un jums ir jÄnorÄda atribÅ«ts label
pievienojot ierakstu produkta multivides galerijai (pretÄjÄ gadÄ«jumÄ mÄs saÅemam izÅÄmumu Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516
).
Kategorija
Bieži vien veikala kategoriju struktÅ«ra un aizmugurprogramma vai produktu izvietojums tajÄs var bÅ«tiski atŔķirties. StratÄÄ£ijas datu migrÄÅ”anai par kategorijÄm un produktiem tajÄs ir atkarÄ«gas no daudziem faktoriem. Å ajÄ piemÄrÄ es pieturos pie sekojoÅ”Ä:
- aizmugursistÄmas un veikalu kategorijas tiek salÄ«dzinÄtas pÄc nosaukuma;
- ja tiek importÄta kategorija, kas neatrodas veikalÄ, tad tÄ tiek izveidota zem saknes kategorijas (
Default Category
) un tÄ turpmÄkÄ pozicionÄÅ”ana veikala katalogÄ tiek pieÅemta manuÄli; - prece tiek pieŔķirta kategorijai tikai tad, kad tÄ ir izveidota veikalÄ (pirmÄ importÄÅ”ana);
PamatinformÄcija par kategoriju ir atrodama tabulÄ catalog_category_entity
(kategoriju katalogs). Kategorijas izveide programmÄ Magento:
/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);
Produkta saistīŔana ar kategoriju tiek veikta, izmantojot kategorijas ID un produkta SKU:
/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);
KopÄ
RakstÄ«t kodu, lai programmatiski pievienotu produktu Magento 2, ir diezgan vienkÄrÅ”i. Esmu apvienojis visu iepriekÅ” minÄto demonstrÄcijas modulÄ« "fl32:import:prod
, kas importÄ JSON failÄ aprakstÄ«tos produktus
[
{
"sku": "...",
"name": "...",
"desc": "...",
"desc_short": "...",
"price": ...,
"qty": ...,
"categories": ["..."],
"image_path": "..."
}
]
AttÄli importÄÅ”anai ir katalogÄ ./etc/data/img
.
Laiks 10 produktu importÄÅ”anai, izmantojot Å”o metodi, manÄ klÄpjdatorÄ ir aptuveni 10 sekundes. Ja mÄs Å”o ideju attÄ«stÄm tÄlÄk, var viegli nonÄkt pie secinÄjuma, ka stundÄ var ievest aptuveni 3600 produktu, bet 100 30 produktu imports var aizÅemt aptuveni XNUMX stundas. KlÄpjdatora aizstÄÅ”ana ar serveri ļauj nedaudz izlÄ«dzinÄt situÄciju. VarbÅ«t pat vairÄkas reizes. Bet ne pÄc lieluma kÄrtÄm. IespÄjams, Å”is Ätrums un lÄnums zinÄmÄ mÄrÄ ir viens no projekta raÅ”anÄs iemesliem
RadikÄls risinÄjums importÄÅ”anas Ätruma palielinÄÅ”anai varÄtu bÅ«t tieÅ”a ievade datu bÄzÄ, taÄu Å”ajÄ gadÄ«jumÄ tiek zaudÄtas visas Magento paplaÅ”inÄÅ”anas ālabÄ«basā - viss bÅ«s jÄdara āuzlabotiā. TomÄr tas ir tÄ vÄrts. Ja tas izdosies, nÄkamajÄ rakstÄ apsvÄrÅ”u pieeju ar tieÅ”u rakstÄ«Å”anu datu bÄzÄ.
Avots: www.habr.com