Magento 2: Ngimpor Produk saka Sumber Eksternal

Magento minangka solusi e-commerce, yaiku. luwih ngarahake adol produk tinimbang gudang, logistik utawa akuntansi finansial sing ngiringi dodolan. Aplikasi liyane (contone, sistem ERP) luwih cocog kanggo aplikasi sing ngiringi. Mulane, ing praktik nggunakake Magento, tugas nggabungake toko karo sistem liyane (contone, 1C) muncul.

UmumΓ©, integrasi bisa dikurangi dadi replikasi data kanthi:

  • katalog (produk, kategori);
  • data persediaan (imbangan produk ing gudang lan rega);
  • klien;
  • pesenan;

Magento nawakake kelas obyek sing kapisah kanggo manipulasi data ing basis data - repositori. Amarga spesifik Magento, nambah data menyang database liwat repositori gampang dikode, nanging, ayo ngomong, alon. Ing publikasi iki, aku nganggep tahapan utama nambahake produk kanthi program menyang Magento 2 kanthi cara "klasik" - nggunakake kelas repo.

Pelanggan lan pesenan biasane ditiru ing arah liyane - saka Magento menyang sistem ERP eksternal. Mula, luwih gampang karo dheweke, ing sisih Magento sampeyan mung kudu milih data sing cocog, banjur "peluru mabur metu saka sisih kita".

Prinsip ngrekam data menyang database

Ing wayahe, nggawe obyek disimpen ing database programmatically ing Magento wis rampung liwat pabrik:

function __construct (MagentoCmsModelBlockFactory $blockFactory) {
    $this->blockFactory = $blockFactory;
}

/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();

lan nulis kanggo database rampung liwat Repository:

function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
    $this->blockRepo = $blockRepo;
}

$this->blockRepo->save($block);

Pendekatan "Pabrik" lan "Repositori" bisa digunakake kanggo kabeh model utama ing domain Magento 2.

Informasi Produk dhasar

Aku ndeleng struktur data sing cocog karo versi Magento 2.3. Informasi paling dhasar babagan produk kasebut ana ing tabel catalog_product_entity (daftar produk):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Aku diwatesi mung siji jinis produk (type_id='simple'), kumpulan atribut standar (attribute_set_id=4) lan nglirwakake atribut has_options ΠΈ required_options. Wiwit atribut entity_id, created_at ΠΈ updated_at digawe kanthi otomatis, banjur, nyatane, kanggo nambah produk anyar, kita mung kudu nyetel sku. Aku nindakake iki:

/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);

lan aku njaluk pangecualian:

The "Product Name" attribute value is empty. Set the attribute and try again.

Aku nambahake jeneng produk menyang panyuwunan lan entuk pesen yen atribut kasebut ilang Price. Sawise nambahake rega, produk kasebut ditambahake menyang database:

$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);

Jeneng produk disimpen ing tabel atribut varchar produk (catalog_product_entity_varchar), rega - ing meja catalog_product_entity_decimal. Sadurunge nambahake produk, disaranake kanthi jelas nuduhake yen kita nggunakake storefront administratif kanggo ngimpor data:

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

Atribut Tambahan

Ngolah atribut produk tambahan nggunakake Magento minangka kesenengan. Model data EAV kanggo entitas utama (ndeleng tabel eav_entity_type) minangka salah sawijining fitur utama platform iki. Kita mung nambah atribut sing cocog kanggo model produk:

$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// ΠΈΠ»ΠΈ
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);

lan nalika nyimpen model liwat obyek repo:

$repoProd->save($prod);

atribut tambahan uga bakal disimpen ing tabel database sing cocog.

Data persediaan

Ing istilah prasaja - jumlah produk ing saham. Ing Magento 2.3, struktur ing basis data sing nggambarake format kanggo nyimpen data inventaris yaiku beda banget saka kedadeyan sadurunge. Nanging, nambahake jumlah produk ing saham liwat model produk ora luwih angel tinimbang nambah atribut liyane:

/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
    'is_in_stock' => true,
    'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);

Media

Minangka aturan, dhukungan media kanggo produk kanggo klien ing toko (e-commerce) beda karo dhukungan media kanggo produk sing padha kanggo karyawan ing sistem akuntansi internal (ERP). Ing kasus sing sepisanan, dianjurake kanggo nuduhake produk kanthi adhep-adhepan; ing kaloro, cukup kanggo menehi gambaran umum babagan produk kasebut. Nanging, mindhah paling ora gambar utama produk cukup umum. case nalika ngimpor data.

Nalika nambahake gambar liwat panel admin, gambar kasebut pisanan disimpen ing direktori sementara (./pub/media/tmp/catalog/product) lan mung nalika nyimpen produk dipindhah menyang direktori media (./pub/media/catalog/product). Uga, nalika ditambahake liwat panel admin, gambar kasebut diwenehi tag 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);

Kanggo sawetara alasan, media disambungake mung sawise nyimpen produk kasebut lan njupuk maneh saka gudang. Lan sampeyan kudu nemtokake atribut kasebut label nalika nambahake entri menyang galeri media produk (yen ora, kita entuk pangecualian Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Kategori

Asring, struktur kategori toko lan aplikasi backend utawa panggonan produk ing kono bisa beda-beda sacara signifikan. Sastranegara kanggo migrasi data babagan kategori lan produk ing jerone gumantung saka akeh faktor. Ing conto iki, aku tetep ing ngisor iki:

  • backend lan kategori toko dibandhingake jeneng;
  • yen kategori diimpor sing ora ana ing toko, banjur digawe ing kategori root (Default Category) lan posisi luwih lanjut ing katalog toko dianggep kanthi manual;
  • produk ditugasake menyang kategori mung nalika digawe ing toko (impor pisanan);

Informasi dhasar babagan kategori kasebut ana ing tabel catalog_category_entity (katalog kategori). Nggawe kategori ing Magento:

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

Nyambungake produk menyang kategori ditindakake nggunakake ID kategori lan SKU produk:

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

Total

Nulis kode kanggo nambah produk kanthi program Magento 2 cukup gampang. Aku wis nggabungake kabeh sing kasebut ing ndhuwur dadi modul demo "flancer32/mage2_ext_demo_import". Mung ana siji printah console ing modul fl32:import:prod, sing ngimpor produk sing diterangake ing file JSON "./etc/data/products.json":

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

Gambar kanggo ngimpor ana ing katalog ./etc/data/img.

Wektu ngimpor 10 produk nggunakake metode iki kira-kira 10 detik ing laptopku. Yen kita ngembangake gagasan iki luwih, iku gampang teka menyang kesimpulan sing bab 3600 produk bisa diimpor saben jam, lan bisa njupuk bab 100 jam kanggo ngimpor 30K produk. Ngganti laptop nganggo server ngidini sampeyan ngrampungake kahanan kasebut. Mungkin malah kaping pirang-pirang. Nanging ora kanthi pesenan gedhene. Mbok menawa kacepetan lan kalem iki minangka salah sawijining alesan kanggo muncule proyek kasebut magento/async-import.

Solusi radikal kanggo nambah kacepetan impor bisa uga langsung mlebu menyang database, nanging ing kasus iki, kabeh "barang" babagan ekstensibilitas Magento ilang - sampeyan kudu nindakake kabeh "maju" dhewe. Nanging, iku worth iku. Yen bisa, aku bakal nimbang pendekatan kanthi nulis langsung menyang database ing artikel sabanjure.

Source: www.habr.com

Add a comment