Magento 2: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² ΠΈΠ· Π²Π½Π΅ΡˆΠ½ΠΈΡ… источников

Magento являСтся e-commerce Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‚.Π΅. большС Π½Π°Ρ†Π΅Π»Π΅Π½ΠΎ Π½Π° ΠΏΡ€ΠΎΠ΄Π°ΠΆΡƒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², Ρ‡Π΅ΠΌ Π½Π° ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠ°ΠΌ складской, логистичСский ΠΈΠ»ΠΈ финансовый ΡƒΡ‡Ρ‘Ρ‚. Для ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ подходят Π΄Ρ€ΡƒΠ³ΠΈΠ΅ прилоТСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ERP-систСмы). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ достаточно часто Π² ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ использования Magento Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π·Π°Π΄Π°Ρ‡Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° с этими Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ систСмами (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с 1Π‘).

По Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ счёту ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ свСсти ΠΊ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ:

  • ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ (ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹, ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ);
  • ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ (остатки ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² Π½Π° складах ΠΈ Ρ†Π΅Π½Ρ‹);
  • ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ;
  • Π·Π°ΠΊΠ°Π·Π°ΠΌ;

Magento для манипуляции с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Π±Π°Π·Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² β€” Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. Π’ силу спСцифики Magento Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±Π°Π·Ρƒ Ρ‡Π΅Ρ€Π΅Π· Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π»Π΅Π³ΠΊΠΎ кодируСтся, Π½ΠΎ происходит, скаТСм Ρ‚Π°ΠΊ, нСбыстро. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ я Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ основныС этапы ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ добавлСния Π² Magento 2 ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° «ΠΊΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΌ» способом β€” с использованиСм Ρ€Π΅ΠΏΠΎ-классов.

ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΈ Π·Π°ΠΊΠ°Π·Ρ‹ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ сторону β€” ΠΈΠ· Magento Π²ΠΎ внСшниС ERP-систСмы. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ с Π½ΠΈΠΌΠΈ ΠΏΠΎΠΏΡ€ΠΎΡ‰Π΅, Π½Π° сторонС Magento Π½ΡƒΠΆΠ½ΠΎ просто Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, Π° дальшС β€” «Ρ нашСй стороны ΠΏΡƒΠ»ΠΈ Π²Ρ‹Π»Π΅Ρ‚Π΅Π»ΠΈ«.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ записи Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±Π°Π·Ρƒ

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ созданиС сохраняСмых Π² Π±Π°Π·Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ способом Π² Magento дСлаСтся Ρ‡Π΅Ρ€Π΅Π· Factory:

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

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

Π° запись Π² Π±Π°Π·Ρƒ β€” Ρ‡Π΅Ρ€Π΅Π· Repository:

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

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

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ с использованиСм «Factory» ΠΈ «Repository» ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для всСх основных ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области Magento 2.

Базовая информация ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅

Π― Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ…, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ вСрсии Magento 2.3. Бамая основная информация ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅ находится Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ catalog_product_entity (рССстр ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡΡŒ ΠΎΠ΄Π½ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° (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) β€” ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… особСнностСй этой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. ΠŸΡ€ΠΎΡΡ‚ΠΎ добавляСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΊ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°:

$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);

МСдиа

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΌΠ΅Π΄ΠΈΠ°-сопровоТдСниС ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅ (e-commerce) отличаСтся ΠΎΡ‚ ΠΌΠ΅Π΄ΠΈΠ°-сопровоТдСния этого ΠΆΠ΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° для сотрудника Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ систСмС ΡƒΡ‡Ρ‘Ρ‚Π° (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).

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ

Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ структура ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΠΈ backend-прилоТСния ΠΈΠ»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² Π½ΠΈΡ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ. Π‘Ρ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΠΈ пСрСноса Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ катСгориях ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°Ρ… Π² Π½ΠΈΡ… зависят ΠΎΡ‚ мноТСства Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ². Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ я ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ:

  • ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ backend’Π° ΠΈ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ названию;
  • Ссли импортируСтся катСгория, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Ρ‚ Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅, Ρ‚ΠΎ ΠΎΠ½Π° создаётся ΠΏΠΎΠ΄ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠ΅ΠΉ (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 ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Ρ‘ΠΌ вСсьма нСслоТно. Всё ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅ я свёл Π² Π΄Π΅ΠΌΠΎ-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ «flancer32/mage2_ext_demo_import«. Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅ всСго ΠΎΠ΄Π½Π° консольная ΠΊΠΎΠΌΠ°Π½Π΄Π° 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 часов. Π—Π°ΠΌΠ΅Π½Π° Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ° Π½Π° сСрвСр позволяСт нСсколько ΡΠ³Π»Π°Π΄ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ Π² Ρ€Π°Π·Ρ‹. Но Π½Π΅ Π½Π° порядки. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ эта ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠ΅Ρ€Π΅ являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½ появлСния ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° magento/async-import.

ΠšΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для увСличСния скорости ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ прямая запись Π² Π±Π°Π·Ρƒ, Π½ΠΎ Π² этом случаС Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ всС «ΠΏΠ»ΡŽΡˆΠΊΠΈ», ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΠΈ Magento β€” придётся всё «Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅» Π΄Π΅Π»Π°Ρ‚ΡŒ самому. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΎΠ½ΠΎ Ρ‚ΠΎΠ³ΠΎ стоит. Если получится, Ρ‚ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€ΡŽ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с прямой записью Π² Π‘Π” Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ