Magento 2: Гадаад эх үүсвэрээс бүтээгдэхүүн импортлох

Magento бол цахим худалдааны шийдэл, i.e. нь агуулах, логистик эсвэл борлуулалтыг дагалдах санхүүгийн нягтлан бодох бүртгэл гэхээсээ илүү бүтээгдэхүүн борлуулахад чиглэгддэг. Бусад програмууд (жишээлбэл, ERP системүүд) нь дагалдах програмуудад илүү тохиромжтой. Тиймээс, Magento-г ашиглах практикт дэлгүүрийг эдгээр бусад системүүдтэй (жишээлбэл, 1С) нэгтгэх даалгавар гарч ирдэг.

Ерөнхийдөө интеграцчлалыг дараах байдлаар өгөгдлийн хуулбар болгон бууруулж болно.

  • каталог (бүтээгдэхүүн, ангилал);
  • бараа материалын мэдээлэл (агуулах дахь бүтээгдэхүүний үлдэгдэл, үнэ);
  • үйлчлүүлэгчид;
  • захиалга;

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

"Үйлдвэр" болон "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 болон дэлгүүрийн ангиллыг нэрээр нь харьцуулсан;
  • хэрэв дэлгүүрт байхгүй категорийг импортолсон бол үүнийг үндсэн категорийн дор үүсгэнэ (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-ийн өргөтгөлтэй холбоотой бүх "сайн" зүйл алга болно - та "дэвшилтэт" бүх зүйлийг өөрөө хийх хэрэгтэй болно. Гэсэн хэдий ч энэ нь үнэ цэнэтэй юм. Хэрэв энэ нь үр дүнтэй бол би дараагийн нийтлэлд мэдээллийн сан руу шууд бичих аргыг авч үзэх болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх