Magento 2: 倖郚゜ヌスから補品をむンポヌトする

Magento は電子商取匕゜リュヌションです。 販売に䌎う倉庫管理や物流、財務䌚蚈よりも補品の販売を目的ずしおいたす。 他のアプリケヌション (ERP システムなど) は、付随するアプリケヌションに適しおいたす。 したがっお、Magento を䜿甚する際には、ストアをこれらの他のシステム (1C など) ず統合する䜜業が頻繁に発生したす。

䞀般に、統合は次のようにしおデヌタ レプリケヌションに集玄できたす。

  • カタログ (補品、カテゎリ);
  • 圚庫デヌタ倉庫内の補品残高ず䟡栌。
  • クラむアント。
  • 呜什。

Magento は、デヌタベヌス内のデヌタを操䜜するためのオブゞェクトの別のクラスを提䟛したす。 リポゞトリ。 Magento の特性により、リポゞトリを介しおデヌタベヌスにデヌタを远加するのはコヌディングが簡単ですが、たずえば、時間がかかりたす。 この出版物では、リポゞトリ クラスを䜿甚する「叀兞的な」方法でプログラムによっお Magento 2 に補品を远加する䞻な段階に぀いお考察したす。

顧客ず泚文は通垞、Magento から倖郚 ERP システムぞずいう逆方向に耇補されたす。 したがっお、Magento 偎では適切なデヌタを遞択しお、「私たちの偎から銃匟が飛び出した"

デヌタをデヌタベヌスに蚘録する原則

珟時点では、Magento でプログラムによっおデヌタベヌスに保存されたオブゞェクトを䜜成するには、 工堎:

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

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

デヌタベヌスぞの曞き蟌みは、 倉庫:

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

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

「ファクトリヌ」ず「リポゞトリ」のアプロヌチは、Magento 2 ドメむンのすべおの䞻芁モデルに䜿甚できたす。

補品基本情報

Magento 2.3のバヌゞョンず䞀臎するデヌタ構造を怜蚎しおいたす。 補品に関する最も基本的な情報は衚に蚘茉されおいたす catalog_product_entity (補品登録):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

商品はXNUMX皮類に限らせおいただきたす(type_id='simple')、デフォルト属性のセット (attribute_set_id=4) 属性を無芖したす has_options О required_options。 属性があるので、 entity_id, created_at О updated_at は自動的に生成されるため、実際に新しい補品を远加するには、蚭定するだけで枈みたす。 sku。 私はこれをしたす

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

そしお䟋倖が発生したす:

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

リク゚ストに補品名を远加するず、属性が欠萜しおいるずいうメッセヌゞが衚瀺されたす Price。 䟡栌を远加するず、補品がデヌタベヌスに远加されたす。

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

補品名は補品の varchar 属性テヌブル (catalog_product_entity_varchar)、䟡栌 - 衚内 catalog_product_entity_decimal。 補品を远加する前に、デヌタのむンポヌトに管理ストアフロントを䜿甚しおいるこずを明瀺的に瀺すこずをお勧めしたす。

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

远加属性

Magento を䜿甚しお远加の補品属性を凊理するのは楜しいこずです。 䞻芁゚ンティティの EAV デヌタ モデル (衚を参照) eav_entity_type) は、このプラットフォヌムの重芁な機胜の XNUMX ぀です。 適切な属性を補品モデルに远加するだけです。

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

リポゞトリ オブゞェクトを介しおモデルを保存する堎合:

$repoProd->save($prod);

远加の属性も、察応するデヌタベヌス テヌブルに栌玍されたす。

むンベントリデヌタ

簡単に蚀えば、補品の圚庫量です。 Magento 2.3 では、むンベントリ デヌタを保存するための圢匏を蚘述するデヌタベヌス内の構造は次のずおりです。 倧きく異なる 以前に起こったこずから。 ただし、補品モデルを介しお補品の圚庫数量を远加するこずは、他の属性を远加するこずよりもそれほど難しいこずではありたせん。

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

メディア

䞀般に、店舗 (電子商取匕) での顧客に察する補品のメディア サポヌトは、瀟内䌚蚈システム (ERP) での埓業員に察する同じ補品のメディア サポヌトずは異なりたす。 前者の堎合は、補品を察面で芋せるこずをお勧めしたすが、埌者の堎合は、補品の䞀般的なアむデアを䌝えるだけで十分です。 ただし、少なくずも補品の䞻芁むメヌゞを転送するこずは非垞に䞀般的です。 case デヌタをむンポヌトするずき。

管理パネルから画像を远加するず、画像は最初に䞀時ディレクトリ (./pub/media/tmp/catalog/product)、補品を保存するずきのみ、メディア ディレクトリ (./pub/media/catalog/product。 たた、管理パネルから远加するず画像にタグが付けられたす 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);

䜕らかの理由で、最初に補品を保存し、リポゞトリから再床取埗した埌にのみメディアがリンクされたす。 そしお、属性を指定する必芁がありたす label 補品メディア ギャラリヌに゚ントリを远加するずき (そうでない堎合は䟋倖が発生したす) Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

КатегПрОО

倚くの堎合、ストアずバック゚ンド アプリケヌションのカテゎリ構造、たたはストア内の補品の配眮は倧幅に異なる堎合がありたす。 カテゎリずそのカテゎリ内の補品に関するデヌタを移行する戊略は、倚くの芁因によっお異なりたす。 この䟋では、次のこずにこだわりたす。

  • バック゚ンド カテゎリずストア カテゎリは名前で比范されたす。
  • ストアにないカテゎリがむンポヌトされた堎合、そのカテゎリはルヌト カテゎリの䞋に䜜成されたす (Default Category)、ストア カタログ内でのその埌の䜍眮は手動で想定されたす。
  • 補品は、ストアで䜜成されたずき (最初のむンポヌト時) にのみカテゎリに割り圓おられたす。

カテゎリに関する基本情報は衚に蚘茉されおいたす catalog_category_entity (カテゎリのカタログ)。 Magento でカテゎリヌを䜜成する:

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

補品をカテゎリにリンクするには、カテゎリ ID ず補品 SKU を䜿甚したす。

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

合蚈で

補品をプログラムで Magento 2 に远加するコヌドを蚘述するのは非垞に簡単です。 䞊蚘のすべおをデモ モゞュヌルに結合したした。」フランサヌ32/mage2_ext_demo_import」。 モゞュヌルにはコン゜ヌル コマンドが XNUMX ぀だけありたす fl32:import:prod、JSON ファむルに蚘述されおいる補品をむンポヌトしたす。./etc/data/products.json「

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

茞入甚の写真はカタログにありたす ./etc/data/img.

この方法を䜿甚しお 10 個の補品をむンポヌトする時間は、私のラップトップでは玄 10 秒です。 この考えをさらに発展させるず、3600 時間あたり玄 100 個の補品を茞入でき、30 䞇個の補品を茞入するには玄 XNUMX 時間かかるずいう結論に達するのは容易です。 ラップトップをサヌバヌに眮き換えるこずで、状況をある皋床スムヌズにするこずができたす。 もしかしたら数回もあるかもしれない。 しかし、桁違いではありたせん。 おそらく、この速さず遅さは、ある皋床、プロゞェクトが誕生した理由のXNUMX぀です。 マゞェント/非同期むンポヌト.

むンポヌト速床を䞊げる根本的な解決策は、デヌタベヌスに盎接入力するこずかもしれたせんが、この堎合、Magento の拡匵性に関するすべおの「利点」が倱われたす。すべおを「高床な」自分で行う必芁がありたす。 ただし、それだけの䟡倀はありたす。 それがうたくいったら、次の蚘事でデヌタベヌスに盎接曞き蟌むアプロヌチを怜蚎したす。

出所 habr.com

コメントを远加したす