Magento 2: Kulowetsa Zogulitsa kuchokera Kunja Zakunja

Magento ndi yankho la e-commerce, i.e. cholinga chake ndi kugulitsa zinthu kuposa kusungitsa zinthu, zogulira kapena zowerengera zachuma zomwe zimatsagana ndi malonda. Mapulogalamu ena (mwachitsanzo, machitidwe a ERP) ali oyenererana ndi mapulogalamu omwe atsagana nawo. Chifukwa chake, nthawi zambiri pakugwiritsa ntchito Magento ntchito yophatikizira sitolo ndi machitidwe ena (mwachitsanzo, 1C) imapezeka.

Kwakukulukulu, kuphatikiza kumatha kuchepetsedwa kukhala kubwereza kwa data ndi:

  • catalog (zogulitsa, magulu);
  • deta yazinthu (mabanki azinthu m'malo osungiramo zinthu ndi mitengo);
  • makasitomala;
  • malamulo;

Magento amapereka gulu lapadera la zinthu zosinthira deta mu nkhokwe - nkhokwe. Chifukwa cha tsatanetsatane wa Magento, kuwonjezera deta ku database kudzera m'mabuku ndikosavuta kulemba, koma, tinene, pang'onopang'ono. M'bukuli, ndikuwona magawo akulu owonjezera malonda ku Magento 2 mwanjira "yachikale" - pogwiritsa ntchito makalasi a repo.

Makasitomala ndi maoda nthawi zambiri amatsatiridwa mbali ina - kuchokera ku Magento kupita ku machitidwe akunja a ERP. Chifukwa chake, ndizosavuta ndi iwo, kumbali ya Magento mumangofunika kusankha deta yoyenera, kenako "zipolopolo zinawuluka kumbali yathu".

Mfundo zojambulira deta mu database

Pakadali pano, kupanga zinthu zosungidwa mu database mwadongosolo ku Magento kumachitika Factory:

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

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

ndipo kulembera ku database kumachitika kudzera Repository:

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

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

Njira ya "Factory" ndi "Repository" ingagwiritsidwe ntchito pamitundu yonse yayikulu mu domain la Magento 2.

Zambiri Zazinthu Zoyambira

Ndikuyang'ana dongosolo la data lomwe likufanana ndi Magento 2.3. Mfundo zofunika kwambiri za mankhwala zili patebulo catalog_product_entity (kaundula wazinthu):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Ndili ndi mtundu umodzi wazinthu (type_id='simple'), mndandanda wazinthu zosasinthika (attribute_set_id=4) ndi kunyalanyaza makhalidwe has_options ΠΈ required_options. Popeza makhalidwe entity_id, created_at ΠΈ updated_at amapangidwa zokha, ndiye kuti, kuwonjezera chinthu chatsopano, timangofunika kukhazikitsa sku. Ndichita izi:

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

ndipo ndimapeza chosiyana:

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

Ndimawonjezera dzina lachidziwitso ku pempho ndikupeza uthenga woti chikhalidwecho chikusowa Price. Pambuyo powonjezera mtengo, malondawo amawonjezedwa ku database:

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

Dzina lazogulitsa limasungidwa mu tebulo lachidziwitso cha varchar (catalog_product_entity_varchar), mtengo - patebulo catalog_product_entity_decimal. Musanawonjeze chinthu, ndi bwino kuwonetsa kuti tikugwiritsa ntchito malo osungiramo zinthu zakale kulowetsa deta:

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

Makhalidwe Owonjezera

Kukonza zina zowonjezera zogulitsa pogwiritsa ntchito Magento ndikosangalatsa. Mtundu wa data wa EAV wamabungwe akuluakulu (onani tebulo eav_entity_type) ndi chimodzi mwazinthu zofunika kwambiri papulatifomu. Timangowonjezera zomwe zili zoyenera pamtundu wazinthu:

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

ndi posunga chitsanzo kudzera pa chinthu cha repo:

$repoProd->save($prod);

zina zowonjezera zidzasungidwanso m'matebulo a database yofananira.

Deta yazinthu

M'mawu osavuta - kuchuluka kwa mankhwala mu katundu. Mu Magento 2.3, zomanga mu nkhokwe zomwe zimalongosola mawonekedwe osungiramo zinthu zomwe zili zosiyana kwambiri kuchokera ku zomwe zidachitika kale. Komabe, kuwonjezera kuchuluka kwa zinthu zomwe zili mgululi kudzera pamtundu wazinthu sizovuta kwambiri kuposa kuwonjezera zina:

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

Media

Monga lamulo, kuthandizira pawailesi pazamalonda kwa kasitomala mu sitolo (e-commerce) kumasiyana ndi chithandizo cha media pazogulitsa zomwezo kwa wogwira ntchito mu accounting yamkati (ERP). Poyamba, ndikofunikira kuwonetsa chinthucho maso ndi maso; chachiwiri, ndikwanira kupereka lingaliro lazogulitsa. Komabe, kusamutsa chithunzi choyambirira cha chinthu ndikofala. case poitanitsa deta.

Mukawonjezera chithunzi kudzera pagulu la admin, chithunzicho chimasungidwa koyamba pakanthawi kochepa (./pub/media/tmp/catalog/product) ndipo pokhapo pomwe kusungirako kumasunthidwa ku chikwatu cha media (./pub/media/catalog/product). Komanso, mukawonjezedwa kudzera pagawo la admin, chithunzicho chimayikidwa 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);

Pazifukwa zina, zoulutsira mawu zimalumikizidwa pokhapokha mutasunga zogulitsazo ndikuzitenganso kuchokera kunkhokwe kachiwiri. Ndipo muyenera kufotokoza khalidwe label powonjezera cholowera ku media media gallery (kupanda kutero timapeza chosiyana Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Zigawo

Nthawi zambiri, kapangidwe ka sitolo ndi ntchito yakumbuyo kapena kuyika kwazinthu mkati mwake kumatha kusiyana kwambiri. Njira zosinthira deta zamagulu ndi zinthu zomwe zili mkati mwake zimatengera zinthu zambiri. Mu chitsanzo ichi ndimamatira ku izi:

  • magawo a backend ndi sitolo amafananizidwa ndi dzina;
  • ngati gulu latumizidwa kunja lomwe silili mu sitolo, ndiye kuti limapangidwa pansi pa gulu la mizu (Default Category) ndi kuyika kwake kwina mu kalozera wa sitolo kumaganiziridwa pamanja;
  • mankhwala amaperekedwa ku gulu pokhapokha atapangidwa m'sitolo (kulowetsa koyamba);

Zambiri za gululi zili patebulo catalog_category_entity (katundu wamagulu). Kupanga gulu ku Magento:

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

Kulumikiza chinthu kugulu kumachitika pogwiritsa ntchito ID ya gulu ndi SKU yazinthu:

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

Chiwerengero

Kulemba kuti muwonjezere chinthu mwadongosolo ku Magento 2 ndikosavuta. Ndaphatikiza zonse zomwe zanenedwa pamwambapa kukhala gawo lachiwonetsero "flancer32/mage2_ext_demo_import". Pali lamulo limodzi lokha la console mu module fl32:import:prod, yomwe imalowetsa zinthu zomwe zafotokozedwa mufayilo ya JSON "./etc/data/products.json":

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

Zithunzi zotumizidwa kunja zili m'ndandanda ./etc/data/img.

Nthawi yotumizira zinthu 10 pogwiritsa ntchito njirayi ndi pafupifupi masekondi 10 pa laputopu yanga. Tikakulitsa ganizoli, ndizosavuta kunena kuti zinthu pafupifupi 3600 zitha kutumizidwa kunja pa ola limodzi, ndipo zitha kutenga pafupifupi maola 100 kuitanitsa zinthu 30K. Kusintha laputopu ndi seva kumakupatsani mwayi wowongolera zinthu mwanjira ina. Mwinanso kangapo. Koma osati mwa kulamula kwakukulu. Mwina kuthamanga ndi kuchedwa kumeneku ndi chimodzi mwa zifukwa zomwe polojekitiyi ikuwonekera magento/async-import.

Yankho lalikulu kuti muwonjezere liwiro la kulowetsa kunja kungakhale kulowa mwachindunji mu database, koma pakadali pano zonse "zabwino" zokhudzana ndi kufalikira kwa Magento zatayika - muyenera kuchita zonse "zotsogola" nokha. Komabe, m'poyenera. Ngati izo zikuyenda bwino, ine ndilingalira njira ndi kulemba mwachindunji Nawonso achichepere m'nkhani yotsatira.

Source: www.habr.com

Kuwonjezera ndemanga