Magento 2: Manafatra vokatra avy amin'ny loharano ivelany

Magento dia vahaolana e-varotra, i.e. dia mikendry kokoa ny fivarotana vokatra noho ny fanatobiana entana, lozisialy na kaonty ara-bola miaraka amin'ny varotra. Ny fampiharana hafa (ohatra, rafitra ERP) dia mety kokoa amin'ny fampiharana miaraka. Noho izany, matetika amin'ny fampiharana ny fampiasana Magento dia mipoitra ny asan'ny fampidirana fivarotana amin'ireo rafitra hafa ireo (ohatra, 1C).

Amin'ny ankapobeny, ny fampidirana dia azo ahena amin'ny replication data amin'ny alΓ lan'ny:

  • katalaogy (vokatra, sokajy);
  • angon-drakitra momba ny fitahirizana (mandanjalanja ny vokatra ao amin'ny trano fanatobiana entana sy ny vidiny);
  • mpanjifa;
  • baiko;

Magento dia manolotra karazan-javatra mitokana ho an'ny fanodinkodinana angona ao amin'ny tahiry - repository. Noho ny mari-pamantarana an'i Magento, ny fampidirana angon-drakitra amin'ny angon-drakitra amin'ny alΓ lan'ny repositories dia mora ny kaody, fa aleo atao hoe miadana. Amin'ity famoahana ity dia heveriko ny dingana lehibe amin'ny fampidirana programa amin'ny Magento 2 amin'ny fomba "klasika" - mampiasa kilasy repo.

Ny mpanjifa sy ny baiko dia matetika averina amin'ny lalana hafa - manomboka amin'ny Magento mankany amin'ny rafitra ERP ivelany. Noho izany, mora kokoa amin'izy ireo izany, amin'ny lafiny Magento dia mila misafidy ny angon-drakitra mety ianao, ary avy eo "nisy bala nipoitra avy teo aminay".

Fitsipiky ny firaketana ny angona ao anaty tahiry

Amin'izao fotoana izao, ny famoronana zavatra voatahiry ao amin'ny angon-drakitra amin'ny programa amin'ny Magento dia vita Factory:

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

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

ary ny fanoratana amin'ny angon-drakitra dia atao amin'ny alΓ lan'ny repository:

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

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

Ny fomba "Factory" sy "Repository" dia azo ampiasaina amin'ny modely lehibe rehetra ao amin'ny sehatra Magento 2.

Fampahafantarana fototra momba ny vokatra

Mijery firafitry ny angon-drakitra mifanaraka amin'ny kinova Magento 2.3 aho. Ny fampahalalana fototra indrindra momba ny vokatra dia eo amin'ny latabatra catalog_product_entity (Rejistra vokatra):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Voafetra amin'ny karazana vokatra iray aho (type_id='simple'), andiana toetra amam-panahy (attribute_set_id=4) ary tsy miraharaha ny toetra has_options ΠΈ required_options. Satria ny toetra entity_id, created_at ΠΈ updated_at dia novokarina ho azy, avy eo, raha ny marina, mba hanampiana vokatra vaovao, dia mila mametraka fotsiny sku. manao izao aho:

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

ary mahazo exception aho:

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

Manampy ny anaran'ny vokatra amin'ny fangatahana aho ary mahazo hafatra fa tsy ampy ilay toetra Price. Aorian'ny fampidirana ny vidiny dia ampidirina amin'ny tahiry ny vokatra:

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

Ny anaran'ny vokatra dia voatahiry ao amin'ny latabatra toetran'ny vokatra varchar (catalog_product_entity_varchar), vidiny - eo amin'ny latabatra catalog_product_entity_decimal. Alohan'ny hampidirana vokatra dia tsara ny milaza mazava tsara fa mampiasa ny fivarotana administratif izahay hanafatra angona:

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

Toetra fanampiny

Ny fanodinana ireo toetran'ny vokatra fanampiny amin'ny fampiasana Magento dia fahafinaretana. Modely angona EAV ho an'ny sampana lehibe (jereo ny latabatra eav_entity_type) dia iray amin'ireo singa fototra amin'ity sehatra ity. Ampio fotsiny ireo toetra mifanaraka amin'ny modely vokatra izahay:

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

ary rehefa mitahiry ny modely amin'ny alΓ lan'ny repo object:

$repoProd->save($prod);

ireo toetra fanampiny dia hotehirizina ao amin'ny tabilao angon-drakitra mifanaraka amin'izany.

Angon-drakitra momba ny fitahirizana

Amin'ny teny tsotra - ny habetsahan'ny vokatra ao amin'ny tahiry. Ao amin'ny Magento 2.3, ny rafitra ao amin'ny angon-drakitra izay mamaritra ny endrika fitahirizana angon-drakitra dia hafa tanteraka avy amin’izay nitranga teo aloha. Na izany aza, ny fampidirana ny habetsaky ny vokatra ao anaty tahiry amin'ny alΓ lan'ny modely vokatra dia tsy sarotra kokoa noho ny manampy toetra hafa:

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

Media

Amin'ny maha-fitsipika azy, ny fanohanan'ny media ho an'ny vokatra ho an'ny mpanjifa ao amin'ny fivarotana iray (e-varotra) dia tsy mitovy amin'ny fanohanan'ny media ho an'ny vokatra iray ihany ho an'ny mpiasa ao amin'ny rafitra kaonty anatiny (ERP). Amin'ny tranga voalohany dia tsara ny mampiseho ny vokatra mifanatrika, amin'ny faharoa dia ampy ny manome hevitra ankapobeny momba ny vokatra. Na izany aza, matetika ny famindrana ny sary voalohany indrindra amin'ny vokatra iray. case rehefa manafatra data.

Rehefa manampy sary amin'ny alΓ lan'ny tontonana admin dia voatahiry ao anaty lahatahiry vonjimaika aloha ilay sary (./pub/media/tmp/catalog/product) ary rehefa mitahiry ny vokatra dia afindra any amin'ny lahatahiry fampitam-baovao (./pub/media/catalog/product). Ary koa, rehefa ampiana amin'ny alΓ lan'ny tontonana admin, dia misy marika ny sary 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);

Noho ny antony sasany, ny haino aman-jery dia tsy mifandray afa-tsy rehefa avy nitahiry voalohany ny vokatra sy naka azy tao amin'ny tahiry indray. Ary mila mamaritra ny toetra label rehefa manampy fidirana amin'ny galeran'ny haino aman-jery vokatra (raha tsy izany dia mahazo maningana isika Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

sokajy

Matetika, ny firafitry ny sokajy amin'ny fivarotana sy ny fampiharana backend na ny fametrahana ny vokatra ao aminy dia mety tsy mitovy. Miankina amin'ny lafin-javatra maro ny paik'ady mifindra monina momba ny sokajy sy ny vokatra ao anatiny. Amin'ity ohatra ity dia mifikitra amin'ireto manaraka ireto aho:

  • ampitahaina amin'ny anarana ny sokajy backend sy fivarotana;
  • raha misy sokajy nafarana tsy ao amin'ny fivarotana, dia noforonina eo ambanin'ny sokajy faka (Default Category) ary ny fametrahana azy bebe kokoa ao amin'ny katalaogin'ny fivarotana dia raisina amin'ny tanana;
  • ny vokatra dia voatendry amin'ny sokajy raha tsy noforonina tao amin'ny fivarotana (fanafarana voalohany);

Ny fampahalalana fototra momba ny sokajy dia eo amin'ny latabatra catalog_category_entity (katalaogin'ny sokajy). Mamorona sokajy ao amin'ny Magento:

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

Ny fampifandraisana vokatra amin'ny sokajy iray dia atao amin'ny alΓ lan'ny ID sokajy sy SKU vokatra:

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

Π˜Ρ‚ΠΎΠ³ΠΎ

Ny fanoratana kaody hanampiana vokatra amin'ny programa amin'ny Magento 2 dia mora. Natambaiko tao anaty module demo avokoa ny voalaza etsy ambony β€œflancer32/mage2_ext_demo_import". Iray ihany ny baiko console ao amin'ny module fl32:import:prod, izay manafatra ireo vokatra voalaza ao amin'ny rakitra JSON "./etc/data/products.json':

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

Ao amin'ny katalaogy ny sary nafarana ./etc/data/img.

Ny fotoana hanafatra vokatra 10 amin'ny fampiasana an'io fomba io dia eo amin'ny 10 segondra eo amin'ny solosainako. Raha avelantsika bebe kokoa io hevitra io, dia mora ny manatsoaka hevitra fa eo amin'ny 3600 eo ho eo ny vokatra azo ampidirina isan'ora, ary afaka 100 ora eo ho eo ny fanafarana vokatra 30K. Ny fanoloana solosaina finday amin'ny mpizara dia ahafahanao manamaivana ny toe-javatra. Mety imbetsaka mihitsy aza. Saingy tsy amin'ny baiko lehibe. Angamba io hafainganam-pandeha sy fahamaizana io angamba no iray amin'ireo antony nipoiran'ny tetikasa magento/async-import.

Vahaolana mahery vaika hampitomboana ny hafainganam-pandehan'ny fanafarana dia mety ho fidirana mivantana amin'ny angon-drakitra, fa amin'ity tranga ity dia very avokoa ny "tsara" momba ny fanitarana an'i Magento - tsy maintsy manao ny zava-drehetra "mandroso" ianao. Na izany aza, mendrika izany. Raha mandaitra izany, dia handinika ny fomba fiasa amin'ny fanoratana mivantana amin'ny angon-drakitra aho ao amin'ny lahatsoratra manaraka.

Source: www.habr.com

Add a comment