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);ქარხნისა და საცავის მიდგომის გამოყენება შესაძლებელია დომენის ყველა ძირითადი მოდელისთვის. 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 და store კატეგორიები შედარებულია სახელით;
- თუ კატეგორიაში იმპორტირებულია, რომელიც არ არის მაღაზიაში, მაშინ ის იქმნება root კატეგორიის ქვეშ (
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 — ყველა „მოწინავე“ რამის გაკეთება თავად მომიწევს. მიუხედავად ამისა, ღირს. თუ გამოვა, შემდეგ სტატიაში მონაცემთა ბაზაში პირდაპირი ჩაწერის მიდგომას განვიხილავ.
წყარო: www.habr.com
