Magento bir e-ticarət həllidir, yəni. anbar, logistika və ya satışları müşayiət edən maliyyə uçotundan daha çox məhsulların satışına yönəlib. Digər proqramlar (məsələn, ERP sistemləri) müşayiət olunan proqramlar üçün daha uyğundur. Buna görə də, Magento-dan istifadə praktikasında tez-tez bir mağazanın bu digər sistemlərlə (məsələn, 1C) inteqrasiyası vəzifəsi yaranır.
Ümumiyyətlə, inteqrasiya məlumatların təkrarlanmasına qədər azaldıla bilər:
- kataloq (məhsullar, kateqoriyalar);
- inventar məlumatları (anbarlarda məhsul qalıqları və qiymətlər);
- müştərilər;
- sifarişlər;
Magento verilənlər bazasında verilənlərin manipulyasiyası üçün ayrıca obyektlər sinfi təklif edir -
Müştərilər və sifarişlər adətən başqa istiqamətdə - Magento-dan xarici ERP sistemlərinə qədər təkrarlanır. Buna görə də, onlarla daha sadədir, Magento tərəfində sadəcə müvafiq məlumatları seçməlisiniz və sonra "güllələr bizim tərəfdən uçurdu".
Verilənlərin verilənlər bazasına yazılması prinsipləri
Hazırda Magento-da proqramlı şəkildə verilənlər bazasında saxlanılan obyektlərin yaradılması vasitəsilə həyata keçirilir
function __construct (MagentoCmsModelBlockFactory $blockFactory) {
$this->blockFactory = $blockFactory;
}
/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();
və verilənlər bazasına yazılması vasitəsilə həyata keçirilir
function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
$this->blockRepo = $blockRepo;
}
$this->blockRepo->save($block);
"Zavod" və "Repozitoriya" yanaşması Magento 2 domenindəki bütün əsas modellər üçün istifadə edilə bilər.
Əsas Məhsul Məlumatı
Mən Magento 2.3 versiyasına uyğun olan məlumat strukturuna baxıram. Məhsul haqqında ən əsas məlumatlar cədvəldədir catalog_product_entity
(məhsul reyestri):
entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at
Mən bir məhsul növü ilə məhdudlaşıram (type_id='simple'
), standart atributlar dəsti (attribute_set_id=4
) və atributlara məhəl qoymayın has_options
и required_options
. Atributlardan bəri entity_id
, created_at
и updated_at
avtomatik olaraq yaradılır, o zaman əslində yeni bir məhsul əlavə etmək üçün sadəcə təyin etməmiz lazımdır sku
. Mən bunu edirəm:
/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);
və mən bir istisna alıram:
The "Product Name" attribute value is empty. Set the attribute and try again.
Məhsulun adını sorğuya əlavə edirəm və atributun çatışmadığı barədə mesaj alıram Price
. Qiyməti əlavə etdikdən sonra məhsul verilənlər bazasına əlavə olunur:
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);
Məhsulun adı məhsulun varchar atribut cədvəlində saxlanılır (catalog_product_entity_varchar
), qiymət - cədvəldə catalog_product_entity_decimal
. Məhsulu əlavə etməzdən əvvəl, məlumatları idxal etmək üçün inzibati vitrindən istifadə etdiyimizi açıq şəkildə göstərmək məsləhətdir:
/** @var MagentoStoreModelStoreManagerInterface $manStore */
$manStore->setCurrentStore(0);
Əlavə Atributlar
Magento istifadə edərək əlavə məhsul atributlarının işlənməsi xoşdur. Əsas müəssisələr üçün EAV məlumat modeli (cədvəl eav_entity_type
) bu platformanın əsas xüsusiyyətlərindən biridir. Biz sadəcə olaraq məhsul modelinə müvafiq atributları əlavə edirik:
$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// или
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);
və modeli repo obyekti vasitəsilə saxlayarkən:
$repoProd->save($prod);
əlavə atributlar da müvafiq verilənlər bazası cədvəllərində saxlanılacaq.
İnventar məlumatları
Sadə dillə - anbarda olan məhsulun miqdarı. Magento 2.3-də inventar məlumatlarının saxlanması formatını təsvir edən verilənlər bazasında strukturlar var
/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
'is_in_stock' => true,
'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);
Media
Bir qayda olaraq, mağazada (e-ticarət) müştəri üçün media dəstəyi daxili mühasibat sistemində (ERP) işləyən işçi üçün eyni məhsul üçün media dəstəyindən fərqlənir. Birinci halda məhsulu üz-üzə göstərmək məqsədəuyğundur, ikinci halda məhsul haqqında ümumi təsəvvür yaratmaq kifayətdir. Bununla belə, ən azı bir məhsulun ilkin görüntüsünü köçürmək olduqca yaygındır. case
məlumatları idxal edərkən.
İdarəetmə paneli vasitəsilə şəkil əlavə edərkən, şəkil əvvəlcə müvəqqəti kataloqda saxlanılır (./pub/media/tmp/catalog/product
) və yalnız məhsul saxlandıqda media kataloquna köçürülür (./pub/media/catalog/product
). Həmçinin, admin paneli vasitəsilə əlavə edildikdə, şəkil etiketlənir 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);
Nədənsə, media yalnız məhsulu ilk dəfə saxladıqdan və onu yenidən depodan götürdükdən sonra əlaqələndirilir. Və atributu təyin etməlisiniz label
məhsulun media qalereyasına giriş əlavə edərkən (əks halda biz istisna alırıq Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516
).
Kateqoriyalar
Çox vaxt mağazanın kateqoriya strukturu və arxa proqram tətbiqi və ya məhsulların onlarda yerləşdirilməsi əhəmiyyətli dərəcədə fərqlənə bilər. Kateqoriyalar və onların daxilindəki məhsullar haqqında məlumatların köçürülməsi strategiyaları bir çox amillərdən asılıdır. Bu nümunədə mən aşağıdakılara sadiq qalıram:
- backend və mağaza kateqoriyaları adla müqayisə edilir;
- mağazada olmayan bir kateqoriya idxal edilirsə, o zaman kök kateqoriyası altında yaradılır (
Default Category
) və onun mağaza kataloqunda sonrakı yerləşdirilməsi əl ilə qəbul edilir; - məhsul yalnız mağazada yaradıldıqda kateqoriyaya aid edilir (ilk idxal);
Kateqoriya haqqında əsas məlumatlar cədvəldə verilmişdir catalog_category_entity
(kateqoriyalar kataloqu). Magento-da kateqoriya yaratmaq:
/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);
Məhsulu bir kateqoriyaya bağlamaq kateqoriya ID və məhsul SKU istifadə edərək həyata keçirilir:
/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);
Ümumi
Magento 2-ə proqramlı olaraq məhsul əlavə etmək üçün kod yazmaq olduqca asandır. Yuxarıda qeyd olunanların hamısını demo modulda birləşdirdim”fl32:import:prod
JSON faylında təsvir olunan məhsulları idxal edən "
[
{
"sku": "...",
"name": "...",
"desc": "...",
"desc_short": "...",
"price": ...,
"qty": ...,
"categories": ["..."],
"image_path": "..."
}
]
İdxal üçün şəkillər kataloqdadır ./etc/data/img
.
Bu üsuldan istifadə edərək 10 məhsulu idxal etmək vaxtı mənim laptopumda təxminən 10 saniyədir. Bu fikri daha da inkişaf etdirsək, belə qənaətə gəlmək asandır ki, saatda 3600-ə yaxın məhsul idxal oluna bilər, 100 min məhsulun idxalı isə təxminən 30 saat çəkə bilər. Laptopu serverlə əvəz etmək vəziyyəti bir qədər düzəltməyə imkan verir. Bəlkə də bir neçə dəfə. Ancaq böyüklük əmrləri ilə deyil. Ola bilsin ki, bu sürət və lənglik müəyyən qədər layihənin yaranmasının səbəblərindən biridir
İdxal sürətini artırmaq üçün radikal bir həll verilənlər bazasına birbaşa giriş ola bilər, lakin bu halda Magento-nun genişlənməsi ilə bağlı bütün "yaxşılıqlar" itir - hər şeyi "qabaqcıl" özünüz etməli olacaqsınız. Bununla belə, buna dəyər. Əgər nəticə verərsə, növbəti məqalədə verilənlər bazasına birbaşa yazı ilə yanaşmanı nəzərdən keçirəcəyəm.
Mənbə: www.habr.com