Magento 2: Тышкы булактардан өнүмдөрдү импорттоо

Magento - бул электрондук коммерция чечими, б.а. кампага, логистикага же сатууну коштогон каржылык эсепке караганда продукцияны сатууга көбүрөөк багытталган. Башка тиркемелер (мисалы, ERP системалары) коштомо колдонмолор үчүн жакшыраак. Ошондуктан, көп учурда Magento колдонуу практикасында дүкөндү ушул башка системалар (мисалы, 1С) менен интеграциялоо маселеси келип чыгат.

Жалпысынан алганда, интеграцияны маалыматтардын репликациясына төмөндөтсө болот:

  • каталог (продукциялар, категориялар);
  • инвентаризация маалыматтары (кампалардагы продукциянын калдыктары жана баалар);
  • кардарлар;
  • буйруктар;

Magento маалымат базасындагы маалыматтарды манипуляциялоо үчүн объекттердин өзүнчө классын сунуштайт - репозиторийлер. Magento өзгөчөлүктөрүнөн улам, маалымат базасына репозиторийлер аркылуу маалыматтарды кошуу оңой, бирок, айталы, жай. Бул басылмада мен Magento 2ге продуктуну программалык түрдө кошуунун негизги этаптарын "классикалык" жол менен - ​​репо класстарын колдонуу менен карайм.

Кардарлар жана буйрутмалар, адатта, башка багытта - Магентодон тышкы ERP системаларына чейин кайталанат. Ошондуктан, алар менен жөнөкөй, Magento тарабында сиз жөн гана тиешелүү маалыматтарды тандап, андан кийин "октор биз тараптан учуп кетти".

Маалыматтар базасына маалыматтарды жазуу принциптери

Учурда Magentoдо программалык түрдө маалымат базасында сакталган объекттерди түзүү аркылуу ишке ашырылат фабрика:

function __construct (MagentoCmsModelBlockFactory $blockFactory) {
    $this->blockFactory = $blockFactory;
}

/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();

жана маалымат базасына жазуу аркылуу ишке ашырылат жай:

function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
    $this->blockRepo = $blockRepo;
}

$this->blockRepo->save($block);

"Фабрика" жана "Репозиторий" мамилеси Magento 2 домениндеги бардык негизги моделдер үчүн колдонулушу мүмкүн.

Негизги продукт маалымат

Мен Magento 2.3 версиясына дал келген маалымат структурасын карап жатам. Буюм жөнүндө эң негизги маалымат таблицада catalog_product_entity (өнүм реестри):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Мен продуктунун бир түрү менен чектелгенмин (type_id='simple'), демейки атрибуттардын жыйындысы (attribute_set_id=4) жана атрибуттарды этибарга албаңыз has_options и required_options. Атрибуттардан бери entity_id, created_at и updated_at автоматтык түрдө түзүлөт, анда, чындыгында, жаңы продуктту кошуу үчүн, жөн гана орнотуу керек sku. Мен муну кылам:

/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);

жана мен өзгөчөлүктү алам:

The "Product Name" attribute value is empty. Set the attribute and try again.

Мен суроо-талапка продукттун атын кошуп, атрибут жок деген кабарды алам Price. Бааны кошкондон кийин, продукт маалымат базасына кошулат:

$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);

Товардын аталышы продукттун varchar атрибут таблицасында сакталат (catalog_product_entity_varchar), баасы - таблицада catalog_product_entity_decimal. Товарды кошуудан мурун, биз дайындарды импорттоо үчүн административдик дүкөндү колдонуп жатканыбызды ачык көрсөтүү сунушталат:

/** @var MagentoStoreModelStoreManagerInterface $manStore */
$manStore->setCurrentStore(0);

Кошумча атрибуттар

Magento аркылуу кошумча продукт атрибуттарын иштетүү - бул ырахат. Негизги объекттер үчүн EAV маалымат модели (таблицаны караңыз eav_entity_type) бул платформанын негизги өзгөчөлүктөрүнүн бири болуп саналат. Биз жөн гана продукт моделине тиешелүү атрибуттарды кошобуз:

$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// или
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);

жана репо объекти аркылуу моделди сактоодо:

$repoProd->save($prod);

кошумча атрибуттар да тиешелүү маалыматтар базасынын таблицаларында сакталат.

Инвентаризация маалыматтары

Жөнөкөй сөз менен айтканда - кампадагы продукциянын көлөмү. Magento 2.3, инвентаризациялык маалыматтарды сактоо форматын сүрөттөгөн маалымат базасындагы структуралар олуттуу айырмаланат мурда болгон окуядан. Бирок, товардын модели аркылуу кампадагы товардын санын кошуу башка атрибуттарды кошууга караганда алда канча кыйын эмес:

/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
    'is_in_stock' => true,
    'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);

маалымат каражаттары

Эреже катары, дүкөндө (электрондук коммерция) кардар үчүн продуктуну медиа колдоосу ички эсепке алуу тутумундагы (ERP) кызматкер үчүн бир эле продукт үчүн медиа колдоосунан айырмаланат. Биринчи учурда, продуктту бетме-бет көрсөтүү максатка ылайыктуу, ал продукт жөнүндө жалпы түшүнүк берүү үчүн жетиштүү болуп саналат; Бирок, жок эле дегенде, буюмдун негизги сүрөтүн өткөрүп берүү абдан кеңири таралган. case маалыматтарды импорттоодо.

Администратор панели аркылуу сүрөт кошкондо, сүрөт адегенде убактылуу каталогдо сакталат (./pub/media/tmp/catalog/product) жана продукт сакталганда гана медиа каталогуна (./pub/media/catalog/product). Ошондой эле, администратор панели аркылуу кошулганда, сүрөт белгиленет 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);

Эмнегедир, медиа биринчи продуктту сактап, кайра репозиторийден алгандан кийин гана байланышкан. Жана атрибутту көрсөтүү керек label продукт медиа галереясына жазуу кошууда (антпесе биз өзгөчө алабыз Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Категории

Көбүнчө, дүкөндүн категориясынын түзүмү жана алардын ичиндеги өнүмдөрдүн жайгашуусу олуттуу түрдө айырмаланышы мүмкүн. Алардын ичиндеги категориялар жана өнүмдөр жөнүндө маалыматтарды көчүрүү стратегиялары көптөгөн факторлорго көз каранды. Бул мисалда мен төмөнкүлөргө кармандым:

  • backend жана дүкөн категориялары аты боюнча салыштырылат;
  • эгер дүкөндө жок категория импорттолсо, анда ал түпкү категориянын астында түзүлөт (Default Category) жана аны дүкөндүн каталогунда андан ары жайгаштыруу кол менен кабыл алынат;
  • продукт дүкөндө түзүлгөндө гана категорияга ыйгарылат (биринчи импорт);

Категория жөнүндө негизги маалымат таблицада catalog_category_entity (категориялардын каталогу). Magentoдо категория түзүү:

/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);

Өнүмдү категорияга байланыштыруу категория ID жана продукт SKU аркылуу ишке ашырылат:

/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);

жалпы

Magento 2ге продуктуну программалык түрдө кошуу үчүн код жазуу абдан оңой. Мен жогоруда айтылгандардын баарын демо модулга бириктирдим "flancer32/mage2_ext_demo_import". Модульде бир гана консолдук команда бар fl32:import:prodJSON файлында сүрөттөлгөн өнүмдөрдү импорттогон "./etc/data/products.json':

[
  {
    "sku": "...",
    "name": "...",
    "desc": "...",
    "desc_short": "...",
    "price": ...,
    "qty": ...,
    "categories": ["..."],
    "image_path": "..."
  }
]

Импорттоо үчүн сүрөттөр каталогдо бар ./etc/data/img.

Бул ыкманы колдонуу менен 10 продуктуну импорттоо убактысы менин ноутбукумда 10 секунданы түзөт. Бул идеяны андан ары өнүктүрө турган болсок, саатына 3600гө жакын продукцияны ташып келүүгө болот, 100 миң продукцияны ташып келүү үчүн 30 саатка жакын убакыт талап кылынат деген жыйынтыкка келүү оңой. Ноутбукту серверге алмаштыруу кырдаалды бир аз жумшартууга мүмкүндүк берет. Балким, бир нече жолу. Бирок чоңдуктун буйругу менен эмес. Балким бул ылдамдык жана жайбаракаттык кандайдыр бир деңгээлде долбоордун пайда болушунун себептеринин бири болуп саналат magento/async-import.

Импорттун ылдамдыгын жогорулатуу үчүн радикалдуу чечим маалымат базасына түздөн-түз кирүү болушу мүмкүн, бирок бул учурда Magento'нун кеңейүүсүнө байланыштуу бардык "жакшылыктар" жоголот - сиз бардык "өнүккөн" нерсени өзүңүз жасашыңыз керек. Бирок, бул татыктуу. Эгер ал ишке ашса, мен кийинки макалада маалымат базасына түз жазуу менен мамилени карап чыгам.

Source: www.habr.com

Комментарий кошуу