IMagento 2: Ukungeniswa kweeMveliso ezivela kwiMithombo yaNgaphandle

IMagento sisisombululo se-e-commerce, okt. ijolise kakhulu ekuthengiseni iimveliso kunendawo yokugcina impahla, ulungiselelo okanye ucwangciso-mali olukhapha iintengiso. Ezinye izicelo (umzekelo, iisistim ze-ERP) zifaneleka ngcono usetyenziso olukhaphayo. Ngoko ke, ngokuphindaphindiweyo kwisenzo sokusebenzisa iMagento umsebenzi wokudibanisa ivenkile kunye nezinye iinkqubo (umzekelo, i-1C) ivela.

Ngokubanzi, udibaniso lunokuncitshiswa kukuphindwa kwedatha ngoku:

  • ikhathalogu (iimveliso, iindidi);
  • idatha ye-inventri (ibhalansi yemveliso kwiindawo zokugcina iimpahla kunye namaxabiso);
  • abathengi;
  • imiyalelo;

IMagento ibonelela ngodidi olwahlukileyo lwezinto zokuguqula idatha kwisiseko sedatha - iindawo zokugcina. Ngenxa yeenkcukacha zeMagento, ukongeza idatha kwisiseko sedatha ngokusebenzisa i-repositories kulula ukuyikhowudi, kodwa, masithi, iyacotha. Kolu papasho, ndiqwalasela amanqanaba aphambili okongeza ngokwenkqubo imveliso kwiMagento 2 ngendlela "yakudala" - usebenzisa iiklasi zerepo.

Abathengi kunye neeodolo zihlala ziphindaphindwa kwelinye icala - ukusuka eMagento ukuya kwiinkqubo zangaphandle ze-ERP. Ke, kulula kubo, kwicala leMagento kufuneka ukhethe idatha efanelekileyo, emva koko "iimbumbulu zaphuma ecaleni kwethuΒ«.

Imigaqo yokurekhoda idatha kwiziko ledatha

Okwangoku, ukudala izinto ezigcinwe kwisiseko sedatha ngokwenkqubo kwiMagento kwenziwa umzi-mveliso:

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

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

kunye nokubhalela kwiziko ledatha kwenziwa nge Repository:

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

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

Indlela ethi "Factory" kunye ne "Repository" ingasetyenziselwa zonke iimodeli eziphambili kwi-domain ye-Magento 2.

Ulwazi olusisiseko lweMveliso

Ndijonge ulwakhiwo lwedatha oluhambelana noguqulelo lweMagento 2.3. Olona lwazi lusisiseko malunga nemveliso lukwitheyibhile catalog_product_entity (ubhaliso lwemveliso):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Ndithintelwe kudidi olunye lwemveliso (type_id='simple'), uluhlu lweempawu zoyelelwano olungagqibekanga (attribute_set_id=4) kwaye ungazihoyi iimpawu has_options ΠΈ required_options. Ukusukela iimpawu entity_id, created_at ΠΈ updated_at zenziwa ngokuzenzekelayo, ke, enyanisweni, ukongeza imveliso entsha, kufuneka nje ukuseta sku. Ndenza oku:

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

kwaye ndifumana okukhethekile:

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

Ndongeza igama lemveliso kwisicelo kwaye ndifumana umyalezo wokuba uphawu lulahlekile Price. Emva kokongeza ixabiso, imveliso yongezwa kwisiseko sedatha:

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

Igama lemveliso ligcinwa kwitheyibhile yophawu lwemveliso varchar (catalog_product_entity_varchar), ixabiso - etafileni catalog_product_entity_decimal. Phambi kokuba wongeze imveliso, kuyacetyiswa ukuba ubonise ngokucacileyo ukuba sisebenzisa i-storefront solawulo ukungenisa idatha:

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

Iimpawu ezongezelelweyo

Ukusetyenzwa kweempawu ezongezelelweyo zemveliso usebenzisa iMagento kuluyolo. Imodeli yedatha ye-EAV kumaziko aphambili (jonga itheyibhile eav_entity_type) yenye yezinto eziphambili zeli qonga. Songeza ngokulula iimpawu ezifanelekileyo kwimodeli yemveliso:

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

kwaye xa ugcina imodeli ngendlela yerepo:

$repoProd->save($prod);

iimpawu ezongezelelweyo nazo ziya kugcinwa kwiitheyibhile zedatha ehambelanayo.

Idatha yoluhlu

Ngamagama alula - isixa semveliso kwisitokhwe. Kwi-Magento 2.3, izakhiwo ezikwisiseko sedatha ezichaza ifomathi yokugcina idatha ye-inventri yahluke kakhulu kwinto eyenzekayo ngaphambili. Nangona kunjalo, ukongeza ubuninzi bemveliso esitokhweni ngemodeli yemveliso akukho nzima kakhulu kunokongeza ezinye iimpawu:

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

Imidiya

Njengomthetho, inkxaso yeendaba kwimveliso yomthengi kwivenkile (i-e-yorhwebo) ihluke kwinkxaso yemidiya yemveliso efanayo kumqeshwa kwinkqubo yokugcinwa kwengxelo yangaphakathi (ERP). Kwimeko yokuqala, kuyacetyiswa ukuba ubonise imveliso ubuso ngobuso; okwesibini, kwanele ukunika umbono jikelele wemveliso. Nangona kunjalo, ukuhambisa ubuncinci umfanekiso osisiseko wemveliso kuyinto eqhelekileyo. case xa ungenisa idatha.

Xa wongeza umfanekiso ngendawo yolawulo, umfanekiso ugcinwa kuqala kulawulo lwethutyana (./pub/media/tmp/catalog/product) kwaye kuphela xa ugcino lwemveliso lusiwa kulawulo lwemidiya (./pub/media/catalog/product). Kwakhona, xa wongezwa ngephaneli yolawulo, umfanekiso uphawulwe 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);

Ngesizathu esithile, imidiya idityaniswe kuphela emva kokugcina imveliso kunye nokuyibuyisela kwindawo yokugcina kwakhona. Kwaye kufuneka uchaze uphawu label xa ufaka ingeniso kwigalari yemidiya yemveliso (ngaphandle koko sifumana ngaphandle Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Izigaba

Ngokuqhelekileyo, udidi lwesakhiwo sevenkile kunye nesicelo se-backend okanye ukubekwa kweemveliso kuzo kunokwahluka kakhulu. Amaqhinga okufuduka kwedatha malunga neendidi kunye neemveliso ngaphakathi kwazo zixhomekeke kwizinto ezininzi. Kulo mzekelo ndinamathela koku kulandelayo:

  • umva kunye neendidi zevenkile zithelekiswa namagama;
  • ukuba udidi luthathwa ngaphandle olungekho evenkileni, ngoko lwenziwa phantsi koluhlu lweengcambu (Default Category) kunye nokumiswa kwayo ngakumbi kwikhathalogu yesitora kuthathwa ngesandla;
  • imveliso yabelwe udidi kuphela xa yenziwe kwivenkile (ukungenisa okokuqala);

Ulwazi olusisiseko malunga nodidi lukwitheyibhile catalog_category_entity (ikhathalogu yamacandelo). Ukudala udidi kwiMagento:

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

Ukudibanisa imveliso kwicandelo kuqhutywa kusetyenziswa i-ID yodidi kunye nemveliso ye-SKU:

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

Iyonke

Ikhowudi yokubhala ukongeza imveliso ngokwenkqubo kwiMagento 2 kulula kakhulu. Ndidibanise yonke into echazwe ngasentla kwimodyuli yedemo "flancer32/mage2_ext_demo_import". Kukho umyalelo omnye kuphela we-console kwimodyuli fl32:import:prod, ekhuphela ngaphandle iimveliso ezichazwe kwifayile ye JSON "./etc/data/products.json":

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

Imifanekiso yokungenisa ikuluhlu ./etc/data/img.

Ixesha lokungenisa iimveliso ezili-10 usebenzisa le ndlela malunga nemizuzwana ye-10 kwi-laptop yam. Ukuba siphuhlisa le ngcamango ngakumbi, kulula ukufikelela kwisigqibo sokuba malunga neemveliso ze-3600 zingangeniswa ngeyure, kwaye kungathatha iiyure ezingama-100 ukungenisa iimveliso ze-30K. Ukutshintsha ilaptop ngeseva kukuvumela ukuba ugudise imeko ngandlel’ ithile. Mhlawumbi namaxesha amaninzi. Kodwa kungekhona ngemiyalelo yobukhulu. Mhlawumbi esi santya kunye nokucotha kwinqanaba elithile sesinye sezizathu zokuvela kweprojekthi magento/async-import.

Isisombululo esinamandla sokunyusa isantya sokungenisa impahla sinokungena ngokuthe ngqo kwisiseko sedatha, kodwa kule meko zonke "izinto ezilungileyo" malunga nokwandiswa kweMagento zilahlekile - kuya kufuneka wenze yonke into "ukuqhubela phambili" ngokwakho. Nangona kunjalo, kufanelekile. Ukuba iyasebenza, ndiya kuqwalasela indlela yokubhala ngokuthe ngqo kwi-database kwinqaku elilandelayo.

umthombo: www.habr.com

Yongeza izimvo