Magento 2: Ürünleri Dış Kaynaklardan İçe Aktarma

Magento bir e-ticaret çözümüdür; Satışlara eşlik eden depolama, lojistik veya finansal muhasebeden ziyade daha çok ürün satmayı amaçlamaktadır. Diğer uygulamalar (örneğin ERP sistemleri), eşlik eden uygulamalar için daha uygundur. Bu nedenle, Magento kullanma pratiğinde çoğu zaman bir mağazayı bu diğer sistemlerle (örneğin 1C) entegre etme görevi ortaya çıkar.

Entegrasyon genel olarak aşağıdaki yöntemlerle veri çoğaltmaya indirgenebilir:

  • katalog (ürünler, kategoriler);
  • envanter verileri (depolardaki ürün bakiyeleri ve fiyatlar);
  • müşteriler;
  • emirler;

Magento, veritabanındaki verileri işlemek için ayrı bir nesne sınıfı sunar - depolar. Magento'nun özelliklerinden dolayı depolar aracılığıyla veri tabanına veri eklemenin kodlanması kolaydır ancak diyelim ki yavaştır. Bu yayında, repo sınıflarını kullanarak Magento 2'ye programlı olarak “klasik” şekilde bir ürün eklemenin ana aşamalarını ele alıyorum.

Müşteriler ve siparişler genellikle Magento'dan harici ERP sistemlerine doğru diğer yönde kopyalanır. Bu nedenle onlarla daha basit; Magento tarafında sadece uygun verileri seçmeniz gerekiyor ve ardından "kurşunlar yanımızdan uçtu".

Veri tabanına veri kaydetme ilkeleri

Şu anda Magento'da veritabanına programlı olarak kaydedilen nesnelerin oluşturulması, Fabrika:

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

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

ve veritabanına yazma işlemi şu şekilde yapılır: depo:

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

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

"Fabrika" ve "Depo" yaklaşımı Magento 2 alanındaki tüm önemli modeller için kullanılabilir.

Temel Ürün Bilgileri

Magento 2.3 sürümüyle eşleşen bir veri yapısına bakıyorum. Ürünle ilgili en temel bilgiler tabloda yer almaktadır catalog_product_entity (ürün kaydı):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Tek bir ürün türüyle sınırlıyım (type_id='simple'), bir dizi varsayılan özellik (attribute_set_id=4) ve nitelikleri göz ardı edin has_options и required_options. Niteliklerden beri entity_id, created_at и updated_at otomatik olarak oluşturulur, o zaman aslında yeni bir ürün eklemek için sadece ayarlamamız gerekir. sku. Bunu yapıyorum:

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

ve bir istisna alıyorum:

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

İsteğe ürün adını ekliyorum ve özelliğin eksik olduğunu belirten bir mesaj alıyorum Price. Fiyat eklendikten sonra ürün veritabanına eklenir:

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

Ürün adı, ürün varchar öznitelik tablosunda saklanır (catalog_product_entity_varchar), fiyat - tabloda catalog_product_entity_decimal. Bir ürün eklemeden önce, verileri içe aktarmak için yönetim vitrini kullandığımızı açıkça belirtmeniz önerilir:

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

Ek Nitelikler

Magento'yu kullanarak ek ürün özelliklerini işlemek bir zevktir. Ana varlıklar için EAV veri modeli (tabloya bakınız) eav_entity_type) bu platformun temel özelliklerinden biridir. Ürün modeline uygun özellikleri eklememiz yeterlidir:

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

ve modeli repo nesnesi aracılığıyla kaydederken:

$repoProd->save($prod);

ek özellikler de ilgili veritabanı tablolarında saklanacaktır.

Envanter verileri

Basit bir ifadeyle - stoktaki ürün miktarı. Magento 2.3'te, veritabanındaki envanter verilerinin saklanmasına ilişkin formatı tanımlayan yapılar şunlardır: önemli ölçüde farklı daha önce olanlardan. Ancak stoktaki bir ürünün miktarını ürün modeli aracılığıyla eklemek, diğer özellikleri eklemekten çok daha zor değildir:

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

medya

Kural olarak, bir mağazadaki (e-ticaret) bir müşteriye yönelik bir ürün için medya desteği, dahili muhasebe sistemindeki (ERP) bir çalışan için aynı ürün için medya desteğinden farklıdır. İlk durumda ürünün yüz yüze gösterilmesi tavsiye edilir, ikincisinde ise ürün hakkında genel bir fikir vermek yeterlidir. Ancak bir ürünün en azından birincil görselinin aktarılması oldukça yaygındır. case Verileri içe aktarırken.

Yönetici paneli aracılığıyla bir görsel eklerken, görsel öncelikle geçici bir dizine kaydedilir (./pub/media/tmp/catalog/product) ve yalnızca ürün kaydedilirken medya dizinine taşınır (./pub/media/catalog/product). Ayrıca yönetici paneli aracılığıyla eklendiğinde görsel etiketlenir 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);

Bazı nedenlerden dolayı medya ancak ürün ilk kez kaydedildikten ve depodan tekrar alındıktan sonra bağlanır. Ve niteliği belirtmeniz gerekiyor label ürün medya galerisine bir giriş eklerken (aksi halde bir istisnayla karşılaşırız) Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

kategori

Çoğu zaman mağazanın kategori yapısı ve arka uç uygulaması veya ürünlerin bunlara yerleştirilmesi önemli ölçüde farklılık gösterebilir. Kategoriler ve bunların içindeki ürünlerle ilgili verileri taşıma stratejileri birçok faktöre bağlıdır. Bu örnekte aşağıdakilere bağlı kalıyorum:

  • arka uç ve mağaza kategorileri ada göre karşılaştırılır;
  • mağazada olmayan bir kategori içe aktarılırsa kök kategori (Default Category) ve mağaza kataloğundaki daha sonraki konumlandırması manuel olarak varsayılır;
  • bir ürün yalnızca mağazada oluşturulduğunda (ilk içe aktarma) bir kategoriye atanır;

Kategoriye ilişkin temel bilgiler tabloda yer almaktadır catalog_category_entity (kategori kataloğu). Magento'da kategori oluşturma:

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

Bir ürünü bir kategoriye bağlamak, kategori kimliği ve ürün SKU'su kullanılarak gerçekleştirilir:

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

Toplam

Magento 2'ye programlı olarak bir ürün eklemek için kod yazmak oldukça kolaydır. Yukarıda belirtilen her şeyi bir demo modülünde birleştirdim “flancer32/mage2_ext_demo_import". Modülde yalnızca bir konsol komutu var fl32:import:prodJSON dosyasında açıklanan ürünleri içe aktaran "./etc/data/products.json":

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

İçe aktarılacak resimler katalogdadır ./etc/data/img.

Bu yöntemi kullanarak 10 ürünü içe aktarma süresi dizüstü bilgisayarımda yaklaşık 10 saniyedir. Bu fikri daha da geliştirirsek saatte yaklaşık 3600 ürünün ithal edilebildiği, 100 bin ürünün ithalatının ise yaklaşık 30 saat sürebildiği sonucuna varmak kolaydır. Dizüstü bilgisayarı bir sunucuyla değiştirmek, durumu biraz düzeltmenize olanak tanır. Hatta belki birkaç kez. Ama büyüklük sırasına göre değil. Belki de bu hız ve yavaşlık bir ölçüde projenin ortaya çıkmasının sebeplerinden biridir. magento/eşzamansız içe aktarma.

İçe aktarma hızını artırmak için radikal bir çözüm, veritabanına doğrudan giriş olabilir, ancak bu durumda Magento'nun genişletilebilirliğine ilişkin tüm "iyilikler" kaybolur - her şeyi "ileri düzey" olarak kendiniz yapmanız gerekecektir. Ancak buna değer. Eğer işe yararsa bir sonraki yazımda doğrudan veri tabanına yazma yaklaşımını ele alacağım.

Kaynak: habr.com

Yorum ekle