Magento-ն էլեկտրոնային առևտրի լուծում է, այսինքն. ավելի շատ ուղղված է ապրանքների վաճառքին, քան վաճառքին ուղեկցող պահեստային, լոգիստիկ կամ ֆինանսական հաշվառմանը: Այլ հավելվածները (օրինակ՝ ERP համակարգերը) ավելի հարմար են ուղեկցող հավելվածների համար: Հետևաբար, Magento-ի օգտագործման պրակտիկայում բավականին հաճախ առաջանում է խանութը այս այլ համակարգերի հետ (օրինակ՝ 1C) ինտեգրելու խնդիր։
Ընդհանուր առմամբ, ինտեգրումը կարող է կրճատվել տվյալների կրկնօրինակմամբ՝
- կատալոգ (ապրանքներ, կատեգորիաներ);
- գույքագրման տվյալներ (ապրանքների մնացորդները պահեստներում և գները);
- հաճախորդներ;
- պատվերներ;
Magento-ն առաջարկում է օբյեկտների առանձին դաս՝ տվյալների բազայում տվյալների մանիպուլյացիայի համար.
Հաճախորդները և պատվերները սովորաբար կրկնվում են մյուս ուղղությամբ՝ 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-ին ծրագրային կերպով արտադրանք ավելացնելու համար կոդ գրելը բավականին հեշտ է: Ես միավորել եմ վերը նշված ամեն ինչ դեմո մոդուլի մեջ »fl32:import:prod
, որը ներմուծում է JSON ֆայլում նկարագրված ապրանքները
[
{
"sku": "...",
"name": "...",
"desc": "...",
"desc_short": "...",
"price": ...,
"qty": ...,
"categories": ["..."],
"image_path": "..."
}
]
Ներմուծվող նկարները կատալոգում են ./etc/data/img
.
Այս մեթոդով 10 ապրանք ներմուծելու ժամանակը մոտ 10 վայրկյան է իմ նոութբուքում: Եթե այս գաղափարը հետագայում զարգացնենք, ապա հեշտ է գալ այն եզրակացության, որ ժամում կարելի է ներմուծել մոտ 3600 ապրանք, իսկ 100 հազար ապրանք ներկրելու համար կարող է պահանջվել մոտ 30 ժամ։ Նոթբուքը սերվերով փոխարինելը թույլ է տալիս որոշակիորեն հարթել իրավիճակը։ Գուցե նույնիսկ մի քանի անգամ: Բայց ոչ մեծության պատվերներով: Թերեւս այս արագությունն ու դանդաղությունն ինչ-որ չափով հանդիսանում են նախագծի առաջացման պատճառներից մեկը
Ներմուծման արագությունը մեծացնելու արմատական լուծում կարող է լինել ուղղակի մուտքը տվյալների բազա, բայց այս դեպքում Magento-ի ընդարձակելիության հետ կապված բոլոր «լավությունները» կորչում են. դուք ստիպված կլինեք ամեն ինչ «առաջադեմ» անել ինքներդ: Այնուամենայնիվ, արժե այն: Եթե ստացվի, ես հաջորդ հոդվածում կդիտարկեմ տվյալների բազայի ուղղակի գրավոր մոտեցումը։
Source: www.habr.com