I-Magento 2: Ukungenisa Imikhiqizo Evela Kumithombo Yangaphandle

IMagento iyisixazululo se-e-commerce, i.e. ihloselwe kakhulu ukuthengisa imikhiqizo kunasekugcineni impahla, ukuhlelwa kwempahla noma ukubalwa kwezimali okuhambisana nokuthengiswa. Ezinye izinhlelo zokusebenza (isibonelo, izinhlelo ze-ERP) zifaneleka kangcono izinhlelo zokusebenza ezihambisanayo. Ngakho-ke, ngokuvamile kumkhuba wokusebenzisa i-Magento umsebenzi wokuhlanganisa isitolo nalezi ezinye izinhlelo (isibonelo, i-1C) ivela.

Ngokuvamile, ukuhlanganiswa kungancishiselwa ekuphindaphindweni kwedatha ngokuthi:

  • ikhathalogi (imikhiqizo, izigaba);
  • idatha yokusungula (izilinganiso zomkhiqizo ezinqolobaneni namanani);
  • amaklayenti;
  • imiyalo;

I-Magento inikeza ikilasi elihlukile lezinto zokukhohlisa idatha kusizindalwazi - izinqolobane. Ngenxa yemininingwane ye-Magento, ukwengeza idatha ku-database ngokusebenzisa amakhosombe kulula ukukubhala, kodwa, ake sithi, kuhamba kancane. Kule ncwadi, ngibheka izigaba eziyinhloko zokwengeza umkhiqizo ngokuhlelekile ku-Magento 2 ngendlela "yakudala" - usebenzisa amakilasi e-repo.

Amakhasimende nama-oda ngokuvamile aphindaphindwa ngakolunye uhlangothi - ukusuka ku-Magento kuya ezinhlelweni zangaphandle ze-ERP. Ngakho-ke, kulula ngabo, ohlangothini lwe-Magento udinga nje ukukhetha idatha efanele, bese β€œkwaphuma izinhlamvu eceleni kwethu".

Izimiso zokurekhoda idatha kusizindalwazi

Okwamanje, ukudala izinto ezilondolozwe kusizindalwazi ngokuhlelekile ku-Magento kwenziwa ngokusebenzisa Factory:

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

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

nokubhalela kusizindalwazi kwenziwa ngokusebenzisa Igumbi:

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

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

Indlela "Yemboni" kanye "Nendawo yokugcina" ingasetshenziswa kuwo wonke amamodeli amakhulu esizindeni se-Magento 2.

Ulwazi Lomkhiqizo Oluyisisekelo

Ngibheka isakhiwo sedatha esifana nenguqulo ye-Magento 2.3. Ulwazi oluyisisekelo kakhulu ngomkhiqizo lusethebulani catalog_product_entity (ukubhaliswa komkhiqizo):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Ngikhawulelwe ohlotsheni olulodwa lomkhiqizo (type_id='simple'), isethi yezimfanelo ezizenzakalelayo (attribute_set_id=4) futhi ungaziba izici has_options ΠΈ required_options. Kusukela izimfanelo entity_id, created_at ΠΈ updated_at akhiqizwa ngokuzenzakalela, ngakho-ke, empeleni, ukwengeza umkhiqizo omusha, sidinga ukusetha sku. Ngenza lokhu:

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

futhi ngithola okuhlukile:

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

Ngengeza igama lomkhiqizo esicelweni bese ngithola umlayezo wokuthi isibaluli asikho Price. Ngemva kokwengeza intengo, umkhiqizo wengezwa kusizindalwazi:

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

Igama lomkhiqizo ligcinwe kuthebula lesichasiso lomkhiqizo (catalog_product_entity_varchar), intengo - etafuleni catalog_product_entity_decimal. Ngaphambi kokwengeza umkhiqizo, kuyatuseka ukuthi sikhombise ngokusobala ukuthi sisebenzisa ingaphambili lesitolo sokuphatha ukungenisa idatha:

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

Izibaluli Ezengeziwe

Ukucubungula izici zomkhiqizo ezengeziwe usebenzisa i-Magento kuyintokozo. Imodeli yedatha ye-EAV yamabhizinisi amakhulu (bona ithebula eav_entity_type) ingesinye sezici ezibalulekile zale nkundla. Simane sengeze izibaluli ezifanele kumodeli yomkhiqizo:

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

futhi lapho ulondoloza imodeli ngento ye-repo:

$repoProd->save($prod);

izibaluli ezengeziwe nazo zizogcinwa kumathebula esizindalwazi ahambisanayo.

Idatha yokusungula

Ngamagama alula - inani lomkhiqizo esitokisini. Ku-Magento 2.3, izakhiwo kusizindalwazi ezichaza ifomethi yokugcina idatha ye-inventory ehluke kakhulu kulokho okwenzeka ngaphambili. Kodwa-ke, ukwengeza inani lomkhiqizo esitokweni ngemodeli yomkhiqizo akunzima kakhulu kunokwengeza ezinye izici:

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

Abezindaba

Njengomthetho, ukusekelwa kwemidiya komkhiqizo weklayenti esitolo (i-e-commerce) kuyahluka ekusekelweni kwabezindaba komkhiqizo ofanayo wesisebenzi esikuhlelo lwangaphakathi lokubala (ERP). Esimweni sokuqala, kuhle ukukhombisa umkhiqizo ubuso nobuso; okwesibili, kwanele ukunikeza umbono ojwayelekile womkhiqizo. Nokho, ukudlulisa okungenani isithombe esiyinhloko somkhiqizo kuvame kakhulu. case lapho ungenisa idatha.

Lapho wengeza isithombe ngephaneli yomqondisi, isithombe sigcinwa kuqala kuhla lwemibhalo lwesikhashana (./pub/media/tmp/catalog/product) futhi kuphela lapho ukugcinwa komkhiqizo kuhanjiswa kumkhombandlela wemidiya (./pub/media/catalog/product). Futhi, uma sengezwe ngephaneli yomqondisi, isithombe siyamakwa 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 ixhunyaniswa kuphela ngemva kokugcina umkhiqizo kanye nokuwukhipha endaweni yokugcina futhi. Futhi udinga ukucacisa isibaluli label lapho ungeza okungenayo kugalari yemidiya yomkhiqizo (uma kungenjalo sithola okuhlukile Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Isigaba

Ngokuvamile, isakhiwo sesigaba sesitolo kanye nesicelo esingemuva noma ukubekwa kwemikhiqizo kuzo kungahluka kakhulu. Amasu okuthutha idatha mayelana nezigaba nemikhiqizo engaphakathi kuzo ancike ezintweni eziningi. Kulesi sibonelo nginamathela kokulandelayo:

  • izigaba ze-backend nezitolo ziqhathaniswa namagama;
  • uma isigaba singenisiwe esingekho esitolo, bese sidalwa ngaphansi kwesigaba sempande (Default Category) futhi ukuma kwayo okwengeziwe kukhathalogi yesitolo kuthathwa mathupha;
  • umkhiqizo wabelwe isigaba kuphela uma udalwe esitolo (ukungenisa kokuqala);

Ulwazi oluyisisekelo mayelana nesigaba lukuthebula catalog_category_entity (ikhathalogi yezigaba). Ukudala isigaba e-Magento:

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

Ukuxhumanisa umkhiqizo nesigaba kwenziwa kusetshenziswa i-ID yesigaba kanye ne-SKU yomkhiqizo:

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

Inani

Ikhodi yokubhala ukwengeza umkhiqizo ngokohlelo ku-Magento 2 kulula kakhulu. Ngihlanganise konke okushiwo ngenhla kumojula yedemo β€œflancer32/mage2_ext_demo_import". Kukhona umyalo owodwa kuphela wekhonsoli kumojula fl32:import:prod, engenisa imikhiqizo echazwe kufayela le-JSON "./etc/data/products.json":

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

Izithombe ezingeniswayo zikukhathalogi ./etc/data/img.

Isikhathi sokungenisa imikhiqizo eyi-10 usebenzisa le ndlela cishe imizuzwana eyi-10 kukhompyutha yami ephathekayo. Uma sithuthukisa lo mbono ngokuqhubekayo, kulula ukufinyelela esiphethweni sokuthi cishe imikhiqizo engu-3600 ingangeniswa ngehora, futhi kungathatha cishe amahora angu-100 ukungenisa imikhiqizo engu-30K. Ukushintsha ikhompuyutha ephathekayo ngeseva kukuvumela ukuthi ulungise isimo kancane. Mhlawumbe ngisho izikhathi eziningana. Kodwa hhayi ngemiyalo yobukhulu. Mhlawumbe lesi sivinini kanye nokunensa ngokwezinga elithile kungesinye sezizathu zokuvela komsebenzi i-magento/async-import.

Isixazululo esiqinile sokwandisa isivinini sokungenisa kungaba ukungena ngokuqondile kusizindalwazi, kodwa kulokhu zonke "izinto ezinhle" eziphathelene nokwandiswa kweMagento zilahlekile - kuzodingeka wenze konke "okuthuthukisiwe" ngokwakho. Nokho, kuyafaneleka. Uma kusebenza, ngizocabangela indlela yokubhala ngokuqondile ku-database esihlokweni esilandelayo.

Source: www.habr.com

Engeza amazwana