Magento 2: pag-import sa mga produkto gikan sa gawas nga mga gigikanan

Ang Magento usa ka solusyon sa e-commerce, i.e. mas gitumong sa pagbaligya sa mga produkto kay sa bodega, logistik o pinansyal nga accounting nga nag-uban sa halin. Ang ubang mga aplikasyon (pananglitan, mga sistema sa ERP) mas haum alang sa kauban nga mga aplikasyon. Busa, kasagaran sa praktis sa paggamit sa Magento mitungha ang tahas sa pag-integrate sa usa ka tindahan uban niining ubang mga sistema (pananglitan, 1C).

Sa kinatibuk-an, ang panagsama mahimong mapakunhod ngadto sa pagkopya sa datos pinaagi sa:

  • katalogo (mga produkto, mga kategorya);
  • datos sa imbentaryo (mga balanse sa produkto sa mga bodega ug mga presyo);
  • mga kliyente;
  • mga sugo;

Nagtanyag ang Magento og lahi nga klase sa mga butang alang sa pagmaniobra sa datos sa database - mga tipiganan. Tungod sa mga detalye sa Magento, ang pagdugang sa datos sa database pinaagi sa mga repository dali nga ma-code, apan kini, ingnon ta, hinay. Sa kini nga publikasyon, akong gikonsiderar ang mga nag-unang yugto sa programa nga pagdugang usa ka produkto sa Magento 2 sa "klasikong" paagi - gamit ang mga klase sa repo.

Ang mga kustomer ug mga order kasagarang gisundog sa laing direksyon - gikan sa Magento ngadto sa gawas nga mga sistema sa ERP. Busa, mas simple kini sa kanila, sa kilid sa Magento kinahanglan nimo nga pilion ang angay nga datos, ug dayon "milupad ang mga bala gikan sa among kilid".

Mga prinsipyo sa pagrekord sa datos ngadto sa database

Sa pagkakaron, ang paghimo sa mga butang nga na-save sa database nga programmatically sa Magento nahuman na pabrika:

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

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

ug ang pagsulat sa database gihimo pinaagi sa Repository:

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

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

Ang "Factory" ug "Repository" nga pamaagi mahimong magamit alang sa tanan nga dagkong mga modelo sa domain sa Magento 2.

Panguna nga Impormasyon sa Produkto

Nagtan-aw ko sa usa ka istruktura sa datos nga katumbas sa bersyon sa Magento 2.3. Ang labing sukaranan nga kasayuran bahin sa produkto naa sa lamesa catalog_product_entity (rehistro sa produkto):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Limitado ako sa usa ka klase sa produkto (type_id='simple'), usa ka set sa default nga mga hiyas (attribute_set_id=4) ug ibaliwala ang mga hiyas has_options ΠΈ required_options. Sukad sa mga hiyas entity_id, created_at ΠΈ updated_at awtomatiko nga namugna, unya, sa tinuud, aron makadugang usa ka bag-ong produkto, kinahanglan ra naton itakda sku. Gibuhat nako kini:

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

ug nakakuha ako usa ka eksepsiyon:

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

Gidugang nako ang ngalan sa produkto sa hangyo ug nakakuha usa ka mensahe nga nawala ang hiyas Price. Human sa pagdugang sa presyo, ang produkto idugang sa database:

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

Ang ngalan sa produkto gitipigan sa product varchar attribute table (catalog_product_entity_varchar), presyo - sa lamesa catalog_product_entity_decimal. Sa wala pa magdugang usa ka produkto, gitambagan nga klaro nga ipakita nga gigamit namon ang administratibo nga storefront sa pag-import sa datos:

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

Dugang nga mga Hiyas

Ang pagproseso sa dugang nga mga hiyas sa produkto gamit ang Magento usa ka kalipay. Modelo sa datos sa EAV alang sa mga nag-unang entidad (tan-awa ang lamesa eav_entity_type) mao ang usa sa mga mahinungdanong bahin niini nga plataporma. Gidugang lang namo ang angay nga mga hiyas sa modelo sa produkto:

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

ug kung gitipigan ang modelo pinaagi sa repo nga butang:

$repoProd->save($prod);

ang dugang nga mga hiyas itago usab sa katugbang nga mga lamesa sa database.

Data sa imbentaryo

Sa yano nga mga termino - ang kantidad sa produkto sa stock. Sa Magento 2.3, ang mga istruktura sa database nga naghulagway sa format sa pagtipig sa datos sa imbentaryo mao ang lahi kaayo gikan sa nahitabo kaniadto. Bisan pa, ang pagdugang sa gidaghanon sa usa ka produkto sa stock pinaagi sa modelo sa produkto dili labi ka lisud kaysa pagdugang sa ubang mga hiyas:

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

Media

Ingon sa usa ka lagda, ang suporta sa media alang sa usa ka produkto alang sa usa ka kliyente sa usa ka tindahan (e-commerce) lahi sa suporta sa media alang sa parehas nga produkto alang sa usa ka empleyado sa usa ka internal nga sistema sa accounting (ERP). Sa una nga kaso, gisugyot nga ipakita ang produkto nawong sa nawong; sa ikaduha, igo na nga maghatag usa ka kinatibuk-ang ideya sa produkto. Bisan pa, ang pagbalhin labing menos ang panguna nga imahe sa usa ka produkto kasagaran. case sa diha nga import data.

Kung magdugang usa ka imahe pinaagi sa admin panel, ang imahe una nga gitipig sa usa ka temporaryo nga direktoryo (./pub/media/tmp/catalog/product) ug kung ang pagtipig sa produkto ibalhin sa direktoryo sa media (./pub/media/catalog/product). Usab, kung idugang pinaagi sa admin panel, ang imahe gi-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);

Sa pipila ka rason, ang media nalambigit lamang human sa una nga pagtipig sa produkto ug pagbawi niini gikan sa repository pag-usab. Ug kinahanglan nimo nga ipiho ang hiyas label kung magdugang usa ka entry sa gallery sa media sa produkto (kung dili makakuha kami usa ka eksepsiyon Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Mga kategoriya

Kasagaran, ang istruktura sa kategorya sa tindahan ug ang aplikasyon sa backend o ang pagbutang sa mga produkto niini mahimong magkalainlain. Ang mga estratehiya sa pagbalhin sa datos bahin sa mga kategorya ug mga produkto sa sulod niini nagdepende sa daghang mga hinungdan. Sa niini nga pananglitan ako nagpabilin sa mosunod:

  • ang mga kategorya sa backend ug tindahan gitandi sa ngalan;
  • kung ang usa ka kategorya gi-import nga wala sa tindahan, nan kini gihimo sa ilawom sa kategorya nga gamut (Default Category) ug ang dugang nga pagpahiluna niini sa katalogo sa tindahan gidawat nga mano-mano;
  • ang usa ka produkto gi-assign sa usa ka kategorya kung kini gihimo sa tindahan (unang import);

Ang sukaranan nga kasayuran bahin sa kategorya naa sa lamesa catalog_category_entity (katalogo sa mga kategorya). Paghimo usa ka kategorya sa Magento:

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

Ang pag-link sa usa ka produkto sa usa ka kategorya gihimo gamit ang ID sa kategorya ug SKU sa produkto:

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

Total

Ang pagsulat sa code aron makadugang usa ka produkto nga programmatically sa Magento 2 dali ra. Akong gikombinar ang tanan nga gipahayag sa ibabaw ngadto sa usa ka demo module "flancer32/mage2_ext_demo_import". Adunay usa lamang ka console command sa module fl32:import:prod, nga nag-import sa mga produkto nga gihulagway sa JSON file "./etc/data/products.json":

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

Ang mga hulagway para sa importasyon anaa sa katalogo ./etc/data/img.

Ang oras sa pag-import sa 10 nga mga produkto gamit kini nga pamaagi mga 10 segundos sa akong laptop. Kung atong pauswagon pa kini nga ideya, dali nga moabut sa konklusyon nga mga 3600 ka mga produkto ang mahimong ma-import matag oras, ug mahimo’g molungtad mga 100 ka oras aron ma-import ang 30K nga mga produkto. Ang pag-ilis sa usa ka laptop sa usa ka server nagtugot kanimo nga hapsay ang kahimtang. Tingali sa pipila ka mga higayon. Apan dili pinaagi sa mga mando sa kadako. Tingali kini nga katulin ug kahinay usa sa mga hinungdan sa pagtungha sa proyekto magento/async-import.

Ang usa ka radikal nga solusyon aron madugangan ang katulin sa pag-import mahimo’g direkta nga pagsulod sa database, apan sa kini nga kaso ang tanan nga mga "goodies" bahin sa pagpalapad sa Magento nawala - kinahanglan nimo nga buhaton ang tanan nga "advanced" sa imong kaugalingon. Hinuon, takos kini. Kung kini molihok, akong tagdon ang pamaagi nga adunay direkta nga pagsulat sa database sa sunod nga artikulo.

Source: www.habr.com

Idugang sa usa ka comment