Magento 2: xarici mənbələrdən məhsulların idxalı

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 - depolar. Magento-nun xüsusiyyətlərinə görə, depolar vasitəsilə verilənlər bazasına məlumat əlavə etmək kodlaşdırmaq asandır, lakin, deyək ki, yavaşdır. Bu nəşrdə mən proqramlı şəkildə Magento 2-yə məhsulu "klassik" şəkildə - repo siniflərindən istifadə etməklə əlavə etməyin əsas mərhələlərini nəzərdən keçirirəm.

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 zavod:

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 Depo:

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 əhəmiyyətli dərəcədə fərqlidir əvvəl baş verənlərdən. Bununla belə, məhsul modeli vasitəsilə stokda olan məhsulun miqdarını əlavə etmək digər atributları əlavə etməkdən daha çətin deyil:

/** @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”flancer32/mage2_ext_demo_import". Modulda yalnız bir konsol əmri var fl32:import:prodJSON faylında təsvir olunan məhsulları idxal edən "./etc/data/products.json"

[
  {
    "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 magento/async-import.

İ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

Добавить комментарий