Magento 2. Արտադրանքի ներմուծում արտաքին աղբյուրներից

Magento-ն էլեկտրոնային առևտրի լուծում է, այսինքն. ավելի շատ ուղղված է ապրանքների վաճառքին, քան վաճառքին ուղեկցող պահեստային, լոգիստիկ կամ ֆինանսական հաշվառմանը: Այլ հավելվածները (օրինակ՝ ERP համակարգերը) ավելի հարմար են ուղեկցող հավելվածների համար: Հետևաբար, Magento-ի օգտագործման պրակտիկայում բավականին հաճախ առաջանում է խանութը այս այլ համակարգերի հետ (օրինակ՝ 1C) ինտեգրելու խնդիր։

Ընդհանուր առմամբ, ինտեգրումը կարող է կրճատվել տվյալների կրկնօրինակմամբ՝

  • կատալոգ (ապրանքներ, կատեգորիաներ);
  • գույքագրման տվյալներ (ապրանքների մնացորդները պահեստներում և գները);
  • հաճախորդներ;
  • պատվերներ;

Magento-ն առաջարկում է օբյեկտների առանձին դաս՝ տվյալների բազայում տվյալների մանիպուլյացիայի համար. պահոցներ. Magento-ի առանձնահատկություններից ելնելով, պահեստների միջոցով տվյալների բազայում տվյալների ավելացումը հեշտ է կոդավորվում, բայց դա, ասենք, դանդաղ է։ Այս հրապարակման մեջ ես դիտարկում եմ Magento 2-ին արտադրանքը ծրագրային կերպով ավելացնելու հիմնական փուլերը «դասական» եղանակով՝ օգտագործելով ռեպո դասեր:

Հաճախորդները և պատվերները սովորաբար կրկնվում են մյուս ուղղությամբ՝ Magento-ից մինչև արտաքին 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);

«Factory» և «Repository» մոտեցումները կարող են օգտագործվել 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 հավելվածը կամ դրանցում ապրանքների տեղադրումը կարող են զգալիորեն տարբերվել: Կատեգորիաների և դրանցում ներառված ապրանքների վերաբերյալ տվյալների տեղափոխման ռազմավարությունները կախված են բազմաթիվ գործոններից: Այս օրինակում ես մնում եմ հետևյալին.

  • 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:prod, որը ներմուծում է JSON ֆայլում նկարագրված ապրանքները./etc/data/products.json"

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

Ներմուծվող նկարները կատալոգում են ./etc/data/img.

Այս մեթոդով 10 ապրանք ներմուծելու ժամանակը մոտ 10 վայրկյան է իմ նոութբուքում: Եթե ​​այս գաղափարը հետագայում զարգացնենք, ապա հեշտ է գալ այն եզրակացության, որ ժամում կարելի է ներմուծել մոտ 3600 ապրանք, իսկ 100 հազար ապրանք ներկրելու համար կարող է պահանջվել մոտ 30 ժամ։ Նոթբուքը սերվերով փոխարինելը թույլ է տալիս որոշակիորեն հարթել իրավիճակը։ Գուցե նույնիսկ մի քանի անգամ: Բայց ոչ մեծության պատվերներով: Թերեւս այս արագությունն ու դանդաղությունն ինչ-որ չափով հանդիսանում են նախագծի առաջացման պատճառներից մեկը magento/async-ներմուծում.

Ներմուծման արագությունը մեծացնելու արմատական ​​լուծում կարող է լինել ուղղակի մուտքը տվյալների բազա, բայց այս դեպքում Magento-ի ընդարձակելիության հետ կապված բոլոր «լավությունները» կորչում են. դուք ստիպված կլինեք ամեն ինչ «առաջադեմ» անել ինքներդ: Այնուամենայնիվ, արժե այն: Եթե ​​ստացվի, ես հաջորդ հոդվածում կդիտարկեմ տվյալների բազայի ուղղակի գրավոր մոտեցումը։

Source: www.habr.com

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