Magento 2: Enpòte pwodwi ki soti nan sous ekstèn

Magento se yon solisyon e-commerce, i.e. se plis ki vize a vann pwodwi pase nan depo, lojistik oswa kontablite finansye akonpaye lavant yo. Lòt aplikasyon yo (pa egzanp, sistèm ERP) yo pi byen adapte pou aplikasyon ki akonpaye yo. Se poutèt sa, byen souvan nan pratik nan lè l sèvi avèk Magento travay la nan entegre yon magazen ak lòt sistèm sa yo (pa egzanp, 1C) rive.

An jeneral, entegrasyon ka redwi a replikasyon done pa:

  • katalòg (pwodwi, kategori);
  • done envantè (balans pwodwi nan depo ak pri);
  • kliyan;
  • lòd;

Magento ofri yon klas separe nan objè pou manipile done nan baz done a - depo. Akòz spesifik yo nan Magento, ajoute done nan baz done a atravè depo se fasil kòd, men li se, an n di, ralanti. Nan piblikasyon sa a, mwen konsidere etap prensipal yo nan pwogramasyon ajoute yon pwodwi nan Magento 2 nan fason "klasik la" - lè l sèvi avèk klas repo.

Kliyan ak lòd yo anjeneral repwodui nan lòt direksyon an - soti nan Magento nan sistèm ERP ekstèn. Se poutèt sa, li pi fasil ak yo, sou bò Magento ou jis bezwen chwazi done ki apwopriye yo, ak Lè sa a "bal vole soti bò kote nou".

Prensip anrejistreman done nan yon baz done

Nan moman sa a, se kreye objè ki sove nan baz done a pwogramasyon nan Magento faktori:

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

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

epi ekri nan baz done a se fè nan Repository:

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

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

Apwòch "Faktory" ak "Repository" ka itilize pou tout gwo modèl nan domèn Magento 2.

Enfòmasyon debaz sou pwodwi

Mwen gade yon estrikti done ki matche ak vèsyon Magento 2.3. Enfòmasyon ki pi fondamantal sou pwodwi a se nan tablo a catalog_product_entity (rejis pwodwi):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Mwen limite a yon sèl kalite pwodwi (type_id='simple'), yon seri atribi default (attribute_set_id=4) epi inyore atribi yo has_options и required_options. Depi atribi yo entity_id, created_at и updated_at yo pwodwi otomatikman, lè sa a, an reyalite, ajoute yon nouvo pwodwi, nou jis bezwen mete sku. Mwen fè sa:

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

epi mwen jwenn yon eksepsyon:

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

Mwen ajoute non pwodwi a nan demann lan epi mwen jwenn yon mesaj ke atribi a manke Price. Apre yo fin ajoute pri a, yo ajoute pwodwi a nan baz done a:

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

Non pwodwi a estoke nan tablo atribi varchar pwodwi a (catalog_product_entity_varchar), pri - nan tablo a catalog_product_entity_decimal. Anvan ou ajoute yon pwodwi, li rekòmande pou endike klèman ke nou ap itilize devan magazen administratif la pou enpòte done:

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

Lòt Atribi

Pwosesis lòt atribi pwodwi lè l sèvi avèk Magento se yon plezi. Modèl done EAV pou antite prensipal yo (gade tablo eav_entity_type) se youn nan karakteristik kle platfòm sa a. Nou tou senpleman ajoute atribi ki apwopriye yo nan modèl pwodwi a:

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

ak lè sove modèl la atravè objè repo a:

$repoProd->save($prod);

atribi adisyonèl yo pral estoke tou nan tab baz done korespondan yo.

Done envantè

An tèm senp - kantite pwodwi nan stock. Nan Magento 2.3, estrikti nan baz done a ki dekri fòma pou estoke done envantè yo siyifikativman diferan soti nan sa ki te pase anvan. Sepandan, ajoute kantite yon pwodwi nan stock atravè modèl pwodwi a pa pi difisil pase ajoute lòt atribi:

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

Medya

Kòm yon règ, sipò medya pou yon pwodwi pou yon kliyan nan yon magazen (e-commerce) diferan de sipò medya pou menm pwodwi a pou yon anplwaye nan yon sistèm kontablite entèn (ERP). Nan premye ka a, li se rekòmande yo montre pwodwi a fas a fas; nan dezyèm lan, li se ase yo bay yon lide jeneral sou pwodwi a. Sepandan, transfere omwen imaj prensipal la nan yon pwodwi se byen komen. case lè w ap enpòte done yo.

Lè w ajoute yon imaj atravè panèl admin, imaj la premye sove nan yon anyè tanporè (./pub/media/tmp/catalog/product) epi sèlman lè yo sove pwodwi a deplase nan anyè medya a (./pub/media/catalog/product). Epitou, lè yo ajoute atravè panèl admin, imaj la make 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);

Pou kèk rezon, medya yo lye sèlman apre premye sove pwodwi a ak rekipere li nan depo a ankò. Epi ou bezwen presize atribi a label lè w ajoute yon antre nan galri medya pwodwi a (otreman nou jwenn yon eksepsyon Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Категории

Souvan, estrikti nan kategori nan magazen an ak aplikasyon an backend oswa plasman nan pwodwi nan yo ka diferan anpil. Estrateji pou migrasyon done sou kategori ak pwodwi nan yo depann de anpil faktè. Nan egzanp sa a mwen rete sou sa ki annapre yo:

  • kategori backend ak magazen yo konpare pa non;
  • si se yon kategori enpòte ki pa nan magazen an, Lè sa a, li kreye anba kategori rasin lan (Default Category) ak pozisyon plis li yo nan katalòg magazen an sipoze manyèlman;
  • se yon pwodwi asiyen nan yon kategori sèlman lè li kreye nan magazen an (premye enpòte);

Enfòmasyon debaz sou kategori a nan tablo a catalog_category_entity (katalòg kategori). Kreye yon kategori nan Magento:

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

Lyen yon pwodwi ak yon kategori fèt lè l sèvi avèk kategori ID ak SKU pwodwi:

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

Nan total

Ekri kòd pou ajoute yon pwodwi pwogramasyon nan Magento 2 se byen fasil. Mwen konbine tout sa ki endike anwo a nan yon modil Demo "flancer32/mage2_ext_demo_import". Gen yon sèl lòd konsole nan modil la fl32:import:prod, ki enpòte pwodwi yo dekri nan dosye JSON "./etc/data/products.json":

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

Foto pou enpòte yo nan katalòg la ./etc/data/img.

Tan pou enpòte 10 pwodwi lè l sèvi avèk metòd sa a se apeprè 10 segonn sou laptop mwen an. Si nou devlope lide sa a pi lwen, li fasil pou rive nan konklizyon ke apeprè 3600 pwodwi yo ka enpòte pou chak èdtan, epi li ka pran apeprè 100 èdtan pou enpòte pwodwi 30K. Ranplase yon laptop ak yon sèvè pèmèt ou lis sitiyasyon an yon ti jan. Petèt menm plizyè fwa. Men, pa pa lòd de grandè. Petèt vitès sa a ak dousman se nan yon sèten mezi youn nan rezon ki fè aparisyon pwojè a magento/async-import.

Yon solisyon radikal ogmante vitès la nan enpòte ta ka antre dirèk nan baz done a, men nan ka sa a tout "bon" konsènan ekstansibilite nan Magento yo pèdi - ou pral oblije fè tout bagay "avanse" tèt ou. Sepandan, li vo li. Si li mache, mwen pral konsidere apwòch la ak ekri dirèk nan baz done a nan pwochen atik la.

Sous: www.habr.com

Add nouvo kòmantè