Magento 2: Flytja inn vörur frá ytri aðilum

Magento er rafræn viðskiptalausn, þ.e. miðar frekar að sölu á vörum en að vörugeymslu, vörustjórnun eða fjárhagsbókhaldi sem fylgir sölu. Önnur forrit (til dæmis ERP kerfi) henta betur fyrir meðfylgjandi forrit. Þess vegna, oft þegar þú notar Magento, kemur upp það verkefni að samþætta verslun með þessum öðrum kerfum (til dæmis 1C).

Í stórum dráttum er hægt að minnka samþættingu í gagnaafritun með því að:

  • vörulisti (vörur, flokkar);
  • birgðagögn (vörustöður í vöruhúsum og verð);
  • viðskiptavinir;
  • pantanir;

Magento býður upp á sérstakan flokk af hlutum til að vinna með gögn í gagnagrunninum - geymslum. Vegna sérstöðu Magento er auðvelt að kóða að bæta gögnum við gagnagrunninn í gegnum geymslur, en það er, við skulum segja, hægt. Í þessu riti velti ég fyrir mér helstu stigum þess að forritalega bæta vöru við Magento 2 á „klassískan“ hátt - með því að nota endurhverfa flokka.

Viðskiptavinir og pantanir eru venjulega endurteknar í hina áttina - frá Magento til ytri ERP kerfa. Þess vegna er það auðveldara með þá, á Magento hliðinni þarftu bara að velja viðeigandi gögn og síðan "kúlur flugu út frá hlið okkar".

Meginreglur um skráningu gagna í gagnagrunn

Í augnablikinu er búið til hluti sem vistaðir eru í gagnagrunninum á dagskrá í Magento Factory:

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

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

og skrifað er í gagnagrunninn í gegnum Geymsla:

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

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

Hægt er að nota „Factory“ og „Repository“ nálgunina fyrir allar helstu gerðir á Magento 2 léninu.

Grunnupplýsingar um vöru

Ég er að skoða gagnaskipulag sem passar við Magento 2.3 útgáfuna. Helstu upplýsingar um vöruna eru í töflunni catalog_product_entity (vöruskrá):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Ég er takmörkuð við eina vörutegund (type_id='simple'), sett af sjálfgefnum eiginleikum (attribute_set_id=4) og hunsa eiginleika has_options и required_options. Þar sem eiginleikar entity_id, created_at и updated_at eru búnar til sjálfkrafa, þá, í ​​raun, til að bæta við nýrri vöru, þurfum við bara að stilla sku. Ég geri þetta:

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

og ég fæ undantekningu:

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

Ég bæti vöruheitinu við beiðnina og fæ skilaboð um að eiginleikann vanti Price. Eftir að verð hefur verið bætt við er vörunni bætt við gagnagrunninn:

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

Vöruheitið er geymt í vöru varchar eigindatöflunni (catalog_product_entity_varchar), verð - í töflunni catalog_product_entity_decimal. Áður en vöru er bætt við er ráðlegt að gefa skýrt til kynna að við séum að nota stjórnunarverslun til að flytja inn gögn:

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

Viðbótar eiginleikar

Það er ánægjulegt að vinna úr viðbótareiginleikum vöru með Magento. EAV gagnalíkan fyrir helstu einingar (sjá töflu eav_entity_type) er einn af lykileiginleikum þessa vettvangs. Við bætum einfaldlega viðeigandi eiginleikum við vörulíkanið:

$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// или
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);

og þegar líkanið er vistað í gegnum endursöluhlutinn:

$repoProd->save($prod);

viðbótareiginleikar verða einnig geymdir í samsvarandi gagnagrunnstöflum.

Birgðagögn

Í einföldu máli - magn vöru á lager. Í Magento 2.3 eru mannvirki í gagnagrunninum sem lýsa sniði til að geyma birgðagögn verulega mismunandi frá því sem gerðist áður. Hins vegar er ekki miklu erfiðara að bæta við magni vöru á lager í gegnum vörulíkanið en að bæta við öðrum eiginleikum:

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

Fjölmiðlar

Að jafnaði er fjölmiðlastuðningur fyrir vöru fyrir viðskiptavin í verslun (rafræn viðskipti) frábrugðin fjölmiðlastuðningi við sömu vöru fyrir starfsmann í innra bókhaldskerfi (ERP). Í fyrra tilvikinu er ráðlegt að sýna vöruna augliti til auglitis; í því síðara er nóg til að gefa almenna hugmynd um vöruna. Hins vegar er nokkuð algengt að flytja að minnsta kosti aðalmynd vörunnar. case við innflutning gagna.

Þegar mynd er bætt við í gegnum stjórnborðið er myndin fyrst vistuð í tímabundinni möppu (./pub/media/tmp/catalog/product) og aðeins þegar varan er vistuð er hún færð í fjölmiðlaskrána (./pub/media/catalog/product). Einnig, þegar henni er bætt við í gegnum stjórnborðið, er myndin merkt 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);

Af einhverjum ástæðum er miðillinn aðeins tengdur eftir að fyrst hefur verið vistað vöruna og sótt hana úr geymslunni. Og þú þarft að tilgreina eiginleikann label þegar færslu er bætt við fjölmiðlagallerí vörunnar (annars fáum við undantekningu Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Категории

Oft getur flokkaskipan verslunarinnar og bakendaforritið eða staðsetning vara í þeim verið verulega mismunandi. Aðferðir til að flytja gögn um flokka og vörur innan þeirra eru háðar mörgum þáttum. Í þessu dæmi held ég mig við eftirfarandi:

  • bakenda- og verslunarflokkar eru bornir saman eftir nafni;
  • ef flokkur er fluttur inn sem er ekki í verslun, þá er hann búinn til undir rótarflokknum (Default Category) og gert er ráð fyrir frekari staðsetningu hennar í verslunarskránni handvirkt;
  • vöru er aðeins sett í flokk þegar hún er búin til í versluninni (fyrsti innflutningur);

Grunnupplýsingar um flokkinn eru í töflunni catalog_category_entity (skrá yfir flokka). Búa til flokk í Magento:

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

Að tengja vöru við flokk fer fram með því að nota flokkauðkenni og vörunúmer:

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

Alls

Það er frekar auðvelt að skrifa kóða til að bæta vöru forritað við Magento 2. Ég hef sameinað allt sem sagt er hér að ofan í kynningareiningu “flancer32/mage2_ext_demo_import". Það er aðeins ein stjórnborðsskipun í einingunni fl32:import:prod, sem flytur inn vörurnar sem lýst er í JSON skránni "./etc/data/products.json":

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

Myndir til innflutnings eru í vörulistanum ./etc/data/img.

Tíminn til að flytja inn 10 vörur með þessari aðferð er um 10 sekúndur á fartölvunni minni. Ef við þróum þessa hugmynd áfram er auðvelt að komast að þeirri niðurstöðu að hægt sé að flytja inn um 3600 vörur á klukkustund og það getur tekið um 100 klukkustundir að flytja inn 30 þúsund vörur. Að skipta um fartölvu fyrir netþjón gerir þér kleift að jafna ástandið nokkuð. Kannski jafnvel nokkrum sinnum. En ekki eftir stærðargráðum. Kannski er þessi hraði og seinleiki að einhverju leyti ein af ástæðunum fyrir tilkomu verkefnisins magento/async-innflutningur.

Róttæk lausn til að auka innflutningshraða gæti verið bein innsláttur í gagnagrunninn, en í þessu tilfelli glatast allt „dágæði“ varðandi Magento stækkanleika - þú verður að gera allt sem er „framfarið“ sjálfur. Hins vegar er það þess virði. Ef það gengur eftir mun ég íhuga nálgunina með beinum skrifum í gagnagrunninn í næstu grein.

Heimild: www.habr.com

Bæta við athugasemd