Nel seguente articolo viene illustrata la modalità completa, tecnica e funzionale, per l’importazione dei dati (Categorie, Attributi, Prodotti) nel CMS Ecommerce Magento 2 CE, attraverso l’interfaccia REST API e codice C# .NET.

Troverete anche indicazioni per la sicurezza e per il backup di una installazione di Magento 2 CE.

Analizzeremo le modalità per:    

  1. Importare una Categoria ;
  2. Importare i Product Attribute ;
  3. Importare i Prodotti Configurable ;
  4. Importare i Prodotti Simple ;
  5. Associare le Configurable Option ad un prodotto Configurable e ad un prodotto Simple ;
  6. Creare le Configurazioni di prodotti ;
  7. Associare i prodotti Simple al prodotto Configurable ;

Gli esempi di questa guida sono stati testati per le seguenti versioni:

  1. Magento CE 2.2.6
  2. Mysql 5.7.21
  3. Php 7.1.14

Per maggiori informazioni sui prerequisiti di installazione di Magento 2 CE si può consultare la documentazione ufficiale a questo indirizzo: https://devdocs.magento.com/guides/v2.0/install-gde/prereq/prereq-overview.html

Magento 2 espone tre interfacce  implementabili (APIs) per il caricamento e la gestione dei dati:

  1. Rest API Interface
  2. SOAP API Interface
  3. Object Manager + Object Model Interface

Mediante questi metodi, si possono caricare facilmente i listini dei prodotti da un software gestionale direttamente nel portale ecommerce, ed avere quindi una perfetta sincronizzazione degli stessi.

PHP – ObjectManager:

E’ possibile sviluppare codice PHP personalizzato (per Plugin, Moduli o semplici script) ed integrarlo in Magento. Il servizio ObjectManager permette di implementare l’Object Model Interface nel proprio codice e di instanziare i propri oggetti al bootstrap dell’applicazione. Ciò avviene sfruttando le peculiarità della Dependency injection.

E’ possibile scegliere di non sfruttare la dependency injection e il bootstrapping di Magento semplicemente creando oggetti  “Newable/non-injectable”, modificando il Bootstrap, istanziando l’Object Manager e richiamando le risorse (classi del Framework) ogni volta che sono necessarie.  Con le modalità appena descritte, utilizzando l’Object Model, è possibile caricare e manipolare i dati di Magento.

SOAP APIs:

Gli endpoint di Magento sono protetti ed accessibili solo con autenticazione. Per generare un proxy è necessario eseguire il download del WSDL (es. http://192.168.0.200/magento2/soap/default?wsdl=1&services=storeStoreRepositoryV1) , del servizio richiesto, utilizzando un software che permetta richieste SOAP con autenticazione (es. Postaman). Salvato il WSDL, con utility dedicate è possibile generare la classe proxy ( In Visual Studio il tool più comune è Svcutil.exe). Questa modalità appare tuttavia poco mantenibile.

REST APIs:

Ogni installazione di Magento è dotata di una serie completa di REST endpoint per interagire con i dati e le strutture del CMS.

La modalità sicuramente più agevole di sfruttare le REST API di Magento è quella di usare chiamate HTTP. In dettaglio si deve generare un modello dati locale ed istanziare un Rest Client.
Un esempio di codice scritto in C#:


JsonDeserializer jsonDeSerializer = new JsonDeserializer();
RestClient client = new RestClient("http://192.168.1.200/magento2/");
bool contentTypeHeaderWithUnderscore = false;
string barerToken = "vztdr8zbicw4poozqfg5eo0vh3t29ikt";
// Certain Magento installations use the underscore instead of the hyphen for content type
client.AddDefaultHeader(contentTypeHeaderWithUnderscore ? "Content_Type" : "Content-Type", "application/json");
client.ClearHandlers(); 
client.AddHandler("application/json", _jsonDeSerializer);

var request = new RestRequest("rest/V1/products/000167", RestSharp.Method.GET);
request.RequestFormat = DataFormat.Json;
request.AddHeader("Authorization", "Bearer " + barerToken);
request.AddHeader("Accept", "application/json");

RestClient è un package Restsharp scaricabile dalla NuGet Package repository.

Esistono endpoint per gestire tutte le entità di Magento 2 CE. Per ogni entità esiste una interfaccia per creare un “data model” tramite il quale costruire una request in formato JSON.

L’elenco completo dei servizi disponibili è documentato qui: http://devdocs.magento.com/guides/v2.0/rest/list.html

Per trasformare un modello dati in una stringa Json (serializzazione) si può utilizzare la Libreria .NET Newtonsoft.Json, come da codice seguente:


Product pd = new product()
pd.name = “Giubbino”
pd.sku = “GIUB01”
…….
string json = JsonConvert.SerializeObject(pd, Formatting.Indented);
request.AddParameter("application/json", json, ParameterType.RequestBody);
response = Client.Execute(request);

A livello funzionale un caricamento standard e completo di dati all’interno di Magento deve seguire una rigorosa sequenza:

  1. Creazione Categorie;
  2. Creazione attributeset
  3. Creazione Attributi Prodotto Custom + assegnazione a attributeset + assegnazione ad attributegroup;
  4. Assegnazione Option ai singoli Attributi Prodotto Custom;
  5. Creazione Prodotti di tipo Configurable;
    1. assegnazione contestuale di attributeset ;
  6. Creazione Prodotti di Tipo Simple;
    1. assegnazione contestuale di attributeset + Attributi Prodotto Custom Option;
  7. Assegnazione al prodotto Configurable di tutti gli Option Attribute necessari per le relative varianti;
  8. Assegnazione Option Attribute ai simple products;
  9. Assegnazione dei Prodotti simple al relativo Configurable;

Punto 1:

L’installazione di Magento crea una Categoria radice, non visibile né nel back-end né nel front-end, denominata “Root Catalog”.

Tabella Categorie di Magento 2 con la Root Catalog

Tabella Categorie di Magento 2 con la Root Catalog

Non deve essere cancellata, e sotto di essa  vanno inserite tutte le altre categorie secondo la gerarchia desiderata. Di seguito un semplice JSON da inviare all’end-point per inserire una categoria: “/rest/V1/categories”:


{"category":{"id":0,"parent_id":2,"name":"Abbigliamento","is_active":true,"position":0,"level":0,"children":null,"created_at":null,"updated_at":null,"path":null,"available_sort_by":null,"include_in_menu":true,"custom_attributes":[{"attribute_code":"url_key","value":"abbigliamento"}]}}
Albero delle Categorie di Magento 2

Albero delle Categorie di Magento 2

Punto 2:

In magento gli attributi sono organizzati e relazionati ad un AttributeSet. E’ possibile creare più attributeset ed assegnare diversi attributi ad ogni attributeset. Un attributo può appartenere solamente ad un attributeset. di seguito un semplice JSON da inviare all’end-point per creare un attribute set: “/rest/V1/products/attribute-sets”:


{"skeletonId":4,"attributeSet":{"attribute_set_id":null,"attribute_set_name":"Etos_Magento_Attr","sort_order":2,"entity_type_id":0,"extension_attributes":null},"entityTypeCode":"catalog_product"}

“skeletonid” è un parametro che indica di creare l’attribute set sullo schema dell’attributeset di default che in magento ha sempre id=4.

Attribute Set e Attribute Group di Magento 2

Attribute Set e Attribute Group di Magento 2

Punto 3:

Oltre agli attributi già presenti in magento è possibile aggiungere dei Attributi Prodotto Custom per qualificare i prodotti. E’ obbligatorio, se la varianti che verranno create per i prodotti sono basate su attributi non presenti in magento. Di seguito un semplice JSON da inviare all’end-point per creare un custom attribute: “/rest/V1/products/attributes”:


{"attribute":{"is_wysiwyg_enabled":false,"is_html_allowed_on_front":true,"used_for_sort_by":false,"is_filterable":false,"is_filterable_in_search":false,"is_used_in_grid":true,"is_visible_in_grid":true,"is_filterable_in_grid":false,"position":0,"apply_to":["simple","configurable","virtual"],"is_searchable":null,"is_visible_in_advanced_search":null,"is_comparable":"true","is_used_for_promo_rules":null,"is_visible_on_front":"true","used_in_product_listing":"true","is_visible":true,"scope":"Store View","attribute_id":0,"attribute_code":"a1","frontend_input":"select","entity_type_id":null,"is_required":false,"options":null,"is_user_defined":true,"default_frontend_label":"A1","frontend_labels":[{"storeId":0,"label":"A1"}],"backend_type":null,"source_model":null,"is_unique":null,"validation_rules":null}}

Un attributo, per essere usato come opzione per un prodotto Configurable, quindi per legare il Simple al Configurable in qualità di combinazione, deve rispettare le seguenti caratteristiche:

Lo “scope” deve eessere settato a “global”;
L’attributo deve essere “visible”;
L’attributo deve essere di tipo “user defined”;
L’attributo deve usare una serie di opzioni (come per esempio gli attributi “dropdown” e “multiselect”)

Il json di esempio per assegnare l’ Attributo Prodotto Custom all’ Attributeset e all’ Attribute group è riportato di seguito. L’endpoint è: “/rest/V1/products/attribute-sets/attributes”:


{"attributeSetId":16,"attributeGroupId":101,"attributeCode":"a1","sortOrder":0}
Attributo e Attribute Option in Magento 2

Attributo e Attribute Option in Magento 2

Punto 4:

Ad ogni attributo creato occorre assegnare le liste delle Options relative. Lo si fa usando l’endpoint “/rest/V1/products/attributes/<attribute-code>/options” e un json come quello di seguito:


{"option":{"label":"2XS","value":"T2XS_TA","storeLabels":{"storeId":1,"label":"2XS"}},"sortOrder":1}

Punto 5:

Magento 2 CE, nella definizione standard, permette la creazione di 6 tipologie di prodotti: Simple, Configurable, Grouped, Virtual, Bundle e Downlodable. In uno scenario, il più lineare possibile, un negozio dovrebbe avere un prodotto di tipo Configurable (padre) con associati molteplici prodotti di tipo Simple (figli), in numero pari a tutte le combinazioni possibili per le Options degli attributi associati. E’ necessario quindi creare un prodotto di tipo Configurable o prodotto Padre.

In questa modalità, l’unico prodotto visibile sul front end sarà il Configurable ed i simple, o meglio i loro attributi, verranno visualizzati nelle pagine di dettaglio a seguito della scelta delle singole opzioni.

Configurable Product nelle liste di un negozio Magento 2

Configurable Product nelle liste di un negozio Magento 2

Per creare un prodotto di tipo configurable si utilizza l’endpoint “/rest/V1/products”  con Metodo “POST”. di seguito un esempio di json per l’inserimento completo di un prodotto configurable corredato di prezzo, giacenza (stock), immagini, descrizioni, attributi:


{"sku":"000043","product":{"id":null,"sku":"000043","name":"Apepazza Calzature Saldi Donna Yle01/texture-box Derby Mascherina Con Perline","attribute_set_id":16,"price":139,"status":1,"visibility":4,"type_id":"configurable","created_at":null,"updated_at":null,"extension_attributes":{"stockItem":{"itemId":null,"productId":0,"stockId":1,"qty":0,"isInStock":true,"isQtyDecimal":true,"showDefaultNotificationMessage":false, "useConfigMinQty":true,"minQty":1,"useConfigMinSaleQty":1,"minSaleQty":1,"useConfigMaxSaleQty":false,"maxSaleQty":0,"useConfigBackorders":true, "backorders":0,"useConfigNotifyStockQty":true,"notifyStockQty":1,"useConfigQtyIncrements":true,"qtyIncrements":1,"useConfigEnableQtyInc":true,"enableQtyIncrements":true,"useConfigManageStock":true,"manageStock":true, "lowStockDate":null,"isDecimalDivided":true,"stockStatusChangedAuto":0,"extensionAttributes":null},"category_links":[{"position":0,"category_id":"3","extension_attributes":null},{"position":0,"category_id":"14","extension_attributes":null},{"position":0,"category_id":"60","extension_attributes":null},{"position":0,"category_id":"84","extension_attributes":null}]},"product_links":null,"options":null,"media_gallery_entries":[{"id":null,"mediaType":"image","label":"Foto-0-APEPAZZACALZATURESALDIDONNAYLE01TEXTUREBOXDERBYMASCHERINACONPERLINE-000043","position":0,"disabled":false,"types":["image","small_image","thumbnail"],"file":null,"content":{"Base64EncodedData":"/9j/4RJQRXhpZgAATU0AKgAAAAgAEgEAAAMAAAABEKAAAA .... <stringa.dati-base64>","Type":"image/jpeg","Name":"DSE_3460jpg"},"extensionAttributes":null}],"tier_prices":null,"custom_attributes":[{"attribute_code":"url_key","value":"apepazza-calzature-saldi-donna-yle01-texture-box-derby-mascherina-con-perline"},{"attribute_code":"description","value":"YLE01/TEXTURE-BOX<br>\t\t<p><span style=\"background-color:#FFFFFF;font-family:Calibri;font-size:11pt;\">Scarpa bassa in pelle spazzolata con inserti elasticizzati su linguetta.<\/span><\/p>\r\n\t\t<p><span style=\"background-color:#FFFFFF;font-family:Calibri;font-size:11pt;\"> Ricamo di perline frontale .<\/span><\/p>\r\n\t\t<p><span style=\"background-color:#FFFFFF;font-family:Calibri;font-size:11pt;\"> Suola in gomma light e tacco 30 .<\/span><\/p>\r\n\r\n"},{"attribute_code":"barcode","value":""},{"attribute_code":"tipoprodotto","value":"CALZATURE"},{"attribute_code":"reparto","value":"SALDI DONNA"},{"attribute_code":"brand","value":"APEPAZZA"}]}}

Punto 6:

La successiva fase consiste nella creazione del prodotto di tipo Simple o Figlio, che costituisce la singola variante (combinazione) del prodotto Configurable  


{"sku":"000257.010-41","product":{"id":null,"sku":"000257.010-41","name":"Atlantic Stars Calzature Saldi Uomo Antares Bpb-63n Camoscio/nylon F.do Sport","attribute_set_id":16,"price":185,"status":1,"visibility":1,"type_id":"simple","created_at":null,"updated_at":null,"extension_attributes":{"stockItem":{"itemId":null,"productId":0,"stockId":1,"qty":1,"isInStock":true,"isQtyDecimal":true,"showDefaultNotificationMessage":false, "useConfigMinQty":true,"minQty":1,"useConfigMinSaleQty":1,"minSaleQty":1,"useConfigMaxSaleQty":false,"maxSaleQty":0,"useConfigBackorders":true, "backorders":0,"useConfigNotifyStockQty":true,"notifyStockQty":1,"useConfigQtyIncrements":true,"qtyIncrements":1,"useConfigEnableQtyInc":true,"enableQtyIncrements":true,"useConfigManageStock":true, "manageStock":true,"lowStockDate":null,"isDecimalDivided":true,"stockStatusChangedAuto":0,"extensionAttributes":null},"category_links":[{"position":0,"category_id":"3","extension_attributes":null},{"position":0,"category_id":"25","extension_attributes":null},{"position":0,"category_id":"79","extension_attributes":null},{"position":0,"category_id":"85","extension_attributes":null}]},"product_links":null,"options":null,"media_gallery_entries":[{"id":null,"mediaType":"image","label":"Foto-0-ATLANTICSTARSCALZATURESALDIUOMOANTARESBPB63NCAMOSCIONYLONFDOSPORT-000257.010-41","position":0,"disabled":false,"types":["image","small_image","thumbnail"],"file":null,"content":{"Base64EncodedData":"/9j/4RDKRXhpZgAATU0AKgAAAAgAEgEAAA ... ","Type":"image/jpeg","Name":"DSE_4063jpg"},"extensionAttributes":null},{"id":null,"mediaType":"image","label":"Foto-1-ATLANTICSTARSCALZATURESALDIUOMOANTARESBPB63NCAMOSCIONYLONFDOSPORT-000257.010-41","position":1,"disabled":false,"types":null,"file":null,"content":{"Base64EncodedData":"/9j/4RIRRXhpZgAATU0AKgAAAAgAEgEAAA ... ","Type":"image/jpeg","Name":"DSE_4064jpg"},"extensionAttributes":null},{"id":null,"mediaType":"image","label":"Foto-2-ATLANTICSTARSCALZATURESALDIUOMOANTARESBPB63NCAMOSCIONYLONFDOSPORT-000257.010-41","position":2,"disabled":false,"types":null,"file":null,"content":{"Base64EncodedData":"/9j/4RFxRXhpZgAATU0AKgAAAAgAEgEAAA ...","Type":"image/jpeg","Name":"DSE_4065jpg"},"extensionAttributes":null}],"tier_prices":null,"custom_attributes":[{"attribute_code":"calzuomo3848senza12","value":"147"},{"attribute_code":"colore","value":"326"},{"attribute_code":"url_key","value":"atlantic-stars-calzature-saldi-uomo-antares-bpb-63n-camoscio-nylon-f-do-sport"},{"attribute_code":"barcode","value":"20094581"},{"attribute_code":"tipoprodotto","value":"CALZATURE"},{"attribute_code":"reparto","value":"SALDI UOMO"},{"attribute_code":"brand","value":"ATLANTIC STARS"}]}}

Per il prodotto di tipo Simple, la visibility è impostata a “1” ( = non visibile individualmente) perché sarà il solo prodotto Configurable ad essere visibile nel Catalogo e nelle ricerche, mentre il prodotto simple o meglio i suoi attributi verranno mostrati nella pagina di dettaglio alla selezione della combinazione relativa.

Configurable Product e Simple Product nel back-end di Magento 2

Configurable Product e Simple Product nel back-end di Magento 2

Dettagli Simple Product con Scelta Opzioni e image swapping

Dettagli Simple Product con Scelta Opzioni e image swapping

Punto 7:

Al prodotto Configurable devono essere assegnati gli attributi e le relative option da utilizzare per le combinazioni. Assegnare tali option al prodotto di tipo Configurable corrisponde alla valorizzazione delle “Configurable Products Options” ed avviene tramite l’endpoint “/rest/V1/configurable-products/{sku}/options”, come da JSON seguente, ricavato da una request di tipo GET (rest/V1/products/:sku) per un singolo prodotto:


{"configurable_product_options":[{"id":51642,"attribute_id":"197","label":"Colore","position":0,"values":[{"value_index":322}],"product_id":6728},{"id":51643,"attribute_id":"210","label":"Ta","position":0,"values":[{"value_index":8},{"value_index":5},{"value_index":9},{"value_index":6},{"value_index":7}],"product_id":6728}]}

se non vengono assegnate queste option, al momento di legare il simple al Configurable il sistema magento solleverà l’eccezione “Configurable ”

Opzione per attributo Colore


{"option":{"attributeId":"174","label":"COLORE","position":0,"isUseDefault":true,"values":[{"valueIndex":346,"extensionAttributes":{}}],"extensionAttributes":{},"productId":0}}

Opzioni per attributo “CALZ. DONNA 34-42 CON ½”:


{"option":{"attributeId":"160","label":"CALZ. DONNA 34-42 CON ½","position":0,"isUseDefault":true,"values":[{"valueIndex":32,"extensionAttributes":{}},{"valueIndex":33,"extensionAttributes":{}},{"valueIndex":34,"extensionAttributes":{}},{"valueIndex":35,"extensionAttributes":{}},{"valueIndex":36,"extensionAttributes":{}},{"valueIndex":37,"extensionAttributes":{}}],"extensionAttributes":{},"productId":0}}

Al Configurable vengono assegnate tutte le option. Tutte le option devono essere incluse in n un unico json altrimenti viene sollevato l’errore “Something went wrong while save the option” che corrisponde alla violazione del vincolo di chiave primaria.

Selezione delle Configurable Option per generare le configurazioni del prodotto

Selezione delle Configurable Option per generare le configurazioni del prodotto

Punto 8:

Nonostante siano stati già assegnati gli attributi e le option al prodotto di tipo Simple, come da Punto 6, dove nel json sono già presenti gli attributi, è necessario assegnare le configurable option attribute anche ai Simple product, tramite l’endpoint “/rest/V1/configurable-products/{sku}/options”. Al Simple Andrà assegnato un singolo valore per ogni attributo:

Opzione per Attributo Colore


{"option":{"attributeId":"174","label":"COLORE","position":0,"isUseDefault":true,"values":[{"valueIndex":326,"extensionAttributes":{}}],"extensionAttributes":{},"productId":0}}
Attributo Colore selezionato per Prodotto Simple

Attributo Colore selezionato per Prodotto Simple

Opzione per attributo Taglia


{"option":{"attributeId":"163","label":"CALZ.UOMO 38-48 SENZA 1/2","position":0,"isUseDefault":true,"values":[{"valueIndex":150,"extensionAttributes":{}}],"extensionAttributes":{},"productId":0}}

 

Punto 9:

Ultima operazione consiste nell’associare il prodotto simple ai configurable. Tramite l’endpoint “/rest/V1/configurable-products/{sku}/child” e il json seguente di esempio:


{
  "childSku": "000042.032-36"
}
Elenco Configurazioni / Prodotti Simple Associati al prodotto Configurable

Elenco Configurazioni / Prodotti Simple Associati al prodotto Configurable

Backup e Sicurezza di un ecommerce Magento

E’ importante, prima di ogni importazioni di prodotti o altri dati, eseguire una copia di backup del database MySql di Magento, ma anche del file system (FTP) dove Magento ha i suoi file.
E’ necessario configurare MySQL per permettere connessioni remote (questo deve essere consentito dal proprio provider di hosting):
Localizzare il file di configurazione di MySQL e individuare la riga, se non esiste inserirla, specificando l’indirizzo IP dal quale è necessario connettersi:


bind-address = 192.168.0.97

Successivamente accedere a MySQL con l’utente root e eseguire il seguente script:


GRANT ALL ON <mysql db name>.* TO <utente accesso remoto>@<indirizzo ip computer remoto> IDENTIFIED BY '<password utente remoto>';

Per esempio:

GRANT ALL ON magento2.* TO root@192.168.0.200 IDENTIFIED BY 'mypswd';

 

Per eseguire le procedure di backup di un ecommerce Magento, utilizzeremo in questa guida Iperius Backup, il quale può eseguire il download automatico del sito via FTP ed eseguire il backup (dump) di MySQL .

Backup di MySql con Iperius Backup

Backup di MySql con Iperius Backup

Per maggiori informazioni, consultiamo l’apposito tutorial: Backup di MySQL con Iperius

E’ fondamentale eseguire un backup completo di tutti i files di una installazione di Magento 2 CE, per fare questo si deve configurare un backup su Iperius dove gli elementi sono i file di Magento residenti sullo spazio web, raggiungibile tramite FTP:

Backup Spazio Web Ftp con Iperius Backup

Backup Spazio Web Ftp con Iperius Backup

Per maggiori informazioni, consultiamo l’apposito tutorial: Download automatico di siti web con Iperius

Clicca qui per scaricare l’ultima versione di Iperius Backup

 

Software gestionali per negozi ed e-commerce

Importare i listini dei prodotti dentro un e-commerce è una operazione di grande importanza se vista nel contesto di un software gestionale per negozi. Infatti, uno dei migliori modi per ampliare la propria offerta e la propria clientela è quello di vendere i propri prodotti anche attraverso un e-commerce Magento. Negozi e aziende incontrano spesso delle difficoltà ad integrare il proprio software gestionale con una strategia e-commerce efficace. Per questo esistono delle soluzioni complete che consentono di importare automaticamente i listini dei prodotti dentro un e-commerce Magento, come ad esempio il software gestionale per negozi Etoshttps://www.etosweb.com/negozio-online/

 

(Inglese, Portoghese, Brasile)



Magento 2: Importare i prodotti tramite REST API e C#
Iperius Team
*****************************************

PLEASE NOTE: if you need technical support or have any sales or technical question, don't use comments. Instead open a TICKET here: https://support.iperius.net

*****************************************

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*****************************************

PLEASE NOTE: if you need technical support or have any sales or technical question, don't use comments. Instead open a TICKET here: https://support.iperius.net

*****************************************