Magento 2: బాహ్య మూలాల నుండి ఉత్పత్తులను దిగుమతి చేసుకోవడం

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

వర్గం

తరచుగా, స్టోర్ యొక్క వర్గ నిర్మాణం మరియు బ్యాకెండ్ అప్లికేషన్ లేదా వాటిలో ఉత్పత్తుల ప్లేస్‌మెంట్ గణనీయంగా భిన్నంగా ఉండవచ్చు. వాటిలోని కేటగిరీలు మరియు ఉత్పత్తుల గురించి డేటాను తరలించే వ్యూహాలు అనేక అంశాలపై ఆధారపడి ఉంటాయి. ఈ ఉదాహరణలో నేను ఈ క్రింది వాటికి కట్టుబడి ఉంటాను:

  • బ్యాకెండ్ మరియు స్టోర్ కేటగిరీలు పేరుతో పోల్చబడ్డాయి;
  • స్టోర్‌లో లేని వర్గం దిగుమతి చేయబడితే, అది మూల వర్గం క్రింద సృష్టించబడుతుంది (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 ఉత్పత్తులను దిగుమతి చేసుకోవచ్చని మరియు 100K ఉత్పత్తులను దిగుమతి చేసుకోవడానికి దాదాపు 30 గంటలు పట్టవచ్చని నిర్ధారణకు రావడం సులభం. ల్యాప్‌టాప్‌ను సర్వర్‌తో భర్తీ చేయడం వలన మీరు పరిస్థితిని కొంతవరకు సున్నితంగా చేయవచ్చు. బహుశా చాలా సార్లు కూడా. కానీ పెద్ద ఆర్డర్ల ద్వారా కాదు. బహుశా ఈ వేగం మరియు మందగమనం ప్రాజెక్ట్ యొక్క ఆవిర్భావానికి కొంతవరకు కారణాలలో ఒకటి magento/async-import.

దిగుమతి వేగాన్ని పెంచడానికి ఒక సమూల పరిష్కారం డేటాబేస్‌లోకి నేరుగా ప్రవేశించడం కావచ్చు, అయితే ఈ సందర్భంలో Magento యొక్క విస్తరణకు సంబంధించిన అన్ని “గూడీస్” పోతాయి - మీరు ప్రతిదీ “అధునాతన” చేయాల్సి ఉంటుంది. అయితే, అది విలువైనది. ఇది పని చేస్తే, నేను తదుపరి వ్యాసంలో డేటాబేస్కు నేరుగా వ్రాసే విధానాన్ని పరిశీలిస్తాను.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి