Магенто 2: Увоз производа из спољних извора

Магенто је решење за е-трговину, тј. је више усмерен на продају производа него на складиштење, логистику или финансијско рачуноводство које прати продају. Друге апликације (на пример, ЕРП системи) су погодније за пратеће апликације. Стога се често у пракси коришћења Магенто-а појављује задатак интеграције продавнице са овим другим системима (на пример, 1Ц).

Углавном, интеграција се може свести на репликацију података:

  • каталог (производи, категорије);
  • подаци о залихама (стања производа у магацинима и цене);
  • клијенти;
  • наређења;

Магенто нуди посебну класу објеката за манипулисање подацима у бази података - спремишта. Због специфичности Магента, додавање података у базу података преко репозиторија је лако кодирати, али је, рецимо, споро. У овој публикацији разматрам главне фазе програмског додавања производа у Магенто 2 на „класичан“ начин – коришћењем репо класа.

Купци и поруџбине се обично реплицирају у другом правцу – од Магенто-а ка екстерним ЕРП системима. Дакле, са њима је једноставније, на Магенто страни само треба да изаберете одговарајуће податке, а затим „са наше стране излетели су меци".

Принципи евидентирања података у базу података

Тренутно се креирање објеката сачуваних у бази података програмски у Магенту обавља кроз фабрика:

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);

Приступ „Фабрика“ и „Репозиторијум“ се може користити за све главне моделе у Магенто 2 домену.

Основне информације о производу

Гледам структуру података која одговара верзији Магенто 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);

Назив производа се чува у табели атрибута варцхар производа (catalog_product_entity_varchar), цена - у табели catalog_product_entity_decimal. Пре него што додате производ, препоручљиво је да експлицитно назначите да користимо административни излог за увоз података:

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

Додатни атрибути

Обрада додатних атрибута производа користећи Магенто је задовољство. ЕАВ модел података за главне ентитете (погледајте табелу eav_entity_type) је једна од кључних карактеристика ове платформе. Једноставно додајемо одговарајуће атрибуте моделу производа:

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

и када снимате модел преко репо објекта:

$repoProd->save($prod);

додатни атрибути ће такође бити ускладиштени у одговарајућим табелама базе података.

Подаци о инвентару

Једноставно речено - количина производа на залихама. У Магенто 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);

Медији

По правилу се медијска подршка за производ за клијента у продавници (е-трговина) разликује од медијске подршке за исти производ за запосленог у интерном рачуноводственом систему (ЕРП). У првом случају, препоручљиво је показати производ лицем у лице, у другом је довољно дати општу представу о производу. Међутим, преношење барем примарне слике производа је прилично уобичајено. 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).

Категории

Често се структура категорије продавнице и позадинске апликације или пласман производа у њима може значајно разликовати. Стратегије за миграцију података о категоријама и производима унутар њих зависе од многих фактора. У овом примеру се држим следећег:

  • категорије позадине и продавнице се упоређују по имену;
  • ако је увезена категорија која није у продавници, онда се креира под основном категоријом (Default Category) а његово даље позиционирање у каталогу продавнице се претпоставља ручно;
  • производ се додељује категорији само када је креиран у продавници (први увоз);

Основне информације о категорији налазе се у табели catalog_category_entity (каталог категорија). Креирање категорије у Магенто:

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

Повезивање производа са категоријом врши се помоћу ИД-а категорије и СКУ производа:

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

Укупно

Писање кода за програмско додавање производа у Магенто 2 је прилично лако. Комбиновао сам све горе наведено у демо модул “фланцер32/маге2_ект_демо_импорт„. У модулу постоји само једна конзолна команда fl32:import:prod, који увози производе описане у ЈСОН датотеци "./етц/дата/продуцтс.јсон":

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

Слике за увоз су у каталогу ./etc/data/img.

Време за увоз 10 производа помоћу ове методе је око 10 секунди на мом лаптопу. Ако ову идеју даље развијамо, лако је доћи до закључка да се на сат може увести око 3600 производа, а за увоз 100 производа може бити потребно око 30 сати. Замена лаптопа са сервером омогућава вам да донекле изгладите ситуацију. Можда чак и неколико пута. Али не по редовима величине. Можда је ова брзина и спорост у извесној мери један од разлога за настанак пројекта магенто/асинц-импорт.

Радикално решење за повећање брзине увоза могао би бити директан улазак у базу података, али у овом случају се губе све „доброте“ у вези са проширивости Магенто-а – све ћете морати да урадите сами. Међутим, вреди тога. Ако успе, размотрићу приступ са директним писањем у базу података у следећем чланку.

Извор: ввв.хабр.цом

Додај коментар