Magento 2: Importieren von Produkten aus externen Quellen

Magento ist eine E-Commerce-Lösung, d.h. mehr auf den Verkauf von Produkten als auf den damit verbundenen Verkauf von Lager, Logistik oder Finanzbuchhaltung ausgerichtet. Andere Anwendungen (z. B. ERP-Systeme) eignen sich besser für Begleiter. Daher entsteht in der Praxis der Verwendung von Magento häufig die Aufgabe, ein Geschäft in diese anderen Systeme (z. B. in 1C) zu integrieren.


Im Großen und Ganzen kann die Integration auf die Datenreplikation reduziert werden durch:


  • Katalog (Produkte, Kategorien);
  • Bestandsdaten (Lagerbestände an Produkten in Lagern und Preise);
  • an Kunden;
  • Bestellungen;

Magento zum Bearbeiten von Daten in der Datenbank bietet eine separate Klasse von Objekten - Repositorys . Aufgrund der Besonderheiten von Magento ist das Hinzufügen von Daten zur Datenbank über Repositorys einfach zu codieren, geschieht jedoch beispielsweise nicht schnell. In dieser Veröffentlichung betrachte ich die Hauptphasen des programmgesteuerten Hinzufügens eines Produkts zu Magento 2 auf "klassische" Weise - unter Verwendung von Repo-Klassen.


Kunden und Bestellungen werden normalerweise auf die andere Seite repliziert - von Magento bis zu externen ERP-Systemen. Daher ist es mit ihnen einfacher. Auf der Magento-Seite müssen Sie nur die entsprechenden Daten auswählen und dann „ die von unserer Seite abgefeuerten Kugeln “.


Prinzipien zum Schreiben von Daten in die Datenbank


Derzeit erfolgt die Erstellung von Objekten, die programmgesteuert in Magento in der Datenbank gespeichert sind, über Factory :


function __construct (\Magento\Cms\Model\BlockFactory $blockFactory) { $this->blockFactory = $blockFactory; } /** @var \Magento\Cms\Model\Block $block */ $block = $this->blockFactory->create(); 

und Schreiben in die Datenbank über das Repository :


 function __construct (\Magento\Cms\Api\BlockRepositoryInterface $blockRepo) { $this->blockRepo = $blockRepo; } $this->blockRepo->save($block); 

Der Factory- und Repository-Ansatz kann für alle wichtigen Modelle im Themenbereich Magento 2 verwendet werden.


Grundlegende Produktinformationen


Ich erwäge eine Datenstruktur entsprechend Magento 2.3. Die grundlegendsten Produktinformationen finden Sie in der Tabelle catalog_product_entity (Produktregistrierung):


 entity_id attribute_set_id type_id sku has_options required_options created_at updated_at 

Ich beschränke type_id='simple' einen Produkttyp ( type_id='simple' ), eine Reihe von Standardattributen ( attribute_set_id=4 ) und ignoriere die Attribute has_options und required_options . Da die Attribute entity_id , created_at und updated_at automatisch generiert werden, müssen wir im Wesentlichen nur sku angeben, um ein neues Produkt hinzuzufügen. Ich mache das:


 /** @var \Magento\Catalog\Api\Data\ProductInterfaceFactory $factProd */ /** @var \Magento\Catalog\Api\ProductRepositoryInterface $repoProd */ /** @var \Magento\Catalog\Api\Data\ProductInterface $prod */ $prod = $factProd->create(); $prod->setAttributeSetId(4); $prod->setTypeId('simple'); $prod->setSku($sku); $repoProd->save($prod); 

und eine Ausnahme bekommen:


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

Ich füge der Anfrage den Produktnamen hinzu und erhalte die Meldung, dass das Price fehlt. Nach dem Hinzufügen des Preises fällt das Produkt in die Datenbank:


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

Der Produktname wird in der Tabelle der Produkt-Varchar-Attribute ( catalog_product_entity_varchar ) gespeichert, der Preis wird in der Tabelle catalog_product_entity_decimal gespeichert. Vor dem Hinzufügen eines Produkts ist es ratsam, explizit anzugeben, dass wir eine administrative Storefront zum Importieren von Daten verwenden:


 /** @var \Magento\Store\Model\StoreManagerInterface $manStore */ $manStore->setCurrentStore(0); 

Zusätzliche Attribute


Die Verarbeitung zusätzlicher Produktattribute mit Magento ist ein Vergnügen. Das EAV-Datenmodell für eav_entity_type (siehe Tabelle eav_entity_type ) ist eines der Hauptmerkmale dieser Plattform. Fügen Sie dem Produktmodell einfach die entsprechenden Attribute hinzu:


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

und beim Speichern des Modells über das Repo-Objekt:


 $repoProd->save($prod); 

Zusätzliche Attribute werden auch in den entsprechenden Datenbanktabellen gespeichert.


Inventardaten


Auf einfache Weise - die Menge des auf Lager befindlichen Produkts. In Magento 2.3 unterscheiden sich Datenbankstrukturen, die das Format zum Speichern von Inventardaten beschreiben, erheblich von den vorherigen. Das Hinzufügen von Produktmengen auf Lager über ein Produktmodell ist jedoch nicht viel schwieriger als das Hinzufügen anderer Attribute:


 /** @var \Magento\Catalog\Model\Product $prodEntity */ /** @var \Magento\Catalog\Api\ProductRepositoryInterface $repoProd */ $inventory = [ 'is_in_stock' => true, 'qty' => 1234 ]; $prodEntity->setData('quantity_and_stock_status', $inventory); $repoProd->save($prodEntity); 

Medien


In der Regel unterscheidet sich die Medienunterstützung für ein Produkt für einen Kunden in einem Geschäft (E-Commerce) von der Medienunterstützung für dasselbe Produkt für einen Mitarbeiter in einem internen Buchhaltungssystem (ERP). Im ersten Fall ist es wünschenswert, das "Produktgesicht" zu zeigen, im zweiten Fall reicht es aus, eine allgemeine Vorstellung vom Produkt zu geben. Trotzdem ist die Übertragung von mindestens dem Primärbild des Produkts ein ziemlich häufiger case beim Importieren von Daten.


Wenn Sie ein Bild über das Admin-Panel hinzufügen, wird das Bild zuerst im temporären Verzeichnis ( ./pub/media/tmp/catalog/product ) ./pub/media/tmp/catalog/product und erst beim ./pub/media/tmp/catalog/product des Produkts in das Medienverzeichnis ( ./pub/media/catalog/product ) ./pub/media/catalog/product . Wenn Sie über das Admin- small_image hinzufügen, wird das Bild auf die swatch_image image , small_image , thumbnail und swatch_image .


 /** @var \Magento\Catalog\Api\ProductRepositoryInterface $repoProd */ /** @var \Magento\Catalog\Model\Product\Gallery\CreateHandler $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); 

Aus irgendeinem Grund wird das Medium erst gebunden, nachdem das Produkt vorab gespeichert und erneut aus dem Repository empfangen wurde. Und Sie müssen das label Attribut angeben, wenn Sie einen Eintrag zur Produktmediengalerie hinzufügen (andernfalls erhalten wir die Ausnahme für den Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516 ).


Kategorien


Oft kann die Struktur von Geschäftskategorien und Backend-Anwendungen oder die Platzierung von Produkten in diesen erheblich variieren. Strategien zur Übertragung von Daten über Kategorien und Produkte in diesen hängen von vielen Faktoren ab. In diesem Beispiel halte ich mich an Folgendes:


  • Kategorien von Backend und Store werden nach Namen verglichen;
  • Wenn eine Kategorie importiert wird, die sich nicht im Geschäft befindet, wird sie unter der Stammkategorie ( Default Category ) erstellt und ihre weitere Positionierung im Geschäftskatalog wird manuell übernommen.
  • Ein Produkt wird nur dann einer Kategorie zugeordnet, wenn es in einem Geschäft erstellt wird (erster Import).

Grundlegende Kategorieinformationen finden Sie in der Tabelle catalog_category_entity (Kategoriekatalog). Erstellen einer Kategorie in Magento:


 /** @var \Magento\Catalog\Api\Data\CategoryInterfaceFactory $factCat */ /** @var \Magento\Catalog\Api\CategoryRepositoryInterface $repoCat */ $cat = $factCat->create(); $cat->setName($name); $cat->setIsActive(true); $repoCat->save($cat); 

Das Produkt wird nach Kategorie-ID und Produkt-SKU einer Kategorie zugeordnet:


 /** @var \Magento\Catalog\Model\CategoryProductLinkFactory $factCatProdLink */ /** @var \Magento\Catalog\Api\CategoryLinkRepositoryInterface $repoCatLink */ $link = $factCatProdLink->create(); $link->setCategoryId($catMageId); $link->setSku($prodSku); $repoCatLink->save($link); 

Insgesamt


Das programmgesteuerte Schreiben von Code zum programmgesteuerten Hinzufügen eines Produkts zu Magento 2 ist sehr einfach. All dies habe ich auf das Demo-Modul " flancer32 / mage2_ext_demo_import " reduziert. Es gibt nur einen fl32:import:prod console im fl32:import:prod , der die in der JSON-Datei " ./etc/data/products.json " beschriebenen Produkte importiert:


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

Bilder zum Importieren befinden sich im Verzeichnis ./etc/data/img .


Die Importzeit von 10 Produkten auf diese Weise beträgt auf meinem Laptop ungefähr 10 Sekunden. Wenn wir diese Idee weiterentwickeln, ist es leicht zu schließen, dass ungefähr 3.600 Produkte pro Stunde importiert werden können und ungefähr 30 Stunden für den Import von 100.000 Produkten benötigt werden. Wenn Sie einen Laptop durch einen Server ersetzen, können Sie die Situation etwas glätten. Vielleicht sogar manchmal. Aber nicht um Größenordnungen. Vielleicht das hier Geschwindigkeit Langsamkeit ist bis zu einem gewissen Grad einer der Gründe für die Entstehung des Magento / Async-Import- Projekts.


Eine wichtige Entscheidung zur Erhöhung der Importgeschwindigkeit könnte darin bestehen, direkt in die Datenbank zu schreiben. In diesem Fall gehen jedoch alle "Brötchen" in Bezug auf die Magento-Erweiterbarkeit verloren - Sie müssen alles "Fortgeschrittene" selbst tun. Es lohnt sich jedoch. Wenn es klappt, werde ich im nächsten Artikel den Ansatz mit direkter Aufzeichnung in der Datenbank betrachten.

Source: https://habr.com/ru/post/de436020/


All Articles